|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解
% a1 f+ |7 J2 B& f& h( J" a
. ]0 D: H1 q. W/ G: M本案例测试下Vuex的使用,创建一个新的web项目
9 P. q- C' t6 |1 nVue init webpack web2 c% Q; ^, c) |2 `$ y
安装vuex5 L+ u& c& `2 C1 x! s/ ^
npm install vuex --save
$ a6 U' \* v; n3 b启动, npm run dev,打开localhost:8080 即可, Y/ v, G% [* f9 g1 |
) n6 Y) _0 U( O: F
/ M# n, R* S1 U# Q+ D2 @% p0 m(1)引入vuex
0 l$ Q* j- {# z: |% B q创建一个src/store文件夹,创建index.js , 引入并导出store
" L( {% @; S3 |# c8 R6 ]import Vue from 'vue'
# U! Y; w P. o8 ?, s) Ximport Vuex from 'vuex'/ P4 S' n- z8 D) j, G' {
Vue.use(Vuex);1 S" I" d/ N# {( s% K
const store = new Vuex.Store({
2 d4 v, |3 w& w2 L! I+ I4 p})
. f6 e0 p' Y7 P0 `) G& p' E# dexport default store;
8 r, D/ v( \" Z5 r+ n0 w$ k4 Z2 Y- a* s# h& i
(2)引入store到main.js
/ z' j6 g6 T2 w+ w' pimport Vue from 'vue'
( ]3 D5 a, e2 N) u' I6 B& Gimport App from './App'
* N: S" e5 {; c; E1 U( Z! Ximport store from './store'9 o% k6 K8 \) n6 s2 Y0 A
" T5 M5 n! g" Y1 V8 O3 dVue.config.productionTip = false
$ s5 g3 ]2 r- k# H( s$ \5 O+ L5 F; F$ C5 v0 K+ l, h# O7 U
/* eslint-disable no-new */
0 O1 G+ h+ p9 F5 v% P8 f9 Fnew Vue({
6 f/ T9 ?, ?2 }" t: Y% t/ I el: '#app',
H7 e1 n) w. h4 N+ F4 ^3 |1 ^% @ store,% V8 b+ Y6 V6 w u& n+ T: N' O, f
components: { App },
0 ?! y, d. E( U1 Q- t/ T8 r( s template: '<App/>'
6 Z, r4 n! T* r9 {})" \4 d$ G9 D+ _- U) {$ K& C, D( N. p" T
+ U& q. @0 S# X; l4 l$ T
' E2 e" w( W+ i* v4 T3 q. u- s8 X. N) D# y ^( ?
(3) 修改 helloword.vue ,先使用state获取值进行测试
4 Y$ f9 ?4 m+ u* N4 ?' S0 ]State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
3 I& |0 G N; l2 _7 f4 [const store = new Vuex.Store({
; y7 @% T: m! _! ^1 Y$ f, h state: {
- X+ V) Q4 l" ` d0 X count:1; U% z9 K9 d7 P4 @2 J. F
}
( A2 \5 G( M! s& E})
5 r4 ]: @( r% ?( P: e( S
( B- V, j M* g: J$ Bhelloword.vue----
/ C* K- M9 f) s' }0 v! I<template>. N* b* C3 Z- R: T- t
<div class="hello">
# h8 ^+ \8 @" k
- n! Z; ]# f6 ^1 Z# o# }( ] <h2>{{this.$store.state.count}}</h2>
+ g$ W2 E- c) L' ?+ Z3 G4 K- D% u1 v0 q0 |) a
</div>
+ I6 d+ j5 Y! j e</template>
4 ?& P: K1 j/ _# v9 l2 u$ d; O7 f4 n% w
4 C: i6 U5 }! J- b9 [7 t: f显示结果为: 1
: H9 f/ z6 W5 r3 b3 y5 E5 F+ M5 T2 ~/ U; x
x+ r4 M3 e% D) x+ a
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
6 M7 r5 v) F# }" Y {7 n/ p, y$ N; G5 v* q( j0 J
const store = new Vuex.Store({1 [, X$ b7 M6 k1 h* C* Z. g
state: {
+ I) U% w& ]( {9 O- b count:1: ?& ` x$ z/ l6 J) u/ Z; X, b& Z
},3 L! Q7 g q8 H" t/ v' p
getters:{
$ ]5 K3 B" v$ { getStateCount:state=>{+ @" r4 |, ^) U
return state.count + 1;) r% O, L0 K' O3 H( d6 p' O2 j# O8 s
}. Q+ p- i% A% Z$ r; V9 B
}
. p% p. m) S; P8 I; h: X})/ q& j4 d" U" g4 Q6 R
! ]. M. X9 R( S
<template>2 p' b1 S. D: N: v
<div class="hello">
; z/ E5 \0 @9 l. h* [
! Y& F; ?9 H9 k <h2>StateValue: {{this.$store.state.count}}</h2>. i, ~/ N5 K3 D( h2 O/ \
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>: ^% V5 ^: d. C6 e3 J
</div>
/ _! r$ u2 o0 V ~# ?</template>
6 J( A; S% m* d6 Y3 l; n) P, z% K( _3 d( d) O9 S5 e
- S/ v* ?& V9 A3 q- f
显示结果:
- D% b9 E# ?" m% s& i6 ]- M UStateValue: 1GettesVaule: 2
0 o+ k' K( V! l4 p# l- N
/ p5 ], z& i, w; p$ l8 j+ R(5)
/ n6 m! r& M# p7 U0 q8 WMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: - Y# R h+ ^! S7 q( s
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
' D1 C- J' v: |; M" ]) |, xmutations:{* v$ [6 z5 M0 N/ E: Z+ i
add(state){
6 A" j! g0 Q% ]: k) o- x: d- L- M state.count = state.count + 1;" w+ u! K1 b8 n r
},
- \! ^) Z( @, E q* H d reduce(state){
( o: r( M3 l3 s8 V% e state.count = state.count - 1;
/ e6 I% @' e. X. _+ L) A+ d }9 Y. `4 n, N- H/ _$ S7 Q% T1 P
}# n' ~% f3 `* G, s0 L
<template>
+ [) q+ e! w# R% s# W <div class="hello">: s* d0 e1 g+ O7 S# i5 M/ s5 ?3 `
<h1>Actions:</h1>5 `8 n* e. c1 U* _. A
<el-button type="primary" @click="addFunc()">Add</el-button>0 H; P! w' ^. h U
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
& |( h" y2 x1 M1 C6 @! ` <h2>StateValue: {{this.$store.state.count}}</h2>
, d1 y7 V' q& `1 c1 n8 o/ ?, G <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
- L6 C! ?7 e1 S' F </div>; I5 Y/ o+ w; B H+ ]2 o
</template>
2 R, L e4 Q0 D0 Y9 K4 w! N( s
- f9 `/ a1 |8 d$ R3 b1 Q7 |! J- C4 I7 C7 v* y2 |
结果:
9 ?9 [( l5 D: s9 A" N8 S2 M: d- u2 V8 W) ~) M; B& u: r
0 j" y/ u& Q" k4 i" J
Actions:Add ReduceStateValue: 5GettesVaule: 6
7 N# w+ @4 w* H7 ~
3 v! B& _1 B$ O( \, g* ?3 @1 V: s W6 G" W
. o1 R# y2 n' B" X3 N; N
& n6 I! s9 N }
& Z0 q9 d/ J/ g# y! C' M+ {- ^( q0 ?( e8 B
# X0 Z3 k7 t+ ?6 c& ~6 ~+ J9 r" E- I% |3 J+ p3 T# W! t
(6)Actions:
# ~' x9 w. Y7 C j. y+ _我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数: * P0 c* h% K' b$ k; F0 S
* e7 W/ l" e! l
mutations:{& C+ T: B( p7 `$ z" R G6 e/ b
add(state){' m# G U, D9 F3 W3 q: g k7 |- E
state.count = state.count + 1;0 w# G8 X' E' z5 i- N
},- q3 N G9 v0 l4 J$ J4 e' H
reduce(state){# I8 [7 w" m$ e5 T5 u! o
state.count = state.count - 1;. ^5 k+ ~" V+ A* ]( D5 T8 a
}6 L- F5 K5 Z k; a6 q p) V
}," I6 o2 k' d Y% K+ o4 l
actions:{% r) w& [, H" V1 H- \$ n6 ^
addFunc(context){! J% e4 M' a8 d' v/ \ }
context.commit("add");
. D8 G- k. b! [; Q1 _. H },
/ M1 N& {4 A I( @( P reduceFunc(context){# \3 R' x2 W! h0 T q) |- b0 d5 \. d
context.commit("reduce");3 m4 h% c( P3 m( B2 Q6 k
}. z. x! Y0 w8 z6 I& a- o
}
5 b: j4 v/ h2 A+ r+ b4 ?; M, u2 F8 l3 G- P
5 M2 z0 M* V9 y7 B& Y8 e- L
6 k, U9 q( f) ?
methods:{ D% |, Z5 [6 K4 Z! T3 N* h
addFunc(){& H% _! a7 t' |$ z
//this.$store.commit("add");4 w, z! x. q4 W
this.$store.dispaTCh("addFunc");+ Z; P8 z# l! ?/ E( m/ U. n
},
: i9 }8 o4 N% K$ k reduceFunc(){- d" o' k! P6 w0 a# r" `$ i
//this.$store.commit("reduce");
. x* Q' a: r7 X/ P9 D" [# W this.$store.dispatch("reduceFunc");
/ K# T! @/ M( m; j }) k. s! H2 P' K: R7 {, V" i4 s+ H" `/ A
}
& j! h% i& ]6 q5 w* \* W# N2 Q
7 _9 F+ ]. p# W" M这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的8 o' Q: w! n) t$ \+ \; C
实现效果一样!!!!4 q# X# v0 Q: q( c3 C: G z
; t# {/ {3 d: }/ u( _" |$ Q3 k# X4 L
% D. J! y! G% |- a& ~, w. \: M2 }5 ?3 ?
6 K( W9 p" X0 ^! j* t8 o* A
7 O( t% [1 z0 n R7 Y) }. e
+ f5 o$ i( _( Q2 F* F
" W5 x: M2 R8 W0 E u F# s& B8 |. N7 W6 H! W
) o7 `6 N N& d( w
. z0 Z/ W2 I* M1 H& D) m
7 s9 l" q6 U+ g' ?) c# H
( j q) H9 |/ k. q, O
: ~" T* K6 p5 e& V. q6 ~ X& y4 `9 U' @% W+ {6 D1 K
2 H1 K# A) m2 h0 A2 I |
|