|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解
" N2 a& o- [: L( V: w ]" X( j8 S8 s/ Z+ {1 Z' o8 z9 O
本案例测试下Vuex的使用,创建一个新的web项目
) p9 u* j/ `' \' n6 tVue init webpack web' n' b7 l+ A7 y9 Z
安装vuex
9 L2 y/ R% C& f8 ]& Ynpm install vuex --save5 ~- c" j' a1 T- Z. m1 m: n
启动, npm run dev,打开localhost:8080 即可0 `, W7 K" D1 s% v8 H+ q$ x
( g9 O% T( I* B' R: w U8 u
( O+ m% v Z. A
(1)引入vuex! \$ C8 I! D: X: z9 ^3 J
创建一个src/store文件夹,创建index.js , 引入并导出store
( @( F9 l- ^1 O- dimport Vue from 'vue'
! ^" E' U z. Fimport Vuex from 'vuex'+ \ z9 [7 Y, k
Vue.use(Vuex);" L; r/ A( z: z2 a4 o, Y* y
const store = new Vuex.Store({# f, l7 K1 J5 I& r" _- c
}); u# j% b; S: ?6 k5 z- R/ I( f& i
export default store;8 A# A6 {; u3 X) V; M2 ^/ j0 x
* V. X+ c' A+ J+ A! l) Y" T(2)引入store到main.js
# Y* y8 H0 v9 timport Vue from 'vue'3 f, `- b3 r. U- ^
import App from './App'
) W) m( g6 ~ \1 bimport store from './store'- X6 g2 T2 o# a/ {7 X
3 ^8 p) C6 S& w6 KVue.config.productionTip = false9 G; G/ [# M( f) \' O9 {/ f
2 i/ \, i* i8 W% `; h( U O
/* eslint-disable no-new */
* T1 k s( v; U fnew Vue({
' O% g+ o$ O8 m% R$ O" l9 b5 O el: '#app',% E. [$ I; i1 m# w7 V2 r/ ~& _ D) q
store,
0 H& W3 R/ l, X" u0 F) X( h components: { App },& }; z. z- M$ `! d
template: '<App/>'# M+ ~% ~9 X3 ~
})6 D5 A2 e, M, @5 w$ j: n
D5 G0 b) O2 r6 B, b9 s" M: {6 g! S+ w7 k$ u# i7 E& d8 H
1 Y" W; o* T9 Q& ?(3) 修改 helloword.vue ,先使用state获取值进行测试( |/ ?" `% f$ Q- i( _; d
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;0 w) l; X3 i A, N" {) `+ o
const store = new Vuex.Store({1 i/ L) o0 ^( M+ _# |5 l
state: {8 R& D$ }3 O9 t0 g
count:1 Q6 n" L0 k- [+ t6 B0 @) J
}
: ]! e8 a/ ?; k& B})0 V& g- _2 ~$ y$ {" o
0 ]: U% n; I5 khelloword.vue----
0 f& f' J; i$ q! c6 W+ G<template>
6 {6 r; }2 y: ^& X H/ I/ v# K <div class="hello">7 y9 a- m& s+ u2 I2 [) E, f
. H! {' H) H; o8 y
<h2>{{this.$store.state.count}}</h2>
; H) j7 p4 J/ D: ], ^# p" y q9 Q8 |" }% p+ E
</div>
2 u* X D4 n5 V8 [+ i4 u$ ^4 f</template>
$ [# _9 e& l& s# [4 X3 M! i2 L2 l
: J/ w. U- J* q' {* s/ B1 j# \+ a
& a# |7 U$ m, ?# w) Y& Z: p: u+ o- U' v显示结果为: 1
% K0 ?- L) Z; o, r W3 U- y0 M% s9 A+ ?. D. d
+ y7 F& x) b" l# j) D# ?6 E
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
6 H; A6 F: |+ U% J" b5 w! S& y0 n
+ w* s& c! H- {5 n& S& oconst store = new Vuex.Store({" c5 k9 ~* S7 a; q# f! p
state: {
1 o7 E9 J+ `: D count:1; u6 d) j D% ?* }) X
},
. h G9 ?. j6 |5 U6 Q1 n getters:{$ R' i: K3 @2 m
getStateCount:state=>{# {+ |5 u+ Q# e" W$ h: d
return state.count + 1;- N b) B7 c( O% A: k
}
* ~( c8 K; N! u }* l9 a q6 Z5 ~" Y! Z0 c; K
})
U t z% w O9 ]4 Z8 P5 l R8 f$ p3 [( v1 B
<template>
0 v) [* ^. n9 U3 E1 n5 G+ e9 p3 w <div class="hello">
! S, l* I% `4 i$ f/ z: ]0 j8 G! |6 ?) H5 ~
<h2>StateValue: {{this.$store.state.count}}</h2>. S. Y4 J- m+ n' D$ S. D
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
4 w7 ^0 n( ]9 {% T </div>% U- l4 }& H4 H" @' }) ~
</template>
3 r& y/ X0 F7 f2 r3 @' u5 ]
R- e5 F z5 e, n1 n
2 s9 F: w! ]9 i) Q显示结果:% ^1 [: u6 Y/ c) r' ~, s3 Q* ^' e
StateValue: 1GettesVaule: 22 [) m0 u3 f) `
! d7 q) s$ ~1 W" {! x: C
(5)
4 ?/ K* j: X) o( [+ Y9 h! eMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: + Y {) D. M, |% r
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
& k' q/ V& _& @mutations:{
9 d2 O# K, N* N j2 o add(state){
) a8 ~2 d' T) T* x- y3 |# }$ g state.count = state.count + 1;
3 v$ B6 R: u. @, f1 Z. r },
# F# M: T' @! I* g reduce(state){! R+ |: b' r* U8 }/ k8 Q
state.count = state.count - 1;4 i7 O& w( j; ~
}
. K3 [! k4 O$ L' a }
, }" o& Y+ ^% g8 A<template>
* g, _3 l2 u. \/ l9 L9 u7 R; M <div class="hello">
: Z1 ^ P0 Z. ]3 s9 N <h1>Actions:</h1>& h- |' _' l1 l9 O
<el-button type="primary" @click="addFunc()">Add</el-button>
( C( O: ?$ V4 c! X4 J8 l. l4 g <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>+ b3 D5 T2 j4 R1 ?7 q* `
<h2>StateValue: {{this.$store.state.count}}</h2>
8 J* X+ ~, j8 l. ~) ^( h <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>6 j5 s4 }# W6 l2 O. i
</div>/ N: s% S9 o* c# t7 b
</template>
- o" G h0 k, G0 l
; g6 o% @4 K5 }/ M9 Q4 g" w6 S" }5 p9 N! ]7 F9 i
结果:* S: |2 Z! [( f+ N- w6 `, z$ ]
$ D" e2 s5 N6 f z r6 w
9 C+ d& Y2 B, g6 SActions:Add ReduceStateValue: 5GettesVaule: 6
4 X1 c: H+ r2 F; f$ w
5 o- v5 M: U, z% K* w
8 E" F7 |, u ^' O( \: x( K' ]4 z2 m m
6 n" q9 R- E! |3 e& `* f! }0 K( ]) ]4 a& Z% M3 B
" C% Y2 ~, y5 J: m' a
! z& i( x# y' |# d2 Y& l9 I3 u t! b; \5 [6 h$ t8 ~2 u
(6)Actions:2 P- Y4 @$ O) Z. b0 c% A
我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
/ ^1 B- c+ c1 o5 I2 f
( c$ \) y+ G9 A9 @0 e6 T( d" zmutations:{
0 Y9 s# s y* [! B4 R' [ add(state){
0 p) n$ H1 E7 z8 b6 f% u state.count = state.count + 1;. f2 t! b1 Y. d( g
},+ f6 i0 ^: d9 C! r4 G. {6 _0 y
reduce(state){& G; A/ C$ s+ `0 N
state.count = state.count - 1;" |6 `8 O$ U$ `/ m6 m2 `
}* }9 S) k, t! m
},
% k8 i* @/ n; U2 u) S: o: f5 g actions:{. T" m* e$ Y8 D/ C# ~3 T$ s8 a, Q
addFunc(context){
! n7 s" G8 U+ @: K context.commit("add");: v3 E. ~8 z% }! y
},1 T9 g% E$ v4 Y7 W& Q
reduceFunc(context){
5 B& f% m$ a- U/ d context.commit("reduce");( ~; |. v- h% n! Z7 c1 ]
}
2 F* F" \( Z9 D* I8 [ }& q% g2 a; t3 j0 i4 V; H+ D+ m
- w7 ]& Y; E3 T8 R7 j
@$ c/ y4 o7 c' p4 S" D/ ]1 J( D
O. d( u+ ]7 z# e8 {5 ^0 A; S6 A methods:{7 d# J& L2 f: H4 o J$ d# c
addFunc(){& L% U5 c1 X1 h( j; U; @
//this.$store.commit("add");
% Y) I4 M- M% k/ w6 } this.$store.dispaTCh("addFunc");' d# D8 p- W+ `/ w, D. V: W; ^
},$ m6 S. ]( ?7 N0 G2 l0 _- |
reduceFunc(){
# Y) a, m' o M/ o2 i% v6 f; q //this.$store.commit("reduce");1 {5 K6 ~+ B, s. i( P
this.$store.dispatch("reduceFunc");7 M4 O }/ [* u4 Z4 u
}
- K" N$ r K6 P }; Z$ U( t9 }8 {& _! d
2 M0 J5 a" y- x这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的, l2 v2 I3 v" g2 o1 }+ F+ n) B
实现效果一样!!!!
8 r9 h, J+ a8 V2 L, W8 ?4 N0 P, |9 I9 F
8 p+ M( z" E |: G4 T
3 X9 u& @/ V6 P0 i( ^
' M% e% a9 Y- F2 Y4 _' c
P$ G1 T: ]! d% S ?5 f3 z 9 Y) ]8 Q2 R. I- g" Z( ]
. T( O9 F4 K B/ W/ F
P/ m/ _! ]& a3 X9 r9 c- J1 y
5 ^ K& b+ g& O* g; f! L9 Z, L) d b
/ X% f& N1 Z3 {5 Q& [7 @. b
( ^% K6 h: A$ a$ i2 E d) ~
6 G. z" e" j, {1 h
1 e9 T1 Q6 G3 Z, B: l# U$ n8 |: U" [$ g \8 d, `2 r( p
. l J# Q4 b( k/ H, X |
|