|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
×
Vuex 的用法详解
3 {: _# X8 r* R6 z% \
+ j+ L4 Z4 _2 }/ x) z; w) L本案例测试下Vuex的使用,创建一个新的web项目/ ?1 n9 ~- [6 T4 J$ \
Vue init webpack web
) U" |; _# a4 U" b安装vuex1 y. u a9 L9 s4 l5 x
npm install vuex --save# R; f3 ^& o' l; M- u! _ }4 y
启动, npm run dev,打开localhost:8080 即可
: q; e+ U( ?! m8 G0 Q* _2 K: i; O' U
& f! j2 l; p/ S
(1)引入vuex
2 R7 v# j6 e0 z创建一个src/store文件夹,创建index.js , 引入并导出store6 E/ W- ^ L8 F
import Vue from 'vue'7 |; ?% P' Y' e
import Vuex from 'vuex'
8 X, `% D; m) A8 J YVue.use(Vuex);
" b" f8 r7 K" \7 ~" V/ }5 ]) P: {const store = new Vuex.Store({
" l1 E& b( a# T- J3 c8 M3 J})- Z) a: D7 j* v# G# u/ H# s
export default store;5 z/ ]1 O9 F' m! G/ I8 J7 L
7 O* \9 r! v9 j' H1 ]/ x0 C' t(2)引入store到main.js; ^$ L6 L/ y r9 e3 b
import Vue from 'vue'6 p: a# u! i( S
import App from './App', x9 F. W8 ~ h' G
import store from './store'; d5 l/ p, B5 k" d& n
) L9 J. ~) G1 g' A8 D% |% FVue.config.productionTip = false. u6 Q0 A1 N! G6 O/ j
9 a6 D6 U0 `8 x* B% f
/* eslint-disable no-new */2 @5 m& Z6 P7 I! K0 V2 Q
new Vue({
% X2 n0 t' g) g+ ^% @% a el: '#app',, @' U" S+ V1 p
store,
) ?7 `/ ^$ z6 R7 ~ components: { App },
( m( t* w6 V0 r' a template: '<App/>'5 M0 t M" @8 b) L
})
# @+ U; X) Y* a5 W* E" z1 ]: f6 _3 T5 \
- ~1 E x" N U0 o
, x5 l! A% c& l' j- I. W* g2 P(3) 修改 helloword.vue ,先使用state获取值进行测试
m6 y' L$ m0 J C: j- I( v' ZState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
' R% N/ c" A, B$ x3 y9 c7 G% w6 Cconst store = new Vuex.Store({7 ^6 t% w" _# V$ c+ p, n
state: {8 [* R- h3 A* j* ]( T4 N
count:1& Q# q% T, G/ \0 q2 e; o
}
7 n! E% K8 u3 G. R8 H" ^& c})9 d5 Q. [0 Y" o# A: y) e
1 R2 p$ ~7 f- S% A2 h( o- }helloword.vue----
1 B/ \9 }9 ]' L1 e% a<template>. b3 _+ l* i! d$ o6 J
<div class="hello">
1 R1 ?; H* X. B* l v# t/ \9 j
( v4 a7 O7 @# _, i; f <h2>{{this.$store.state.count}}</h2>: N; P/ M) f; a/ A$ v
2 g* f3 @" |$ r( ]( x4 t </div>
) w& H8 Q9 K8 p, s* y2 N2 ?</template>. U5 T3 N! B- v$ ~$ |+ y @. X3 j
$ J% d! \% K( t( i) {6 j: r
9 \3 G3 r- v* H显示结果为: 1 / k% D, z+ p. |5 D
^/ j5 W; ]; h' R
! ?1 H4 m& t% j(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:+ b+ M$ W. ?; S* d* a& L: L0 T% g- v( h
4 U$ O+ j" R0 Y7 h5 Q8 M
const store = new Vuex.Store({6 O/ ~0 ^" D' x* q. k% V
state: {
: j0 y+ p$ Q; m7 M# A) ^9 M1 `* q count:1) F/ V- b0 G7 V- v5 E& g
}," W* F4 k2 U: t. h, y( W6 @% ?( G- Q4 w
getters:{" S$ s+ S: f% o' p8 f: o% ?0 g5 {
getStateCount:state=>{: ^, P5 A2 G1 w$ H1 _
return state.count + 1;
) ~& n/ w$ [ M# c$ D/ Y K }5 Z' i$ i& g) t
}! w! w4 r( ^6 J. L. p' p4 ~
})4 i# M$ {6 j" g8 b: x, r, a( y
- l$ @/ s* ~3 F- _' F+ a9 C<template>
# N0 r& n( O8 Y5 b. z9 f! P <div class="hello">
+ n& a7 V( L* |6 {9 t
# w9 Z6 {* E" D6 A4 [" _0 Y <h2>StateValue: {{this.$store.state.count}}</h2>
! u" y% F9 j. ?9 J9 D; V6 t, G) [6 @ <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
/ _ L' J; {5 y$ M </div>
5 N; C' k4 N: z+ @</template>& | s( s6 h, }" t5 V6 I) M/ Y
6 ^0 [# j1 g& V T" O) E2 [+ i- n
显示结果:" {$ z6 w6 k6 C% c, j3 X9 f
StateValue: 1GettesVaule: 2
1 ]' C2 s: Z, z! J+ Q, [
3 ^2 X5 g X; |, G* u1 x& K1 l(5)8 D, ?7 X/ N, E) N
Mutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: 1 q6 x8 r$ ?5 H3 ~! K. i, A5 w
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
7 u5 f6 v' j8 I5 h, r- @mutations:{6 a7 I3 Y8 D) m& |1 U3 X4 f' @
add(state){
# r; q8 P K! B state.count = state.count + 1;
& S% g+ g- x7 l( m% S7 X3 I },6 e4 B* T) i. t; C" Q8 {! y
reduce(state){
4 x. B$ u/ @. p5 _) A: I1 Z state.count = state.count - 1;
& E6 B% I. } U2 i6 O& z( A }" Q8 F3 M$ {+ f! F" l
}
& L$ n* c9 {3 L0 \: t: u( a<template>
% i; F& ^5 h0 [- a$ @; V <div class="hello">$ j0 E! ^* l, ?2 `! Q5 w
<h1>Actions:</h1>* [' V; ^/ {2 O9 Y9 ?. {
<el-button type="primary" @click="addFunc()">Add</el-button>
, Y& I1 R) T: d, Y5 _' u5 l <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>0 h g9 |" R0 E5 `( `- l
<h2>StateValue: {{this.$store.state.count}}</h2>9 U( {1 ] q# m4 i7 Q
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>9 |1 Y$ C' d& ?) {2 a
</div>
( ?! S# t' z9 `; E# m</template>& u; u4 K4 t/ Z8 ]+ a }3 H ^6 Z9 `
& k5 y' b6 |: d# Y
, g$ q/ p# C: f F结果:
) g) z7 J& M! D$ X/ B3 \3 J+ q7 R% q
8 F9 Q6 ~; a! d6 \
Actions:Add ReduceStateValue: 5GettesVaule: 6& g; L" J* B2 v. C+ j# f
% m6 a# M ]/ z/ D; m; S4 e: @
. k& H* {- G9 R( ^! e& [$ j: [0 X6 ~" Y
6 y2 K3 A% p: E' f, r/ W
0 d% |4 H- f9 s9 \: u6 s `5 C
' v- o' e. B, ?# Z0 P7 }+ k" v1 o+ \9 r* w5 F& _
5 X/ Y# d, h- V# k% `
(6)Actions:
" u( D- @0 E/ I4 M我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数: 0 c) i+ K2 F0 A$ k( O
8 ]( n& F" R8 b$ D) j. zmutations:{
r- D: @8 I8 J add(state){; i9 R, F8 a6 r/ V( Z! g8 C0 t$ g
state.count = state.count + 1;" E: @2 X1 [; P- K G$ w% m
},3 B9 ?8 S, @+ y: p& n Z
reduce(state){9 r6 M& W1 Z. _: }& ]0 X$ Q
state.count = state.count - 1;; z! {$ x) R8 @5 U" G1 `
}
$ `* C0 Y* K1 d3 D; r0 W },
* N: K+ b6 g2 I2 B actions:{3 @% P. q9 i6 k+ W+ o
addFunc(context){! Z6 P+ H: b$ k% R1 _
context.commit("add");
" ~3 I; B) v. Y) O8 K },5 Y, j7 H; P% |; s; y: c! d2 G
reduceFunc(context){
+ p" m: g' J& C9 X* I8 R0 { context.commit("reduce");
9 z& S0 J* U* v }
9 Y* T( S9 C. c% g }5 ~) P3 Z+ f6 F. p
+ d, R; A$ o) P. R8 }0 c( Y! h: |3 O2 j# b
) K/ c) \ ~& U! q# f3 ^; J methods:{4 m: ?0 k8 E9 Y! J- B0 B
addFunc(){
9 O! d2 @8 ]: _/ K a, x" Z7 } //this.$store.commit("add");
: e! V3 B; `9 }* g6 x this.$store.dispaTCh("addFunc");
! c% N4 N! D& v },
* z" R; Z% ?6 f reduceFunc(){
( K( _1 ^" N- Y2 g; K* ]4 M! ?8 O //this.$store.commit("reduce");* F2 o: m7 e3 N) K. h
this.$store.dispatch("reduceFunc");
; k1 ]) i* ~( Q }! A$ W1 {* ^- R) c& w8 ~
}' r9 X3 K' d0 q ]) M
" ^/ ?& w; ]; Q; v$ J* N这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
! K* O8 S7 c. @- k% Q W; u* n* p实现效果一样!!!!+ X$ [6 i& v4 I/ w( i
9 S" ]0 \4 O; |: F
' q7 T S2 ]( M$ o: k" w/ R& k: @5 { R
5 q+ |. U+ P- D* y' y9 o$ u. p. k. y* c2 C7 z) c
6 `: }* |: R7 C r3 @7 g6 U8 j4 _
( V& K: i% K+ J" i! [% D+ A; e ~+ W( `0 U+ ]" x) @" |; ]9 D
8 d: C) m# _& [8 K$ z/ h* n2 M% l1 u$ u
2 k+ V1 s1 N! S& Z5 K' u2 Z
+ R1 L; G% S1 m2 d8 b" F" I
, L- w' `. C+ R5 J+ W% V7 W$ J; H) v6 q
v; I% E# ^" q7 Z( c4 O+ ?, i) \5 f# ?
|
|