|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解( C* I& U z# U& N2 a- @
, N4 u6 L$ N3 S& c本案例测试下Vuex的使用,创建一个新的web项目% y* p: q: d2 i# C9 R
Vue init webpack web( A4 e/ H% Q* I/ F9 U
安装vuex. C2 V% n( n* K; s& F2 f
npm install vuex --save
' l$ o. r2 T( R f. }" h& ]启动, npm run dev,打开localhost:8080 即可
% T& ^" H( ]$ s7 d' b! b9 B# R$ H; [& U v8 f4 X
. s& Z9 Q/ ^3 B) K
(1)引入vuex
" D6 U | n9 W( N2 c" N创建一个src/store文件夹,创建index.js , 引入并导出store
) M" g) J# @: Zimport Vue from 'vue'4 `$ O' B6 F( C8 O% x% I
import Vuex from 'vuex'6 [2 a, p( }. g
Vue.use(Vuex);
% i. k) |. z- T/ K1 \- Fconst store = new Vuex.Store({% z* Q: b$ Y- F( y! G3 d
})
0 ]; F t$ h' Mexport default store;# N9 @, w6 z3 \* D W5 D3 T% ]
4 x3 D* R; z6 B
(2)引入store到main.js1 R9 @( \( {. [; T: I. ?
import Vue from 'vue'
( ]4 J( O C( U) e; v7 H/ f" _, p& {import App from './App'
8 G: Q2 d2 G# j" h9 mimport store from './store'9 S* z. m2 E* f* x5 z _
0 [, u+ v* J5 ], a- K- U3 q; a7 n
Vue.config.productionTip = false
1 ~5 r. B9 x/ G" l
8 r) T' i( N7 V" P5 ?3 e/* eslint-disable no-new */# ?; S6 g. n2 ~0 c
new Vue({
6 l5 D: C, B% `% P) t el: '#app',
3 W9 J- s! x/ Y% e8 ]5 c" q store,
; o6 P) Z, ~4 Z6 b components: { App },
$ M, e. s7 r/ x% {3 C template: '<App/>', i. I8 h6 F( Q. M! N! r0 I
})3 v" K/ n; U# ^: V
" w- [' g8 Z& m" \
" _8 c; u5 \6 g2 S" f" _3 `: L$ W) d$ H: u. L- M! h Z- b3 {4 T
(3) 修改 helloword.vue ,先使用state获取值进行测试
/ v7 D1 W: }. S ~; u7 }1 MState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;1 ]2 I8 V6 S5 b* p7 [) u, i
const store = new Vuex.Store({0 m" r( S; }, z1 D
state: {7 H" S! b/ w% j' B- O
count:13 {( J! W% z% c p3 `, H/ c2 L
}
# }0 \9 I) k8 p5 p+ r' [ S# Y7 L8 f})+ ^$ P1 L, ]: t" F9 D) d, J
! Q. X0 c1 ]! g7 r/ m$ ~& ]
helloword.vue----
2 ?* Q& Q' F0 Z6 i) T<template>+ t1 C- u( A7 V) C+ {3 l; A
<div class="hello">* I& F. o; t. p, a' k' Z. p
6 r9 O$ T4 K4 p, I# K
<h2>{{this.$store.state.count}}</h2>$ w' E. T' r1 j
3 M0 i4 _ L7 x; g: [) B, B </div>( e: G- U, j$ R9 H( K7 G
</template>! D. K1 c7 S, i- S3 i) [
! ?6 P. v6 x6 ?1 B* M! d& b) x" y+ Y4 b4 P
显示结果为: 1
4 x# v- t9 J8 `5 c: v# D; f
1 d0 \ m! N: P) O1 }! y
7 n2 x; e9 v* O$ W) u(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:: s8 R: D \3 Q$ |4 @6 q& j; j
2 G. k. s' v P, X
const store = new Vuex.Store({
9 ?& ~& p: a: O( m$ Y state: {( P; |' P' h/ y3 E- r$ d" G
count:1
4 K7 w( U: ^3 G+ b },
6 w/ ?& P. ~# x+ O( H* u3 ^6 g. s7 } getters:{
( M8 P/ _ j9 a$ d7 d U getStateCount:state=>{6 Y& g1 B5 V- R1 d h" w
return state.count + 1;+ N+ i4 d/ R" x! p
}
" V: K3 N; I% N7 @ t }
: t. A$ Q' k2 _5 p/ Y* w' l})- x* e* M& I& u0 W! i: n- N
3 j1 p, e, d1 A% u. Z2 x<template>" k, \. J0 A/ q3 S( O. E+ K7 |
<div class="hello">
2 t- O9 m5 v8 `
! X( N; C3 |$ [+ D" x5 d <h2>StateValue: {{this.$store.state.count}}</h2>" e i/ Y+ L# ?1 ]9 M" t
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>/ f+ m! n, P- Z5 _! s8 d- U
</div>2 n1 J' N+ ]- t0 R6 v
</template>( X4 D8 ]0 l2 D ^/ R( f4 [
0 L* c4 s! f6 I5 O; z: F
5 J; F d2 ]) k. u/ Z显示结果:6 c3 i8 ^/ H0 x9 H* L
StateValue: 1GettesVaule: 27 D) Y! _4 g$ Z7 d* Z
+ z- t v1 c# k3 `3 o
(5)
8 \3 I0 ]: T1 Q. z9 O8 G) OMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: + C. G5 @& \! |! M) E7 A3 P
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
( b: S5 p/ f9 ~+ V$ D# E" Ymutations:{
( E# I; S; h$ ?% L m( f add(state){4 l8 k$ ^5 S% g$ N: T6 H" b& [
state.count = state.count + 1;' Q0 L1 o9 P) r# o5 S- Z
},) ~5 [3 k- S* v G' r) X+ P/ N n% P. y
reduce(state){- B+ }* m" Y) W7 v6 s9 d0 q, z5 ?
state.count = state.count - 1;
+ d. D5 m/ e" |; F8 S+ K }
, {5 y/ w) R- M# `9 s. ^, W }
! B, \/ O( o; J" i% B<template>
! F0 |5 y: N8 q" p6 P& G' R <div class="hello">
: d- p) g8 h1 a1 h/ c: B* O' _ <h1>Actions:</h1>
9 A4 M6 X# w" o* r. T: L0 ]; _ <el-button type="primary" @click="addFunc()">Add</el-button>
' Q' ]2 U& D1 {6 ?! `5 x <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>3 b0 f, I4 {$ o( ]+ U3 t/ b
<h2>StateValue: {{this.$store.state.count}}</h2>
0 i- {2 Q9 \! {, z <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
" B# s# P" `/ i E8 X </div>7 `( p+ W0 H% {" p3 `
</template>. T( }1 P$ q" H, T
; D- q T4 O% _0 o; t$ a: q! _
R; b% H, H; J4 C' R结果:# c; L7 H& ]0 q' z ^ B% w1 i/ g
. c1 t; j, Q6 m- D" F' X) f0 J) o0 s7 J6 x9 e
Actions:Add ReduceStateValue: 5GettesVaule: 6
2 Z& e# q( t" q0 p0 m, e! D/ p/ m( x2 x
, R, S9 i7 s& S: Z; |1 S4 \ x2 ` B% G" ?" H
- R Y$ N) g$ a$ f$ q( A0 X) H; O# ?1 |0 l+ O
; w. L1 x$ {* u% P- e/ E
. b- }) U: V2 O4 ?
: n, I: q: C# D9 q( t& \- P; @# b3 w- P# R
(6)Actions:' E5 |: A1 L& v9 U: x+ n3 u
我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
" ]3 Y5 J8 N: [ 3 |" t3 l3 f: B: b6 @0 |6 l/ l2 K
mutations:{
% ]) z0 }8 c8 l7 v+ v- U add(state){
# T# X" a9 t5 x J* q/ D% Q state.count = state.count + 1;
) Z* ?) t! b2 q6 }2 m! [ },
& v. K" W3 N7 n reduce(state){
# z" c8 ?2 ` ]- x/ x0 p state.count = state.count - 1;
1 I9 e ^, h4 Q7 M( u0 s }5 O/ x9 X- W( {5 c4 `' x5 Q- j/ U/ Y
},5 P: a I2 j7 q, {; u4 Z# s) u4 B
actions:{
4 Q2 M2 y! ?5 S7 N* E addFunc(context){# z0 V t. \5 D
context.commit("add");
* f; D: Q) C% U L) j },
6 O6 E9 N' t, y( B# L reduceFunc(context){
# Z2 _" K$ e9 x; d, m( P$ B context.commit("reduce");
6 Y) P" d. F$ z5 d2 L* G9 P4 O7 G }
' L0 L4 g$ \, s/ C. Q2 i& ~8 s; P }( f" L4 F! L: ]. Y+ |
$ w7 c) s. |& S: U' T. \
* y1 Q2 o* Y: N' [
3 G+ b5 S& q6 B6 t methods:{
! k/ m( o2 [, S$ O a, U; o: Y addFunc(){) g& \( m% F; M' u
//this.$store.commit("add");
1 L, ?( _3 }( i4 P9 {2 B- S this.$store.dispaTCh("addFunc");
1 w& N3 x$ s) Y+ ~& W' r },( Q8 n( ]+ c, S
reduceFunc(){
( W, i, k9 p9 B w //this.$store.commit("reduce");( |$ O; K3 G- f+ @
this.$store.dispatch("reduceFunc");) D8 {. f9 B y- `3 R# @3 D
}
h" n9 E8 ]+ _8 p- Y' R) ~+ X1 Q }
: T$ O/ |4 H2 _8 i: B; ^" a1 v. s6 ^3 M+ ^7 s5 B' K/ ^
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的7 c1 C7 h) i3 K' P, {, Q
实现效果一样!!!!) R7 j( Q" a1 I- F4 j
# K& {3 `3 g# R3 \6 f# H$ E
6 F+ u( w# j) d3 }% M5 s3 z& Z) B2 N) ?# M3 m8 G4 g& G$ B
5 U0 P% e e/ K- t4 @2 W; ]+ q. I# M
" n! D( C1 ?1 B. X7 F0 e4 Y" N / |/ m; @' k5 f
0 g8 p p; m; r* V; H: X+ \" l
3 o0 ?; O( M' [/ Y" |8 u# b- Y7 j2 A; J) Y) N4 A
9 g% Y8 _1 I0 R4 v1 L+ b' {& e' z% w. s% p; ^ @
4 `- E) a' g9 ~: T4 g1 L1 |. r. F: @; L% V
# q# r5 C" E3 o1 }8 D, b, g
" ]+ @2 @3 M" d8 ^, y
; F) j" r/ T2 T% ~% b9 m |
|