|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解
; I+ v9 f' @: I' G7 N! u- {# c' {. @8 }5 O5 q& A- S/ r. g8 V1 b
本案例测试下Vuex的使用,创建一个新的web项目
% d+ g( D }9 M) y$ x- `Vue init webpack web2 z8 t, `# z! _' E
安装vuex8 H! O" z( \5 c7 z( h" G
npm install vuex --save
- R# H% @* h2 ?/ g$ U% V启动, npm run dev,打开localhost:8080 即可
! }5 [9 e& y$ }. x5 {% O7 H7 f! B% g/ a, b2 L
- M1 t: @8 O; t" |2 k
(1)引入vuex
- D% a/ A0 x5 c" p: }. Q* g创建一个src/store文件夹,创建index.js , 引入并导出store% | D' m3 G& @- m ~1 H* r
import Vue from 'vue'. S6 f( `8 G2 |, ]1 u
import Vuex from 'vuex'1 B# {, q. e% D8 H9 x
Vue.use(Vuex);8 y5 f; Q5 d( Y" u
const store = new Vuex.Store({
/ V6 E/ e$ E( c})
3 K4 |0 m, Z+ P8 A- Xexport default store;$ H5 `# t* w' ?0 t! B
8 C1 _, p4 u. i7 d(2)引入store到main.js% R) F. _( T: w0 H" s! B2 R
import Vue from 'vue'$ D. k/ T6 w6 y- r1 N
import App from './App'
. J" H- \# c/ e4 {0 b# Ximport store from './store'; | p1 {9 j/ x' a, a0 e7 L7 S$ p& Q
. z0 V; U, _7 o ^+ P; t3 k6 T
Vue.config.productionTip = false
4 t2 N, S. T- H# Y' J, o5 x
& k$ j" F* _5 L0 w/* eslint-disable no-new */
! [, u/ q1 ]- P; N& [new Vue({2 z7 r$ U3 n6 w; c T* m
el: '#app',
; j8 k: q5 d' L store,
' k4 A# O: i4 o* E1 f9 R components: { App },! E: h2 b7 n! T2 J& s
template: '<App/>'9 C1 X5 ]" }$ i
})
6 b7 n: ]9 S* E. @, _) z$ ^
4 v+ z2 w/ o) P# f
2 P( i; B% ?: u: H4 b! H
3 F; M+ O7 j0 e9 T" }! M. d; N+ Z4 p- g(3) 修改 helloword.vue ,先使用state获取值进行测试
4 E' e; M9 h; H+ j/ s% \State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;$ M& b/ N7 R& m8 L' X
const store = new Vuex.Store({
& l% R) k/ Z* h: z1 |3 A/ c state: {( b$ t8 o f1 z) X
count:1
/ n, l2 x2 J! m" ^6 f. l }3 c# ]0 s# Y" v& c& m# B0 G
}), K9 }# |: B/ M1 j) ~+ F$ x2 z
2 Q5 _# T( R9 K, ?/ Rhelloword.vue----
1 s6 P& [) Z& K3 Q" A$ s: B# f<template>& K w8 T: d4 L' C! P" t H
<div class="hello">
& T; W) ~/ d# z: I1 x+ M0 X$ Y* r) G1 e, ~' j& P4 Q1 J4 [
<h2>{{this.$store.state.count}}</h2>
8 L% J6 |9 \+ X4 b& M! W2 E- V+ b! F- F2 f/ t
</div>
: a* F0 x9 {. w) K+ n" o' W9 p</template>: E0 b, C& g, N8 i; n
9 F% A7 ?! E! Z0 P% S' a5 ?
7 r+ H+ U' U4 d" b" w/ j
显示结果为: 1
9 a( o! P$ G) K; V, ]: z F# ~, E" N y3 r( M3 y1 ]
7 J' y0 Y i n+ O* k
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:/ u& a- E! ]9 x. E6 M# G; f5 u
9 @9 }4 l7 R3 w1 {+ n* l Y
const store = new Vuex.Store({% j& v1 r8 z: S0 a/ |
state: {
( T d! k0 r3 {" | ~ count:1
' M+ z3 U5 n9 V" x) e },- a# p/ O# N" D, R3 |2 M
getters:{2 a9 d& L& f8 o7 k4 }
getStateCount:state=>{ Z" Y& y$ `6 t
return state.count + 1;
! _( \& D; E- @5 j/ j, F# G0 H% n }
$ [* X4 E6 Z6 ?1 o5 ^* ^- _ }( e. H E+ q) u" }1 s6 _ X( G
}); H# Q) z$ ^/ d A+ S
# e( e- }, W4 X; m- X% q<template>
+ Q& S: K) u& m <div class="hello">0 s9 e+ x, ~1 J+ W
, n5 m5 Y. _( z- A7 U0 M; A <h2>StateValue: {{this.$store.state.count}}</h2>
7 Z- y; R: v9 a ]0 v' W7 O; Y <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>+ v$ h( m: a8 X: _3 t7 h
</div>7 H! Z% @: D- X7 k5 @( @8 k/ t* D, |
</template>
2 l% @7 S, ]: |! x6 L. ~& W( |7 U% ^8 Q8 `
$ O' A% q( W% _% t; T显示结果:
/ |1 {& D2 Y/ |StateValue: 1GettesVaule: 2
_9 B; S1 J+ i% i( @* ^: L$ \5 K" l0 T3 r6 k/ g! Q" [2 i
(5)
! l$ S t2 D0 o. xMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: 9 Z5 H. z8 \* w8 {
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
0 b+ n0 M" \. x* |mutations:{* `8 @& O( ~! K' R! h X8 o
add(state){
9 {) |& y- S( c6 ~7 F: j state.count = state.count + 1;4 f' \7 c p9 A7 Y
},* d6 u9 ^: \& z( p) P5 o6 }
reduce(state){
8 N/ f; P! e: L* X& o state.count = state.count - 1;
3 o! [5 X/ g6 B, G }2 O) b- j, N. i- C/ l
}
2 @/ [0 _. f9 j" {4 L5 L<template>
/ H6 e& m: X+ c5 z* _ <div class="hello">% Q h2 L6 C& M" _* ?
<h1>Actions:</h1>, O5 T# f! n0 D5 p
<el-button type="primary" @click="addFunc()">Add</el-button>- n; B- V1 S l! L( X
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>6 R2 ?: o+ V1 b! K
<h2>StateValue: {{this.$store.state.count}}</h2>- x0 f. B6 R1 t* T. G
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2># [% o8 Q, A& l9 o: V4 M1 z
</div>* o! u: `, B! B, C! _+ K
</template>6 A5 N7 {* ^$ V) n6 I1 x
G3 ?6 T- ^1 H0 \0 W2 L4 d2 G/ O8 j& t/ q) C) S$ o
结果:' l1 I$ x, S2 b7 x: ?2 b
, S; C5 r" l9 P- l9 r
3 s* ^& p/ g r/ L, U8 RActions:Add ReduceStateValue: 5GettesVaule: 6
. S {+ ^8 W/ i; ^$ G, @8 p7 U) P$ G1 U, q
+ O9 @" N0 M( Y+ R: M1 X' N- o8 ~
! L. d6 ^" \6 }
$ ]6 B* B" ]% A; m4 s6 b/ A$ C! H+ s. S
: Y2 l" z7 y7 ?' g
2 N2 e2 B* P% g% n1 `, Q9 f
1 {4 ?/ k& o4 p, B) c(6)Actions:
: |7 `$ w4 ]% j3 [我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
0 f& p) O/ B* ]& W6 Z8 d L w( }
_; |& B6 S$ r3 Q4 w3 {mutations:{- V5 S- m% ~! p
add(state){
& F9 I7 x ^& _4 j& {+ o3 ~ state.count = state.count + 1;% N! w" e4 {9 x6 t
},! _% P7 m0 [5 _: H m- M
reduce(state){* L! J, Q- `. `. F, Z: y4 p
state.count = state.count - 1;
: S8 S- b2 }3 t3 p }+ F! U# F8 S: } v
},0 X, @8 D# V7 P, `; a6 Q
actions:{
" Y5 x6 A8 r* K; ` addFunc(context){1 V3 N: n( H8 ~2 b* ^
context.commit("add");2 _2 F: }7 z) @9 `2 O# R* q+ u
},- r! R! x8 h( l
reduceFunc(context){
% M3 |0 ]1 V% }9 k0 n% _1 z# | context.commit("reduce");
' G6 m- k1 t- W6 m" m* d" v- }0 h* o1 B }6 G1 U+ [4 L7 F' |" e
}
7 b b# M" T7 S6 H f3 s) Q. j$ ^6 i
2 x; U( I2 {" n8 H# W1 w
% B8 u4 ?, k6 y8 d l4 R methods:{8 Y9 G* |, h! u
addFunc(){* i" A8 s. j2 J8 d) i6 t
//this.$store.commit("add");
4 k4 B: C: S4 x0 [- l" z9 ? this.$store.dispaTCh("addFunc");
2 C, A/ R$ M" [1 g9 | d/ O },
. S+ v) Z, _; o8 b3 ?5 e& L reduceFunc(){
; f0 W4 v8 {, ~( a/ r //this.$store.commit("reduce"); ^; W9 x( G3 ]4 g
this.$store.dispatch("reduceFunc");
) A" d5 s. F- s- S& c$ {6 ^+ k }
+ i9 |, E, Q+ H+ ` c8 G. |) w* @ }9 X: p* `; g* y% X5 L3 \+ g9 e
7 A7 I7 J. h* J: t3 d0 W- N
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
! B5 q$ N( A3 w实现效果一样!!!!: d# d7 l* z) i7 B; F9 f
/ I7 V- o; `$ `& H1 c. f
& w7 T6 D. G# S+ q2 z" j
: \" [0 p3 X/ H) h2 V
" o. M$ h. _; N' F2 Y
& w3 @7 Q2 [6 M9 T! D) Q% r. f
) Y8 C% J6 @! i0 l% @6 T9 @7 S: }3 } c' g# `- j
. g( w- u9 d! E, Q- X I: E
* d2 {9 m7 s* I! ]* \+ B8 j3 `# r- P+ A' \& _& y) J
6 J2 D0 d5 y, } Y6 E% V1 u2 T4 R- H8 W0 t2 J. e; d
G s$ C( O! Y
. V, A% n( m4 U) `( S
7 {, Q- V# a6 X$ Q' A3 D" C4 w! R8 p( O$ z3 a- b- f( N# \
|
|