|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解& A5 d4 X% C/ V4 |& r v
# [' |5 Z% _6 L3 S) L7 p本案例测试下Vuex的使用,创建一个新的web项目, ]0 Z2 u0 S7 w
Vue init webpack web
, Q" f. n; _4 p安装vuex
8 f" ~* [; g9 [" D, P Rnpm install vuex --save
) `, n1 t# W2 ~/ q* @9 ^$ w ~启动, npm run dev,打开localhost:8080 即可
! J( E) \; ^% ~4 b% J& p# _# _
! d" P7 \2 T5 Y6 n# Q/ l( Y3 g( K# }* w- J, I4 C; d
(1)引入vuex$ z- g- K1 n. l n3 D& R2 k
创建一个src/store文件夹,创建index.js , 引入并导出store" I; G( F- \7 D3 p) R! M2 [) U
import Vue from 'vue'
& K7 r/ |5 \ H' b; Jimport Vuex from 'vuex'2 a* U4 r3 s/ d2 X" Y$ m
Vue.use(Vuex);
: g2 t I# \& e. B; k- L1 w% a% Dconst store = new Vuex.Store({ T( @5 _( ^3 l
})- B. H, I. A5 Z- |/ U# M$ G
export default store;/ d* s3 {! ]& I& K1 T) ?) J. t) ~
, }7 C5 j' s0 n' K' q
(2)引入store到main.js5 E* Q( w* b Q
import Vue from 'vue'
9 X" Q5 _: M6 e6 _6 c. G" Uimport App from './App'
+ A" f3 H0 z5 w; limport store from './store'* O3 Q$ w/ a* N& [0 W# b" Z
1 s$ | A8 @" b, Z0 fVue.config.productionTip = false
9 B$ `- O0 e K( S. V1 S, q( }' p2 W! H. y
/* eslint-disable no-new */
9 w/ S: r+ s9 f7 v( Q) Y3 r ynew Vue({. u& i% Q8 \) ]* M' i
el: '#app',
" {( A/ P; q- V8 ]& r) { store,) I. e. p H3 i+ ^1 g6 P _
components: { App },
4 y z. v t9 ?4 s7 t template: '<App/>'5 B1 _1 A$ X, R. \8 l
})) t( U7 s h, E1 L# j% g4 h# I( k
* S9 \$ Z: E* T- w1 l! p7 V
0 ~3 y! Z* T) V0 K9 f: z: ^1 }; `) i0 z$ ]
(3) 修改 helloword.vue ,先使用state获取值进行测试
( [) q. s# T9 g2 kState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;+ ?" {+ q$ H% U% Z: b. @7 q
const store = new Vuex.Store({ J: G. v4 l3 b* P' p* i
state: {
D" j: _% I) l( Z. [1 B- I count:1& ^# X% v- Z4 _# L
}( G6 H Z8 K: `, |
})& k U3 E: X+ ?3 M
% b/ ?: x. M& ], A$ }5 }8 v
helloword.vue----
( `( V2 T8 F& t/ f<template>
$ D9 u; C" ] b9 d <div class="hello">
% E4 N$ p2 H) G
" E( m4 L4 V- o/ o) u: y2 k$ {7 K <h2>{{this.$store.state.count}}</h2>5 e: @3 ?9 |: J9 C0 @4 {
# j9 X5 f" i( {* d ^! M7 Y
</div>2 h2 q; a2 g' t& Y i/ t
</template>
% r+ T) X; p4 j$ Q* O# M6 n8 {0 x* o$ ~
% S, E% j, {' ~/ C8 {1 o7 q
显示结果为: 1 # N0 f Q, z8 z E" `7 w) T+ q
1 Z# q- a' F5 c9 \% {, u3 `* J9 Z- v, _/ `3 l/ e6 W
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:4 X( Q" i+ Q$ \ Z I
9 ?3 Y+ e1 |4 x& m$ v& g$ S. aconst store = new Vuex.Store({
3 z% e4 N3 B6 U, T/ G# `8 H state: {6 N. {/ g/ Q& f: f7 F0 P
count:1
& ~4 [" W9 G. c: v },
) a6 A* I+ h9 H* e getters:{$ h3 f( x5 K2 h' q# B4 ~
getStateCount:state=>{# a" a6 S2 r( c! M$ Q
return state.count + 1;
/ @% s0 c9 e% K, u. ^ y7 m }/ X& \3 A( s" s
}
3 \% p3 e1 Y {})
5 P# N* L* n4 N! A6 [3 \4 }( S
1 I8 ~0 A) |3 q# s& Q<template>
$ I- \: w* O" u <div class="hello">
0 B6 k7 w* c1 v `9 P8 D9 W
3 Q" H I* D9 t2 ? <h2>StateValue: {{this.$store.state.count}}</h2>
0 C. t0 I' g% j( n <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>6 D) L! U& I3 W9 l
</div>
" g: H% h0 Q5 ~& O" M</template>% |0 g% a H; G
% Y9 t& Y) \ k4 r5 G& x
8 g0 _/ R2 n! x) [显示结果:
' R1 y8 _6 j9 ?1 p* @- DStateValue: 1GettesVaule: 2
& D0 t! ~4 a; E3 D5 k, s7 x8 D' f9 G* |: S: I6 }
(5)
}! p& Q* U8 X/ D% S& DMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: . h, D! Q2 B* O* s
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:) D9 ]4 u# C8 f' o3 u
mutations:{' L/ y2 o4 G+ t
add(state){
$ V/ ]3 n% l( n state.count = state.count + 1;
8 i- t& T; W. R9 n },( r) b5 l5 }5 q& h3 w
reduce(state){
" q3 U+ t3 h4 m* F( @3 G3 ^" [; t state.count = state.count - 1;, D7 i" V9 g4 R/ u
}
7 @, j$ }, O; M4 T! ? } ]/ @' e4 A6 u. T
<template>
- Q+ ~' H7 q/ {$ Y9 m8 z5 Z4 C5 P. t, Q <div class="hello">: U" c, e9 T9 l" F* Y, F
<h1>Actions:</h1>/ G% q" ?- o* w! {8 K
<el-button type="primary" @click="addFunc()">Add</el-button>( j& q/ P" i k8 q
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>) s1 n/ \+ z8 R& \3 s; [5 G
<h2>StateValue: {{this.$store.state.count}}</h2>
* F [ C: D! B2 e, ?1 H <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
, d; G3 S8 r, J) x </div> P$ M8 C) H8 B
</template>
8 B& r; ^5 j# t7 W2 `' _+ m6 R1 ~! z
( x4 ^+ M( A; z" x5 V, F2 ?
结果: H! `5 I$ k# B( ]6 T
- u$ z0 V: H# E9 I& l: f0 x* ?: b4 L7 i- o- c" c5 k0 s5 s5 ?
Actions:Add ReduceStateValue: 5GettesVaule: 6' n* _2 r+ C9 G7 w+ i7 ~5 W
0 N0 ^3 c7 Q$ N) m, j- r4 J# C) a* B9 o2 R8 {" L
9 K( ]: E5 i2 Y3 P) [$ @# X! R
1 y( b1 u4 N% p* k" D0 b4 Q0 u( i, R7 f: V; S
! t; W: b+ c4 g! g
/ _7 U9 S: z1 r7 C8 s; g/ Y1 X6 Q/ x+ g2 t+ Y7 I4 s
(6)Actions:/ z6 G. R1 H! M& `
我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数: 4 V$ U4 x) ?" u5 e* P- k
# E" o8 y7 ?6 Rmutations:{0 I9 f/ R- j8 i, `, Q/ Z3 x; G: S
add(state){" p# w. J9 _( ]0 J; c
state.count = state.count + 1;: j F, b8 c0 ^/ |
},
7 {- ^$ O& m' M reduce(state){5 x5 E* O, P# ~- q
state.count = state.count - 1;3 ?0 o. {) M& p8 l& M9 M
}
* H2 q5 ^: d: g7 C% Y2 F },
0 f5 `! S4 P# [* k& _ actions:{
' T3 l+ e8 M ?; T& b addFunc(context){
7 b! [+ M8 ?& M; u' y context.commit("add");& G# t' e6 C; i; N4 @+ E
},
4 w9 \2 H0 o; X F: ]( B reduceFunc(context){
% ?+ K2 u. G" U- A context.commit("reduce");
; X6 R- l/ h- ?. @# G* H- u }
; q/ |$ a/ o c: d, Q) P" | }
! O7 Y& y6 v3 j4 {" \9 f+ c
& ~7 J! q' z& {4 t+ t2 Q7 ]) p" H% O/ I) B& U4 g4 ^5 ^+ ]. N
. L8 N# i0 _+ Q' l+ K methods:{* F% a: A" f! e% ^
addFunc(){
) a+ w$ G/ S5 M$ B7 c( C //this.$store.commit("add");
4 U( h7 K8 x3 ~ this.$store.dispaTCh("addFunc"); z7 W% l6 p( O1 T$ f
},' ]- X A/ E2 {- Y$ P/ s8 x$ A
reduceFunc(){
/ M1 k2 h' t1 x2 v' o% A; ]' C! ? //this.$store.commit("reduce");
+ ~$ }9 U, a4 I this.$store.dispatch("reduceFunc");
/ A# E* e6 x# z3 O }
8 ~6 m! q8 y9 n. k }9 R( F* [8 J5 w, n1 A) A0 @3 L/ y
2 J: Q# d* [( Q# L0 y- [ }$ @( U这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
" l# y: w. [3 @; e" T实现效果一样!!!!$ U5 Y2 H+ e% l: r! A1 v
. M$ t% ^# ^$ J- g" x+ X$ s
) o1 B6 l r- a6 i0 B' y
. Y0 U- {4 Z5 l! T2 f
, v4 l' L# g; l4 i* W& w, W d6 G) e
6 v) _0 l1 v* @) `
% y0 k7 k9 } T K2 ~ Q. Q2 P
/ `+ ~1 m4 r9 u9 s3 c4 {* n
4 \' b! f5 `3 M! S% x) V1 Z6 {% P+ V2 z+ M8 L! y6 h
1 ?+ s# i2 `/ Q. Z* J: m
9 b( K8 |) ?! I4 n
* q8 r. V: G3 l) C
+ M& k' v7 C* g" O% V
! h8 t) w: X9 z( b3 `; C* m3 @- l( e" y _ h% i( X- W! F' [$ I% f
|
|