|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解
! T1 V7 B+ c( p- @* s, O) R, k- h1 @
本案例测试下Vuex的使用,创建一个新的web项目
( `+ j- k G' Y8 `" Y0 t [5 ]5 ]Vue init webpack web8 T6 B9 z) ?+ p. @" b# ~* C" g
安装vuex* b& N$ Y8 ?7 m4 n
npm install vuex --save0 P" v$ u* h4 s8 |! V
启动, npm run dev,打开localhost:8080 即可2 b0 z" o# N) M9 u. x
! Z1 m2 f5 L5 I$ Q& H0 ?- h
0 t% W0 ^! \: K+ A6 c: g(1)引入vuex" \7 k i" e9 M* W3 H
创建一个src/store文件夹,创建index.js , 引入并导出store+ u0 v0 E) o- S& j: s, p: [4 n' ^) S
import Vue from 'vue'3 `9 R0 \& M* {
import Vuex from 'vuex'* y2 R8 A, s; g: u2 B, V& _" s
Vue.use(Vuex);
" e' R6 x/ M, s! o: \ Yconst store = new Vuex.Store({7 U, [) b" {6 L5 N, J' V* ]/ a
})9 V+ y8 O& d4 E1 M1 `
export default store;
8 ?! e, P# ^2 F; B4 ?
. L0 X6 T" m3 `- B2 d6 y(2)引入store到main.js% N2 v% r( a* V) }/ A8 n5 k
import Vue from 'vue'
- Y6 x0 P. U6 H' g* ^" y1 ?import App from './App'
! G; B4 S: n- gimport store from './store'
% n" i% H/ M& t! s( A! l# C, M7 I- _! u# u. V: O1 I: _
Vue.config.productionTip = false$ f6 N, P' \- K3 I/ R
2 _5 a, l+ ?2 c; Q( [8 D4 R% s7 ?. T1 h
/* eslint-disable no-new */
! D; [( a2 M& E' I2 `3 Dnew Vue({
2 _ N! B1 o4 z# Z9 a* v el: '#app',
- [1 P% V5 C8 r! t- a, x" j d# U3 n store,
% s' e4 z5 m3 U3 `/ ?& M% j0 v( Q2 T. n components: { App },
4 B4 [' }. M3 u* V template: '<App/>'
% S+ z) C- \* `0 K# }5 O; ^( V: {6 H7 S})0 P6 z8 i, }% o5 x1 Z3 p
1 ?" g* I% B) j9 z& H6 |6 k- M4 m7 b! S- i* I
& L" O4 y4 A! m0 W(3) 修改 helloword.vue ,先使用state获取值进行测试
9 `4 e. c/ I" T" l1 VState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;8 p. s2 y' w( |/ E/ g9 w
const store = new Vuex.Store({
, k: h7 M6 Y) `6 M" r `2 J3 s state: {, ?8 z. L! Q/ P% `* S
count:1: n( S" Y5 A3 A
}1 V: ]6 x' m$ y6 j
})
; l. e1 R1 k3 _. ?7 d' u; e X. \% a" L4 h. L* K! [
helloword.vue----
7 q& E' h+ w6 n: U<template>7 q8 b7 G' }1 U' Y2 C7 Y6 V0 e
<div class="hello">
" q+ @- J8 J: F* f- @3 X
8 M/ f0 M& N8 J, |: Y P8 s1 U <h2>{{this.$store.state.count}}</h2>. g1 `: Y' u& U: ~1 F6 U1 E
+ V* f7 Y! H) H* j, {$ Y
</div>1 N" N s3 l* s4 |8 T
</template>4 H0 P1 g& i" N& E0 |) [" D) z, n. s
3 I( Q( y5 [4 b5 t# h2 x
, F$ W7 B- a% Z. b* M' G! T& }
显示结果为: 1 ) F9 a$ n# p: `1 c+ [ [: B; k v
7 j. ` U7 d) `) ~8 D
+ \7 u8 o! {' ?0 s, k0 V" \(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
, d) Y8 O1 y) y2 i# f7 F3 k5 m+ T0 s# `
const store = new Vuex.Store({
( I0 ?$ m M \& n8 e, _9 B state: {5 x. `) S' c6 D% H& ~6 b: `% O
count:1
! h& V/ {& Y# F" R0 m5 S# x },1 x O, J: N3 C3 k# Y( C# D, h
getters:{/ h: {* M$ Q C; U! D
getStateCount:state=>{$ Q5 F) j" `+ @" ?
return state.count + 1;
], @2 \; m# Z; ]5 | n& k }& w8 B1 P6 k9 S4 a u& [1 ]
}9 u3 f' C, b0 f
})! m7 c& m8 w$ B) Y
# W, V7 w' y, N% V
<template>8 n' o/ `2 A( @8 i3 `
<div class="hello">. {# B" l7 ~( v
@2 R0 D: y% q6 Y" y/ q& G
<h2>StateValue: {{this.$store.state.count}}</h2>8 J' w/ Q7 N& i
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
! W/ D, S% r( _% K2 F/ Q </div>; u; a+ X1 X% X( z, d1 B: E( P8 u
</template>/ p' H1 w2 e. T) Q8 Q
( C3 g( q% b& }. |5 y4 b
" B; g! x5 {* D$ B4 i7 z: H显示结果:7 s% P% {2 E9 X4 E' z/ `
StateValue: 1GettesVaule: 2
) p: w. f! t# ^( k& [4 B0 ^' _; P2 q, `( j
(5)
0 d4 M& s* v* k jMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:
) j8 a9 z- h5 V. j% o修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:5 i' w3 |) k) `# G6 k
mutations:{
% F( G# Y$ }& _7 e add(state){* Z' |, {/ \9 I# x
state.count = state.count + 1;4 J/ l/ Y2 {/ B4 m7 E- E
},
& Q& l) `* w9 f& P: j: N* S8 o reduce(state){
; l2 b5 P/ h5 G, W; c state.count = state.count - 1;) t- A* \8 D$ }% L2 \, I
}1 B/ s6 w3 I, Q! x
}
2 Z% P- `7 `+ ]% G# |<template>9 F5 p: W+ b& z( S9 L
<div class="hello">
$ @4 _/ o! P7 l, Z0 Y" I n <h1>Actions:</h1>
6 ^. i- E H* B* X1 a <el-button type="primary" @click="addFunc()">Add</el-button>
. u5 D5 t3 x- [1 p <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>3 q$ ^2 P! O4 @* ^. f
<h2>StateValue: {{this.$store.state.count}}</h2>
) G4 [' _! s% U, x <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>1 s B: L( M- n& z) Q! r/ y
</div>
% q' H/ @8 t* m; w1 k R</template>
: ?3 C- f n7 _* e& X" R W% D* s6 x; t
- B6 o" m0 o8 X2 ~- ^3 w
结果:
4 ?9 L# W# R/ |" ~! Z. p
! b3 y8 n7 ?( s5 k, c5 P3 Q4 W6 c! `2 \9 u9 q! E' @: I! G
Actions:Add ReduceStateValue: 5GettesVaule: 6- N; u0 E( ?; Q8 o+ P; j
0 e. u# U$ H4 E5 |' @
4 o6 c: Q3 ^. X
) P/ I6 k1 m4 j9 P/ M4 E$ }. b2 B& ]7 D9 R& a( R* m
% a3 _1 S6 o: g: t
) H% S/ f8 e# O/ |% L4 Y7 R7 Y
4 b" S; r) x; @0 k' T* N. Z$ W% ?5 a- W/ A
(6)Actions:
$ n$ y4 i+ Q0 Z. @( A. }5 a我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数: ( K1 u/ C0 x3 p v( D( l0 s5 V6 y( H# f
% C( f: |1 A4 I) d& z
mutations:{. [! @) R$ ]" Q
add(state){3 T" g9 ~& S$ Y6 s
state.count = state.count + 1;
* A6 o8 p; m. Y( K, l( Z },
- w. g9 K: B: `! P reduce(state){/ p! o! c/ a$ m
state.count = state.count - 1;
9 N- L9 v' T! e( {) V' y }
K* u7 m9 @+ Y0 w2 l3 p$ m },
1 }7 Y' [/ r" u2 m3 @) a1 @1 [ actions:{# g: } T: d- o+ h& p
addFunc(context){
6 J8 R2 d5 \! L" J4 V context.commit("add");+ e+ H* S: h$ [5 M( z$ c
},
/ U& n, k* }$ x9 e4 T- a reduceFunc(context){
* `! A! P2 k# P& h* z, {# z! ` context.commit("reduce");
! o3 l" n7 s2 ?$ K# E& E }
% ~0 z' O3 V, J( Z }- Z9 v3 ?/ w# @
( g$ s/ v: I/ h& ?5 Q* O4 z
5 U8 ~: R$ E. m, Y
! Q4 s _: U8 K9 [
methods:{
/ i7 P% k3 x$ e# J addFunc(){+ Y5 h% ?* o2 O `6 W$ p
//this.$store.commit("add");: d& y6 B* T+ p$ ~* j
this.$store.dispaTCh("addFunc");8 u1 V9 P; x7 D* A$ b5 N
},* y/ l) ^- v% ^5 x W+ v7 B
reduceFunc(){) B/ K$ ^% h% K% r2 `. S- u
//this.$store.commit("reduce");% Q, ?5 e0 U9 N% T9 G
this.$store.dispatch("reduceFunc");
% @& R }" S& b' t6 e/ e Z5 W }
' e3 `; P6 Q3 e. | }$ u0 `# S6 T K! K0 _3 t
3 A! |8 O1 X& q7 M: F
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
5 @" ?" @1 F6 y/ S实现效果一样!!!!4 A9 b$ R9 C5 G
) O7 W% q* G/ x$ V6 `8 s6 @" u' s$ P6 @8 ^" {$ A
* p8 _* k( z; q0 `
9 k! }) V! _* v7 R
4 j5 Z- U E% u( T
& k& o M6 V3 @) C' d1 ?. n! M8 C0 q( M0 B! h
1 [3 @/ c l7 F5 _9 ]+ e
4 ^3 M( D+ V! X$ W# C2 B/ [
& k; W1 ~7 I n9 j9 \, m; S) s/ K( t* Z3 X# D6 [$ v4 E
0 h) T% n0 V2 P' }, y; W
# e7 K8 R* C- c5 `
* f3 c6 n7 T/ r6 m5 ~8 D$ F
! w/ g7 L. }, s# B7 S9 A" d( Z$ j
|
|