|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解
! ?8 A2 O! f! S8 F. A& M _0 p$ K% L: n- {0 L/ t
本案例测试下Vuex的使用,创建一个新的web项目8 ]. X% g: ~0 J g- K3 D6 K
Vue init webpack web
; f3 ]) Q5 ?& A* q/ u' ?安装vuex
. n; f7 v5 b' f3 Vnpm install vuex --save
% t7 w) G0 ^* A# C2 @, ^启动, npm run dev,打开localhost:8080 即可5 ^& Y* H0 _' l/ a" E6 m% Q
9 G* G/ ~) A3 Q& F9 M0 n
5 @3 v% U# ~+ Z% }& d* B(1)引入vuex- L8 p( R7 H: ]$ H) |* H) V
创建一个src/store文件夹,创建index.js , 引入并导出store
7 A% A+ I5 \. k- yimport Vue from 'vue'
5 H- g2 K" T, g( K* [& Fimport Vuex from 'vuex'
5 c! c& m7 [# O% tVue.use(Vuex);
; T( z! s" \" V0 T) m' Zconst store = new Vuex.Store({
* L3 e l8 a+ u6 U: d! n$ N; L) d3 Q})( w( y1 \. U2 y- E* T7 ?9 S
export default store;
+ Y1 [( |7 |% D/ |9 I7 k) K$ T( x( N
(2)引入store到main.js# p. k( B5 u; Q. j
import Vue from 'vue'& T% G# b- ^0 C y9 h
import App from './App'
2 B' _# Q6 ?! d% E: b v1 h. jimport store from './store'
/ K0 Z1 r$ L1 J2 M ^- L, V; b$ Y; g% t( }" @+ |( N5 T
Vue.config.productionTip = false: f3 \' [' M7 n, M" D
' F3 x8 q, @& P7 u: k; a+ h% p/* eslint-disable no-new */
9 \! M0 x2 o0 ]; ynew Vue({
1 t2 t; q* q- @7 y& H el: '#app',
" Z) F$ I6 L1 S. d ?- I: B6 F5 m store,
. K2 V7 ~" O% G* k9 k components: { App },: C! q. l' r7 [' K E7 w
template: '<App/>'- G: Q- _9 ]8 o% ^ d \' b2 _& `8 C, v
})8 r% E; c/ D& x) g9 D
- @, l: O6 c; v0 _) S/ y; Y% h
; R* V/ e5 G: Y8 c6 z3 @
6 Z' U% y; V/ ~$ C- B0 i% Y
(3) 修改 helloword.vue ,先使用state获取值进行测试6 H) Z0 [7 d2 [1 h& T9 G
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;6 e/ E( ?" `4 i, B
const store = new Vuex.Store({9 C! j% Q1 Q$ I; x+ l$ @/ T
state: {8 x6 }9 J# h/ x2 T+ t/ k4 }3 n
count:14 p& o" `3 y$ `6 G+ |
}. J2 |5 a& O9 i/ ?1 z6 K
})
8 g2 C! Q9 Y! Z# d! Y* j H/ K# }9 K( X- h" U6 W) S6 X
helloword.vue----
. m* H; L" F9 B<template>6 {" ^" Z, N2 C& l
<div class="hello">9 w. q' n& x1 }/ y$ {
) Y9 J+ i/ a6 o3 q$ C, g2 J* s <h2>{{this.$store.state.count}}</h2>% \* I1 b6 g8 V+ }; n- O' G
7 s& w2 ~) K$ O1 g7 H8 S </div>
! J$ _4 |" }: C& s" ~3 [% H+ c</template>* Y8 R% D% E* K! X" E
* G/ v9 I K9 `, `+ b# X
( `7 D& u4 R) P1 a- I显示结果为: 1
2 Y' D& l% [0 O7 t( A4 E: g! c. Q+ [7 O( ~
! ]) x1 v0 d, b) X x
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:. W8 Z- I) r$ W* e6 M* Y% G
8 j9 a. M' B2 K8 k" ]const store = new Vuex.Store({
2 Q# O2 V$ |/ |4 y, K% t state: {* U6 E) Z2 X$ Z7 N; R. X
count:1) d, |5 w) X( ]9 z
},5 n5 s0 H% [8 y5 |7 e; J
getters:{& ?! x# s3 \8 W6 ?4 a1 ?/ r
getStateCount:state=>{
3 C- `/ ^& N2 X* p0 H+ p/ X return state.count + 1;) `9 K6 z) N2 O- j6 ^, `
}+ p$ O% V, h7 r% o. w; n
}
. ~$ i' n% ~- s+ q})6 h1 v" B+ |# Q N7 ~7 F% D9 I1 E
3 [& f. q1 s; |; q6 J7 ]* V
<template>, @/ |3 [! {0 N% ?! ?2 t/ Z9 r
<div class="hello">
5 i2 M6 y- t+ m5 K. V/ R" B" V% E; Q7 t- U8 g8 Y" L7 _# ~. S
<h2>StateValue: {{this.$store.state.count}}</h2>
% X2 v( Z' s5 ~8 S8 { <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
' G9 s0 Z& T$ E% ~' Q$ i! w+ I </div>
$ K- Z8 j! u* q4 V$ w</template>
1 T6 t: Q2 c% R Y G7 i; e" l% {' B- |, s; k; K
# x5 F( K: E6 h* T
显示结果:' x3 ^% f# C F- ~% L
StateValue: 1GettesVaule: 2
3 O0 H5 v4 K) \" ~; z' K6 g
3 l2 V% Q2 P4 ~7 t1 T' M* i6 Y* N! ]; Y1 T(5)
& k- f, X5 N8 z6 GMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:
4 ?$ s+ t, I# Q修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
& c# r! o- n" S" U$ H; K+ Fmutations:{1 }6 w$ x2 j5 { Y
add(state){
4 z0 C+ u6 Z, i ?! A0 {+ _: L state.count = state.count + 1;5 R" r9 j: B4 h) C* o
},/ l: u6 C( j+ ]! B
reduce(state){& P0 a4 p% P1 P+ k0 ^
state.count = state.count - 1;
+ F# j5 h- [9 J2 h/ X }+ K; i m2 x( U4 e9 t( I
}5 E$ u J" i1 Q
<template> O$ n b! \: }+ ~- f- T
<div class="hello">
2 i+ {+ t; N* ^9 m% o0 p/ h <h1>Actions:</h1>0 v7 y+ ~5 {! e5 s( o! Q0 S
<el-button type="primary" @click="addFunc()">Add</el-button>
1 {4 R& ~7 n$ t2 f$ W/ f <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>$ D$ ~* k8 a( @% R5 s
<h2>StateValue: {{this.$store.state.count}}</h2>
, \( f: I$ b/ h) o- i' y- c4 N <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>8 G7 j( L8 F' K2 V- c' e" V2 u. B3 r
</div>
5 g& O2 p) T( X: i+ T& g# [! i( ^2 w</template>. e% L; v2 y- v6 U& g S- B" y8 d
6 H7 u( C+ b5 k: t7 l# Y# q7 E, j5 T+ t9 I6 f: T8 d& B
结果:
' z2 u3 z' d/ ]' k- }+ C# x" {
. D1 h6 {& S5 P: X, P2 v4 ~) @9 `7 o' C1 R( ^
Actions:Add ReduceStateValue: 5GettesVaule: 6' G) ~0 `- j4 U1 H% _' b
. [, {" B0 m: u+ E8 S( U
/ v; ~$ f* ^) L: g
3 i$ e% r2 M2 g) ]9 j
' L& s* q& V( S' `( g; _& z: h, [( V5 A0 M( C
* h0 r, t M3 D% d) I! C( G
0 i8 s- P! p) y3 l, d$ H
$ B' M. c, c: j! s+ v9 y(6)Actions:
5 F8 i' Q( H. T8 T9 b$ f我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数: d' B3 Y2 t# P+ J! x0 u
( a' Z% C+ w' D- t; I% @$ lmutations:{ z: {' p7 @+ b
add(state){
5 x1 _9 J' N: S) |" E3 { state.count = state.count + 1;
0 K7 z9 u8 {* ~1 B+ a' \. S" R4 v },
8 m& k, U5 |1 G* m) x, F reduce(state){
" {8 W5 K, a2 c; G+ \! b$ Z% K! b state.count = state.count - 1;9 t7 w, J& l$ }2 V6 u
}8 v0 H- M, B0 V; d* z& G
},
; t# p2 B% y1 ` actions:{
( V) D/ A( s8 u" h addFunc(context){6 u, |! V: [2 Y, y1 R3 L
context.commit("add");
% O9 j: U- D# ~ ?. e$ s },
( ~9 ` x' d9 @& ` m. e reduceFunc(context){1 F d' j4 p, j( u ^- k& l8 w0 K
context.commit("reduce");
& {+ S' j/ N) L5 C }
4 U* L* w4 c$ A, H- ? }
O$ j$ B- J5 f9 S: Q) ?3 h8 D+ z! A& S# H4 b+ G$ R& U7 z/ d
4 A( P8 e& K! T/ j n( ^
3 y+ c+ {' M* X0 b6 |/ ~ ]
methods:{9 m% J% O* ^' K- b/ E
addFunc(){# n$ A& R Y1 B' _" O. m. [7 o
//this.$store.commit("add");
0 _. K* ]3 k+ O, q this.$store.dispaTCh("addFunc");: J" v- w6 v- d- k
},
/ F* c2 `: P# Q+ B reduceFunc(){
+ X$ B) S v: [* }) {# I //this.$store.commit("reduce");8 Y' i1 C: u z4 [& L8 A& y
this.$store.dispatch("reduceFunc");
- ^0 o8 X& M Z8 y }
! n& H& a( y) X }* N. ]! A+ E* z% y: p
. H! Q% S) W3 S o. F5 C
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的: S: u5 l6 }/ Q. V
实现效果一样!!!!! \0 o7 k( f3 M' Q1 J( q3 b/ E7 j/ J
+ r/ }- ^+ d# M" j; X( X% z
' O1 W( e, [4 }7 \- Q- [8 R k d
3 v1 N9 t+ @6 {% p. d4 T
9 ]7 @% f& f, i% w5 ^1 Z1 C3 ?
" z- L' a0 t; T* F
* }$ a+ O- X, A& e- Q) }. Z2 W
( X3 B0 d$ v: F/ v3 [/ P: V; ~
6 B; }( k I9 D* [! z& t; d. _0 }7 J
# ?6 \6 ]+ k. l( T% }" K
/ Y+ a5 w: p! Y5 \# L. C1 ~! ^1 |9 _% O1 b3 _: x2 g. ?* C
8 I7 G! i, F1 B7 P; b7 i0 y+ Q
9 Z; p. u1 K7 m, C& v8 a5 O0 G. O: I0 L. Q/ U' N s3 U
9 T" r/ J( i3 Z' ^5 W8 V
|
|