|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解$ k9 m k+ z# |5 {' r7 w
8 F2 z3 [; s8 M" K- Y
本案例测试下Vuex的使用,创建一个新的web项目8 x |- b7 C0 S; W9 k& Z& G
Vue init webpack web9 }" ]% O0 p( W6 H4 n- T* E
安装vuex
$ R9 @# Y1 p: [: c2 I- U/ B. Bnpm install vuex --save
' {& K7 A' m/ u启动, npm run dev,打开localhost:8080 即可
$ Q* I& ^: Z* F/ F0 ~( J! H6 o+ Y
* }$ I2 q* {/ h" ^! a1 L3 }' X. B3 N
(1)引入vuex
) {, J# w7 z. o3 L' i5 S6 m创建一个src/store文件夹,创建index.js , 引入并导出store
X0 m8 ?& {( K3 S0 Cimport Vue from 'vue'" r- p" {# E9 L% H; D5 e0 A+ J4 ]
import Vuex from 'vuex'
( I8 k! J/ i- C( z; q2 L, bVue.use(Vuex);, q7 l4 H" J& V. G" y3 q) L
const store = new Vuex.Store({1 R$ g8 h$ a4 y# H `! |
})1 X6 y0 n' f6 S J- L3 }
export default store;
q! _+ S4 N; ~8 [+ c& x! ?- \
8 s( [( O& V7 ](2)引入store到main.js
) h0 ?0 `5 Y0 @; S9 P# @) Iimport Vue from 'vue'
* y5 i$ F; `5 d) l5 Y" o; Z9 j# T1 bimport App from './App' ?2 ?1 g6 [( _
import store from './store'
3 e8 m/ b/ G' J1 {1 S& q4 @3 o* w2 a0 c. Q
Vue.config.productionTip = false* s8 `6 B0 x3 g" e% t" A, R
% ]$ U' n# L# W( p7 c3 k% G/* eslint-disable no-new */
* f4 R6 Y4 S7 Z% Pnew Vue({0 [- p, u9 B5 ?1 J9 `* k, f
el: '#app',9 T, x: `1 N% j H7 @9 w5 z
store,& H$ G7 @$ B& ~# N0 { L
components: { App },1 \9 d; X z* C- e: f( l) ^' D: J
template: '<App/>'
& |# J) W+ u0 E4 m})' H! O6 M o1 T2 V, M
3 P& t* e1 c& e% [* ?
& x. d9 s: l% m* a+ e" T: h
( M: u9 z6 p0 E(3) 修改 helloword.vue ,先使用state获取值进行测试
3 X. X9 q# a# G! V1 S3 X eState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
, k4 O! s8 r$ L. c2 ?8 r0 }% A. n. Gconst store = new Vuex.Store({. q0 v& a/ r: G0 ?
state: {
. M9 W; o3 d- F! a6 `1 ? count:1
& o8 f5 O6 v4 \# S, C7 x" m }4 y5 ~# u4 ^8 m
})
0 }0 ^! {! K+ W; w0 E' D! ^ r/ D9 a, F k4 Y( x& Z
helloword.vue----
; r9 z- V& \0 M% J$ W8 e* M<template>% D9 ]# ?1 q7 o" A4 F6 e& K5 v
<div class="hello">
( I; [$ [' X) l3 j2 z" Z1 }4 ~/ O
) o3 v! c3 H) {+ a9 v <h2>{{this.$store.state.count}}</h2>
/ K+ o+ ?7 O+ g; H- v1 _
- {2 E) O: a# A# i6 P: k2 I </div>) y s+ I8 \- `7 z; l2 \! q) U* I7 q
</template>
, { }4 D4 b- B2 z" J2 c9 R( M9 l% R
# Y W( S2 V6 Z2 M
显示结果为: 1 & W# P6 L2 a- A& x) b2 F
; D; u" h+ {% P+ ^2 ^- x! F. J6 y5 J, w+ h* s6 d1 r
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
# q8 r: C, w( R+ z
1 x5 z0 a8 g% D+ A1 J2 I2 h5 g5 Iconst store = new Vuex.Store({
# X7 I) k4 r( |( b state: {
. F% V& P7 ?% O1 f; `0 z; Z. [ count:1# Q% D! [5 q; d6 J
},
2 V* {1 A8 q9 A Y7 a7 U# A" ] getters:{/ l, }4 I n) g; n. y8 ] g
getStateCount:state=>{
5 K) T' N* K+ X/ g$ l return state.count + 1;
# P2 }1 {0 \2 S! j& i9 X }
/ P, R% a6 y; @! b/ }* m/ Q }* e- |/ u: K: |- Z1 R
}), r& C- r1 |9 h, C5 p. e& p* L
! w0 ^% t( }! k<template>0 Y4 ^ m: e5 L9 @1 I6 P0 t$ r
<div class="hello">
3 P) g$ X" ~! S, v5 w4 X( h. q
' i& u- o- G' j } <h2>StateValue: {{this.$store.state.count}}</h2>
) Y$ X2 @* s. F! F$ j <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
2 j) B% F7 x; s5 M </div>8 k3 y- H. ?& y5 s
</template>
' z3 p0 Z, ~* V# K z+ t4 T
& ?0 Y Q6 o( v/ Z! G4 U+ B" j- a' D' _: N
显示结果:6 f6 Y/ B" i3 I0 B6 \1 r/ V0 N
StateValue: 1GettesVaule: 2* N% ^+ a1 w7 T" `9 f) X( T
7 j p: s; y. X. n( b) c2 Z! Y
(5)# G9 }: V2 V: E+ d* J
Mutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: ( Y1 U4 T# X" f8 a' N
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:* I% m0 s+ J$ s
mutations:{* o9 i3 `; K, I' v- B1 D+ j
add(state){
9 Y7 k/ B5 I8 s3 e+ d* D/ i state.count = state.count + 1;
/ ^: F, j3 I8 n },
: D, w2 z/ x' p% d* }2 P reduce(state){
% J* o$ e, n2 V7 u state.count = state.count - 1;2 z! }2 d& T; K+ i8 w3 o% `
}) B3 p5 z: g c' f$ W+ r3 T0 y
}
& v) N' B( L5 _2 E<template>
. J6 B% m3 w G4 N5 x5 G1 w <div class="hello">
/ M |3 S1 ^; L1 U2 y4 V <h1>Actions:</h1>
; b) F8 ?8 ]' O8 D <el-button type="primary" @click="addFunc()">Add</el-button>
# t {7 v* k- ^; }# H$ T3 J$ q <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>* d& }; R c h. c# x+ C
<h2>StateValue: {{this.$store.state.count}}</h2>
( L5 d0 X/ G5 I2 O <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>( C% E8 h, X6 {, X3 X" l: V1 x5 L
</div>9 t; T2 E3 ?; b* t
</template>6 k6 a- t0 s6 H8 h
4 Z: J! v/ g; X3 z" X! h
: c1 ^' g @9 ]) l- Y
结果:- C+ y$ V+ ]0 G4 w- a! C- K; Q! q
9 H. s# Y. H4 I: r: H
. {8 ], S; t5 _0 yActions:Add ReduceStateValue: 5GettesVaule: 6
7 O; o8 r0 \8 F H$ ]- K; G2 r/ u, M1 t" C1 g- x3 _! r/ M
( n. n& A2 n. L5 _4 ~8 S
$ `8 f$ J7 w" E3 w
) q/ l1 t8 ?1 }: _, |2 P8 i) Y/ g3 B& x! j! Q4 w# W
9 S' n6 ~" C o y+ B* x2 Z
! w, a1 d9 O3 s3 f5 |9 M7 m5 Q3 N
$ G# _) j+ R/ _* Z
(6)Actions:+ V. X0 `" d, y0 L w
我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
3 v6 T! z; F% [9 a) Z: _
! i, R+ U) J8 F# |% g* W" Cmutations:{
6 Z8 V# M$ Z/ x3 I1 U8 n" E add(state){9 }# A1 s* g' F
state.count = state.count + 1;
, h% b& s) n6 K; S% U' `+ U$ T },
* M9 _( S* j$ J1 X$ l5 m( \0 T8 M reduce(state){
8 ? J1 n6 m. w+ e; D state.count = state.count - 1;
2 m( B6 C# V# |1 [5 K; V }
C' ^5 p, |0 z },
9 r$ m* F( r! S7 ~# b actions:{+ r6 o* |. \, k& k4 c
addFunc(context){
! W& ]. ~$ S# y ~ R3 P& H context.commit("add");
( U. Y+ z# o+ O) [6 Q },
' J4 w3 @* q5 p; B$ j! n2 V reduceFunc(context){
! U, d# h$ b8 ?: P3 {8 f3 K context.commit("reduce");
! Z6 L1 T5 y3 V$ F: u8 i0 ~ }3 [% K( c r* g+ S7 |
}
N- L3 b4 v, d0 i
7 q$ Z, m+ M5 A. n" O; u+ m, q- K' U6 [
) Y* u* X T$ j2 e( N2 ^6 o methods:{' h$ Y9 Y) E6 k$ F4 u" i
addFunc(){& U4 \3 z& E. H$ S
//this.$store.commit("add");
5 i0 T# p; a( v& E this.$store.dispaTCh("addFunc");6 W2 o3 U: W/ i- G
},, }* h, M, J- \/ t. `/ K7 w2 H
reduceFunc(){
: s3 r0 r8 @* [! l //this.$store.commit("reduce");5 R) g5 r: l% D# F3 g" j% i' n
this.$store.dispatch("reduceFunc");2 L6 o) i7 X1 L- U7 r
}
# ~% J' ?' p4 g7 ?2 ^ }
4 y- ~0 J3 ], l3 k
3 a/ ^3 N$ u* U3 v1 w这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
L2 U/ S6 I4 i7 K5 r实现效果一样!!!!
' I |* R- A4 z# ]7 n
( A3 ]! o: i; I. v0 v! V& q4 o4 X: X7 z, U* E, K( t+ [
0 C2 B( S+ N0 m* R5 Q
. Z8 `! e, X& b$ [' ^# F0 o& y8 t3 ~: L! e' A0 X3 e ^1 N$ p) c
' E7 y! y* p# ^( v2 a, `5 T! M9 K7 O$ A$ F& y9 o) Z7 d
! Z n4 n$ z1 o: I# D- Y" I7 C! j p
3 W% A$ p) X7 i- B3 ]
! o/ o. j2 a! |! D% W t3 W; l4 p
4 e6 e) W6 g$ P: e* U) r6 ]! y) w5 {8 A+ `" @! X0 g- [5 C4 M
) `1 O* ?/ y5 z/ m9 i
3 k3 I) a# Q7 U5 |# e& W* X
" M% S* Y( o2 r, E. s h* e" q4 F
|
|