|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解& c5 p3 s# M$ ^6 S, z8 b: ]$ z" p
9 X: D6 q$ E! o2 A; _ m
本案例测试下Vuex的使用,创建一个新的web项目' a- c6 j8 w8 x; {) p3 d
Vue init webpack web
( E1 X- z4 B' l0 N$ [) \% F* B6 e' H安装vuex. T- h$ L4 s# |& t; m( B
npm install vuex --save
) \8 L V A. ]启动, npm run dev,打开localhost:8080 即可
9 }( J, t0 ?8 w% \6 c" A/ h
( ]6 `% d( }# j, j0 a. X' f5 m4 T
8 k, n$ W/ h, t, H( _9 f( T- V+ ?(1)引入vuex
* ~8 ^+ F; J( x$ n: N2 e创建一个src/store文件夹,创建index.js , 引入并导出store
6 E/ ]) n, x a9 j, I( ?' Uimport Vue from 'vue'' i9 S- i# W4 O1 B* }- C. i8 N
import Vuex from 'vuex'
& d( n6 u2 C0 B$ R& d; ?Vue.use(Vuex);' o2 u5 a) I* G6 E9 h } S% f; w
const store = new Vuex.Store({
' U5 T, b. f# S" a' p+ h) D5 J% i})
0 d' \# c J$ k( wexport default store;$ z! ?4 z$ d* l$ V
7 ]; f. |+ O3 ^/ W(2)引入store到main.js
7 m- c4 T3 t+ Wimport Vue from 'vue'+ g. V9 A+ z' Y8 n j# n
import App from './App'
3 S, D: C2 D5 T0 Pimport store from './store'. k! u" Z8 t8 V0 {: z7 ?. o
* |1 C* Z/ r" n s
Vue.config.productionTip = false
, x3 ]! q. h& t. A. v2 A
/ T2 f, }+ |8 Q D+ ?/* eslint-disable no-new */
* n* L O) g6 ?9 {- z. U2 P2 A' Inew Vue({% Z2 t* w9 J$ L4 |4 S5 s. R: D
el: '#app',$ x) i1 Y8 K; s! a8 R" l
store,' Z0 g, [0 Y( I% X8 J
components: { App },, w3 p2 n1 X7 U- _6 m' M( t8 I/ `
template: '<App/>'% l9 D( x" K8 a8 x- P; L1 p
})
' [% ?5 `) y" _9 x
9 c3 r3 _! U$ _* t" A8 n. k
; |7 _3 H0 O0 J. F
, x: }, R# a& c4 _. y- Y. t9 _4 h(3) 修改 helloword.vue ,先使用state获取值进行测试
( M! Y' ]2 s, m1 y2 `! j7 ZState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
: O3 x" |! G4 Aconst store = new Vuex.Store({
) Z' H1 v- ?* n! H5 j state: {6 e( ^6 b8 j6 Q, J9 [
count:1" X# Z! B1 v8 ?1 m7 ?
}
( q, ]1 F/ n; D7 `" [})
8 c6 e2 T& D( S5 C
0 r* t m, @: J2 u; | I- i+ i3 Khelloword.vue----( [( `$ y( ]; p
<template>
" b. \# O5 u' ] D <div class="hello">" w* k" ]3 a- O% R
1 R% v9 g1 _1 B; M6 `( `8 S4 x <h2>{{this.$store.state.count}}</h2>2 {# j. y# E* L; [; c
4 g! |. w! _2 D2 t* C6 l' l+ n </div>; X8 `) I7 \4 U, E7 y s
</template>
( w! M' e9 o9 N9 ^/ V
& m; j# d& r) r( i3 f: M5 B6 _% o& D
显示结果为: 1 H9 }# }! T8 D# E( A
5 a, l# H. |4 V" Z0 V8 G! B h6 h/ H. j
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
! p2 d4 p# |: n! v; V% q3 M" F, p2 D' C; r9 a* c% p" b% m
const store = new Vuex.Store({; I& U; E' p2 E' [
state: {, c" S8 @% ?0 M0 |; _. s9 Z
count:1
8 H1 z8 F: m7 G },
8 e/ E7 n5 s+ P4 f getters:{
% G$ G. K4 f: F0 x getStateCount:state=>{
7 q% ]/ V d9 I# t return state.count + 1;
" i1 g+ z8 a- z1 s9 m \" D- Y" e }2 ]0 l: H n0 g) l, u- }' X
}! Q8 Y* [, k% |
})8 R3 ]$ C$ u3 O6 u- ~$ L
2 _$ t2 b3 i+ @<template>
9 T3 b, Q8 {+ `% r. S; w+ S <div class="hello">
$ v8 n- G1 q; Q' y- s% X7 m- ]8 o6 D% ]: z+ o d4 Y- x; |/ L
<h2>StateValue: {{this.$store.state.count}}</h2>$ D4 b5 U4 D }+ B q1 C0 Y
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>8 c& `! Q/ N% o5 w6 a
</div># F" S T$ S/ \ k7 k
</template>
& s* P o) r# O4 N5 @, q9 B% u7 Y" K7 b
4 Y# J) T7 |: S+ R8 m, a显示结果:
8 h; a: F# ]) E9 [# x; w" ~$ @1 |StateValue: 1GettesVaule: 2$ `. {9 w1 \; {( g* o8 Q
% x9 P8 t$ L7 H) }/ @1 S(5)
# F) X* o9 ~- I3 j" IMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: 1 d& _7 j2 \5 T% {. O' a4 ]6 D
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
- @# l( j) u- Q+ lmutations:{* p$ K: g n. i9 v! D9 z
add(state){( ] {0 b3 o0 k2 F8 k% F# t7 H
state.count = state.count + 1;
# h4 _( c9 s9 U },& o& m& N/ t8 a4 u6 I. }* z
reduce(state){% K) k1 c6 k- C1 P
state.count = state.count - 1;7 f! ]4 Y! ^6 w9 _7 X: i. L) v' a$ _. x
}
2 s3 p ]4 c3 g: i6 A }$ i }' Z4 X7 U& Y$ c8 C4 P- O
<template>& r. x/ J- I' Q
<div class="hello">3 M8 `" M5 g3 q6 y$ F
<h1>Actions:</h1>- `$ n! O B% o
<el-button type="primary" @click="addFunc()">Add</el-button>6 {+ f1 S* ]8 s4 A- l9 y4 g5 s' e8 O
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>* n- b% f) ? j- X/ u) a
<h2>StateValue: {{this.$store.state.count}}</h2>1 p% F/ t( Q+ j$ V# b/ t
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>1 u" T% }* J4 f- z2 v
</div>% v& n& C: l* _3 M+ }9 m0 p
</template>
# ]( x9 W- P$ d J3 v
! C4 f( O/ ?; A% o6 a: Y' h- K ~: v# d1 J' x" j9 h/ ~
结果:
) z( t0 k8 p) n2 ?: T8 U( h( ]; C W& U
% ?* @0 n. ~3 h: v hActions:Add ReduceStateValue: 5GettesVaule: 66 F. D' q U8 y! v
$ Z; P1 q+ D: p
0 `& m& q" m8 @0 Y" x& T+ K
4 u# E7 N2 X* U! x1 q
8 G) N: t: X1 Q5 i2 W7 x6 f; G5 X5 h1 w9 A) s* S" t" v
, ^- [ o2 o. t9 @; c1 X/ }: w
n5 Z+ M, F0 l9 F, F: M(6)Actions:
! s2 o' d1 L. p9 R我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数: 9 a; p; \, U% s: [
: }; }# Y" j3 H5 F+ w' D- S0 w" ~
mutations:{
- J1 F0 i* E5 `. f9 N/ {4 I* z add(state){# K3 D% O$ ~3 ~* t1 P( T& N$ k
state.count = state.count + 1;
$ S9 e V' P( ?) Z$ F; ]. Z8 W },
4 r% V& Q5 V8 w' R# B& t. p reduce(state){& M! |, y" K8 e4 j7 }& F
state.count = state.count - 1;
) i+ A* A7 \& e }& G. _3 D# v( E# V
},
1 O1 j* s: H- S) D& G2 G/ P5 l actions:{
. `; q3 }7 Y% \1 M K4 | addFunc(context){6 D. P- F, Z4 e# J9 Z/ K! u$ i
context.commit("add");! x' x/ Q0 Y0 y0 ?
},
( G% C* q+ n" Q8 ?+ y+ I( R- y reduceFunc(context){
, c* O1 k% E% n6 B J context.commit("reduce");0 l' n+ `* d- e/ ?& M) e, V
}
& i. H$ k- p' q }' ~3 }7 I- D ]0 _5 i
' W4 {" D% \/ v' [- x( S: W6 d
( E5 E D& b, G3 Y8 O, b8 H& u' T
4 S3 V+ a( x. P( i8 D6 r methods:{
9 L- C2 n. p/ |- h1 c addFunc(){
# d# A9 G7 c9 ?3 C7 j q* W5 S //this.$store.commit("add");
( c0 X: z; @9 L* U- b% i this.$store.dispaTCh("addFunc");; @! z% g( s; B+ E ~
},6 o- Q% c& [( I' t8 M% n; h$ Y
reduceFunc(){7 k3 k- N; n ^" \
//this.$store.commit("reduce");4 U4 c% N6 R9 N7 g/ s2 q
this.$store.dispatch("reduceFunc");, ]& f! w/ w& C: Q2 @: m
}4 f+ q; T- I$ l4 \1 `
}
, m$ K% Y4 { A7 g6 {
7 ~: B$ L4 s" ?7 G. K+ G# n这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
W) v, k' v# e* b. O实现效果一样!!!!
) s3 L, S4 K/ `+ x0 |4 f" ]/ p; h ~2 q8 }# v1 o! I1 D& A
3 ]+ J C. i0 R; @. A
2 z* I, P. O" t7 k ^. B6 J# H
1 i* Q( t X: j# p
" ]5 }, ^ Z7 B7 t( K) X8 Y# N 4 F% r" ^. p/ S" K
2 @0 i- \8 x, G y; \; f8 M
4 f. U# l) u" F/ j0 u7 e
* r1 `+ s+ Y* L3 `# p9 ?
- ^) {7 A- ]3 w1 Z
! \2 b0 J# F( [2 p; K# s4 ]! `/ a9 w
/ A' K6 L# h0 L. u1 N4 @6 U: `
0 h4 O. m G2 v$ S+ U0 y3 }. _* q
$ v# i B: V" U' F& Q! ?9 Z9 S4 h) I7 o' t* \/ z! C/ n
9 @( D) M( T( e, {) M7 @% q* s |
|