|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解& B0 {( D0 n6 T3 B7 r
1 `8 m+ q0 N4 u/ m6 K8 u2 C& P7 {
本案例测试下Vuex的使用,创建一个新的web项目
: `, W! j/ @# c1 m- g/ _Vue init webpack web) K, K: ^# F0 g0 M
安装vuex
- o$ l3 P0 k. h( H; C; r, X5 m9 {npm install vuex --save
% ^9 E+ M/ ^& q0 e5 C( ?( a, X启动, npm run dev,打开localhost:8080 即可0 W7 W0 d7 e$ }5 k8 x2 ~0 m
7 y5 O. F, z, \
2 L- A( c) c0 ^( T. ~! ~* f8 b(1)引入vuex+ M) E1 ]# t" Q" f u* R
创建一个src/store文件夹,创建index.js , 引入并导出store+ F: H" F3 ~: g' D( w
import Vue from 'vue'' G$ ~/ |. Z3 u# W7 T- a. R
import Vuex from 'vuex'
) `( B; {1 X' j6 Q2 p* ?Vue.use(Vuex);# m/ R9 W, I0 V1 P
const store = new Vuex.Store({5 Q- h0 B+ u8 D$ r$ u* K7 O
})" p3 i" E( v; X( y" P b) @
export default store;
( B! K. q" [$ Q) J1 @" {" N! L8 A+ c Z% ]) a8 W! `
(2)引入store到main.js) \8 V& r4 G7 K. ]! S8 i0 z
import Vue from 'vue'
4 n* P* B) ~+ ]& r. Cimport App from './App'
[3 a5 H9 X# K3 ^import store from './store'/ g% f; Z: F, F" P" `
, c$ m% C4 @* s- I5 n# p
Vue.config.productionTip = false
1 n- B0 @% w: ^' j% j c8 `3 e0 W6 ?# t
/* eslint-disable no-new */
1 f* m4 L- e1 m8 ]9 Q0 s% Znew Vue({
" v) u) H) y1 ]0 A el: '#app',4 [* T9 z! y0 D# {
store,7 J( b- W# _& N. l+ C0 n2 M- S! X/ r
components: { App },
1 l; f' n4 a* Q) w# b& I2 U/ Z. X x7 m template: '<App/>'
' e- @0 `' y) S7 K* G+ j})- f9 i. `+ @2 }# s* P) U$ u
3 U9 o( [+ }0 }
( X* q1 Y1 i1 q! q4 x- w( @, }2 W* U0 c
(3) 修改 helloword.vue ,先使用state获取值进行测试: L0 Y: {! S; \$ ^; r
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
n8 F/ X) f% I# }# l, Lconst store = new Vuex.Store({
: a/ j' B* D7 S: Z* U: P1 G/ I state: {6 y3 E6 ]* x2 H5 r$ V7 L
count:1
. A) y+ k/ U i8 M& U }
* t' I' T& h% N! j- j7 J3 [/ e})
# q/ T8 P1 C6 ]. P
0 q2 [; E7 T1 f" q6 [helloword.vue----1 B& a4 z7 B4 ? C# N
<template>
6 c+ V1 w0 x) n <div class="hello">
3 W) R9 _: }0 N1 l5 c" |; l$ b. O$ D4 C, R% n3 S4 `
<h2>{{this.$store.state.count}}</h2>
9 r7 H1 ~- e. c( A
6 x3 D; s* |5 K, R' L </div>
( i& Y. D( u0 x) @</template>
4 p! ~9 _$ }' R/ B4 Z- c+ w* B8 Z, H* N
& g) W/ ?5 Y% c
显示结果为: 1 . t% f( _$ R- @) R2 L( `" Y' ~( b
' U# Q( O: {8 r {
g6 n' n7 s& h8 M. j(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
I( {3 f/ ]- L, e" U
, A) M3 V$ h+ zconst store = new Vuex.Store({
/ L4 n, i" z# B Y4 V5 h state: { P3 f! j/ U' Z- L0 C
count:1. b, o0 \# O6 G, P: Q7 V
},
) m9 {5 c1 h. l! _/ I: P getters:{
" y, l. q% ]# K4 M getStateCount:state=>{
% [/ `3 R4 @! p. R. t" Z return state.count + 1;
% J% u3 a( z6 g }
! U4 p; X' G. p }/ i8 X5 ]5 Q4 p* E# M3 v, F& f
})
8 T1 g6 |& F2 n5 @2 H/ X
A1 ]9 b- d* V' s* b7 \! x<template>
; i4 v7 T, q3 a0 C# U2 | <div class="hello">- H2 I( R2 Q) j
: Z5 @! k' |' E3 B, o6 F, c; Q% R
<h2>StateValue: {{this.$store.state.count}}</h2>
0 Z2 s, f/ f3 O* W <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>7 T, g& u7 |6 y W" x' d# D
</div>6 S0 \; }2 L% Y) t2 C. E
</template>
, ^4 b) U. u$ _8 d2 M8 v) G
* R7 A! Q% ?) P3 `
0 K+ T/ g9 e. t6 n显示结果:+ m6 s1 y( M% x- V! c6 P3 g' k
StateValue: 1GettesVaule: 27 _* N2 U7 D$ g) @5 B
( D" g5 Z0 l' R" I/ c
(5)) N! z. P: T' B
Mutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: & {$ D, `* ~5 T- E; K! p Q7 G
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
: p% @1 N* y& b1 D5 L% L% Pmutations:{
9 ?; l- r+ w! W add(state){+ e: `/ C* L& G/ K& `
state.count = state.count + 1;
4 U1 N5 D- ^2 { },+ K! ~4 e6 {" @* d8 \- {
reduce(state){- n4 [# R$ ? ~) _! m8 r# ^
state.count = state.count - 1;+ f: \" t3 W2 N" \/ \* `: R
}' C- v2 O, q4 B) D& ^2 \( w3 }% }
}$ k( I9 x C R% }" ^7 N5 J3 V
<template>
- b0 F: ^& o) j) f$ i <div class="hello">7 v, a# z% _8 |( z
<h1>Actions:</h1>3 F+ ~+ _* v( i( o$ i, z0 x- x
<el-button type="primary" @click="addFunc()">Add</el-button>
3 Q2 o( J& w& `& H <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>, b5 [& Z; j2 D5 u% m. J
<h2>StateValue: {{this.$store.state.count}}</h2>
& U3 k7 l, q' f <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
0 b7 U3 N/ \7 @4 ^/ ~ </div> s) T C2 V% s8 k
</template>
* a$ P! J( S9 w1 k; v S6 f* l9 V7 M
; o7 O ~" g; J/ _0 y结果:
0 o' v# x; J/ }" i/ v+ Q; L, D% l9 d8 j5 O) C# T9 G2 I# b' D1 u4 [
8 d% i. u- x C' S/ YActions:Add ReduceStateValue: 5GettesVaule: 6 K S1 _6 o1 k; ?
, t z/ H2 p' e2 w4 G, u5 a
K$ Y# ]2 j6 p; C
' w3 C1 X+ o/ [) c* z! d
& z% o/ D' O1 Y1 B, q/ {) e" n, t! j0 `" w! x
/ @9 U1 z' T6 w: a; j$ U5 M( e/ @2 C) }1 x$ `2 P: l
, N; F+ k, u4 i, _$ \
(6)Actions:
' D! N ]9 p6 b2 X( _ t0 S9 f我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
% |- s$ z6 B+ I' B; H , ?/ p' }' B. H5 o
mutations:{
8 \8 }% |* `- r5 m0 g add(state){
D3 h" E5 s' P7 H$ K: i state.count = state.count + 1;0 K) R$ K3 p8 o% d G
},) R2 k0 d" n% {; u1 e9 p! ^5 y, n& t
reduce(state){% j% z4 L/ b& [* Y( b7 j
state.count = state.count - 1;. _/ y$ E+ c/ U
}
! h/ o: ^( n% B2 _: y! h; F( V },7 f, h" b( t: K6 }
actions:{: a- b: f0 W/ s; [0 v" b, O# T) j
addFunc(context){
+ B. f4 i( |) ]) |" p; d context.commit("add");( t: \6 o7 _: q6 Y \5 x3 R& I, a8 p
},8 W( @& W! _- P5 q: o1 C
reduceFunc(context){
8 b# s2 i/ N* B ^ a- \ context.commit("reduce");, j3 T4 r0 c0 @
}8 n! K/ ~2 P8 r: Q4 i8 p
}! m G% A- H0 r& i
- }3 \# J6 d! j' N! ^( N( |
0 ?+ I+ e: \3 }. @/ `
& M& Y* |: ~7 ]" k methods:{4 X- F) X c1 ^& S. S' m( u
addFunc(){/ b% r% W5 H: F- ~
//this.$store.commit("add");; v" x; h8 z8 J0 F, k6 P# {2 V* C9 m
this.$store.dispaTCh("addFunc");
/ I ?1 m' G* e Y' C: ]% A$ E },
" s3 y) ~7 ~; N- N; ^3 X. N/ E reduceFunc(){( r2 }6 F. B; d$ e( Z! J
//this.$store.commit("reduce");6 ]+ k" e) ~: O- {6 ^9 _4 p! [+ ^
this.$store.dispatch("reduceFunc");
- K% h- U5 D# i% R$ B }' A/ G5 T3 C9 a: }8 I! g
}1 O1 `. c# P( F) H% f
, @- l3 Q5 o9 c! p! u0 }
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的0 o! Y8 e9 I7 D1 d& V3 p$ i! p
实现效果一样!!!!+ j0 S: ?/ R9 \
' v1 J$ C# P5 E y' ~# I
7 f5 ]2 B9 Y5 L/ X! O; L8 X j
, q7 m- k' N7 `( y) L; R
' r0 K. Q- i3 j6 s: l3 b
, N ~: p4 ^7 n' d# t
0 q8 k. ~, v7 v9 M+ k9 z
y+ n( F0 }& c. V& x( V' U5 m( G8 z3 N) G1 a
. A/ |: I! X: r% @+ h5 j
8 p4 W9 w* U. M+ v
K; y; m; v: I) T% k
! t0 W" j: J! M# ~1 U9 J; v) P) G7 M: J5 B
( L& c0 D. B5 f. N9 ?8 I3 ]8 M& ?
7 J8 O! Y- L/ B! s- f1 L
" `' z& w6 C" ]2 S2 c |
|