|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解
2 b" ^+ d0 K0 s7 q
- ^. ^7 h: o6 S4 r0 h* \本案例测试下Vuex的使用,创建一个新的web项目
2 q1 B8 j9 c$ y' F* nVue init webpack web1 X/ k5 O; u% e
安装vuex+ K! @5 u# Y; t, p) [ c- T
npm install vuex --save
6 g/ |* u1 C3 Q( t& A启动, npm run dev,打开localhost:8080 即可: c2 `0 ` |6 O# L2 Y0 [; E' [( c
# T7 H2 q/ x+ C, N, Y
/ l- t4 q+ n9 _5 Z% C6 J V0 f(1)引入vuex
/ J1 F/ o, c x9 h创建一个src/store文件夹,创建index.js , 引入并导出store" ~: a: O3 s7 k% a0 w
import Vue from 'vue'8 }) ]) l9 ]1 e" d
import Vuex from 'vuex'
& g. V9 t4 x/ D+ J) mVue.use(Vuex);
* j9 d) F, T* A% |; i% a& o/ d xconst store = new Vuex.Store({
' f0 O0 z0 x9 T' S9 }})
$ P5 _6 [, ~5 A/ Zexport default store;7 t& G7 m. q' ?! o
' P- D+ J+ L6 c6 x5 j9 V(2)引入store到main.js
9 r/ E, c; I8 p: b( `& Aimport Vue from 'vue'* |) S; Z6 `) f
import App from './App'4 E/ _( o# U" {2 {* r
import store from './store'
# e9 w3 G( s' W: h+ }. p1 o% A- B; G& \% K6 r) j/ A
Vue.config.productionTip = false: |5 G, C% C; |& d% d- T/ c' z
v' @2 C0 G/ N7 n" G/ c i: ^% z2 u
/* eslint-disable no-new */: J" Z' J1 p/ p* `2 W6 f) A
new Vue({, K2 U2 r' l0 h+ ]
el: '#app', k2 O; m2 A# D, j2 A2 g
store,. |) y& n8 W7 K$ L0 }+ p
components: { App },3 G8 M! |7 q; j, H8 ^% `; j& w
template: '<App/>'7 U# I( i' Z+ m$ z$ Y2 g! p! z
})
6 a5 h; M! u" G$ ~' G1 n; ~4 h; `4 Q* Q) y
( k8 [9 j* ?- \5 D% h
* x7 E: O( L( I" |* O4 s+ h(3) 修改 helloword.vue ,先使用state获取值进行测试
2 f D5 H' h W# l6 gState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
2 J% n! b# ^; j q9 p$ x. k8 Fconst store = new Vuex.Store({
, V5 W0 I- @4 W5 u* F% J state: {
# N) |$ z# r" U. J: C9 c4 B count:1& D1 w5 \5 r. ]! O5 x" W$ Q
}
1 \' l9 F& u6 D9 }; ^( ~})+ s) I* }, m& f
" }$ J+ G U0 R8 S" ahelloword.vue---- {$ t7 h1 O3 G0 b, b1 a" T
<template>9 F8 z. C9 b3 P
<div class="hello">! B3 m; v& ~: S- X
% v1 h, _! \! f: d <h2>{{this.$store.state.count}}</h2>+ B% D% e% w6 ^; d
# c; |5 h1 }3 P G6 u7 p. ]3 L </div>" L: K5 v/ i! U0 w
</template>* q( [. L: {' v6 G; W' ?) ~5 P
1 H8 E# H& y# P& ^
$ m" |3 s& y g9 X
显示结果为: 1
1 W- K2 n& M2 D" P+ w$ l8 C4 \$ n+ d5 `8 M4 K5 p9 w+ A
8 r- ~4 O* q! z. T+ b: h* r# K(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:7 m( z5 Y) b2 Q" v9 {+ l& F
4 O9 `; E G/ B& @const store = new Vuex.Store({) ?! j7 D \) Y. b' Q
state: {
4 R. N4 h8 f( r" O K count:14 y# F* m" R5 d- K/ b
},
3 X0 R6 h6 g' M `2 N getters:{$ Z2 A7 @% t( t1 d: r
getStateCount:state=>{
& W) c) b# g0 D3 ] return state.count + 1;
) Q; j9 U: _0 N- c, t1 D) d/ c }
, C5 I2 @' E, e4 m# _+ t' O }4 h+ [6 _: y' C$ I9 w
})
7 I0 q" p+ X0 i( j$ o: K! w
( j7 ^ x4 P/ g<template>
1 s0 r& g/ L8 I <div class="hello">
& V( Y; Z) s8 H1 W: Y
7 |3 ]2 g& m' f/ X" D' Y0 A <h2>StateValue: {{this.$store.state.count}}</h2>
/ B7 R& `; [. H <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
& @; n0 m8 {, |+ @- V </div>/ ?# {) a: w+ W2 m& e
</template>
1 o0 J. I, [9 W
" E4 G9 l0 a8 [2 p o
6 q0 H- z4 ?# R( B) T/ N显示结果:9 o! V8 J' c2 l1 d8 \9 V0 E+ p4 A4 W
StateValue: 1GettesVaule: 2
. S1 [3 p6 ?( k3 X3 G2 U* P8 R1 I/ D
(5), t b" x$ j1 @( h& o
Mutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: 4 p/ r1 A, v5 L% p! p" p. w$ W
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:" Z* i, N8 g* J- R
mutations:{. C# }. Y, N6 N& r9 u9 t7 @, E$ t
add(state){
7 t9 C3 m2 R! j0 b& U: K: D& { state.count = state.count + 1;
. {7 l; Q0 p2 y+ X },
9 u$ n7 L1 P& ^ reduce(state){
9 p+ N- Q# o/ O state.count = state.count - 1;) t ]( ^+ @" `) v
}
3 I0 s9 ]3 A* f/ b7 r& K) v }
4 v4 w; _) g9 T3 ` G<template>6 u ^: n [: E* K k8 h
<div class="hello">- Y) _- U! k* g2 r6 E" _
<h1>Actions:</h1>7 j3 P8 C7 m% k5 p t9 v
<el-button type="primary" @click="addFunc()">Add</el-button>
6 O8 T, V# \9 U: |7 |1 c' H: z) B <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button> f6 R3 E! g$ N# _9 q9 {
<h2>StateValue: {{this.$store.state.count}}</h2>
4 [/ z9 O) S# z U2 p/ `' H <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>0 a% L% g* X) U1 a9 C& ]) U2 a
</div>+ {8 D2 O1 A% y% o: L
</template>& r: L/ v( N* c( @7 O2 K; F; Y" Y
3 d7 Z* @4 t' ?% o! n; q5 g; B% [% D2 F7 M8 @6 f
结果:
j0 ^4 b7 K' M# N$ Y0 V' E1 c4 z. `; I! j) G# [: \2 C5 d+ d
5 Q: E# S3 P2 _; ^8 s$ b) j; I# JActions:Add ReduceStateValue: 5GettesVaule: 6! |& l6 t" D; I/ g8 I8 r. J: u
5 E) {% l; w6 \. z/ O ]! @3 e0 ?* }6 K3 a& i. r+ `
& f& D j% R2 `& @( e( w) Q4 q
0 t% w( d% `7 o- c8 x2 ^$ C {0 m
' D6 T) ^# I6 V, d7 w; Q ]1 I2 ^
9 ~+ `% ], A% X7 A- E
2 z2 G0 @1 W& Z9 I' o(6)Actions:9 k* P! d* `* U* L* B2 E) n& G+ a
我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数: ! r$ J S4 r; _9 Q0 n9 T. t, E
! J% ?, j/ e W# g% \( d% qmutations:{! j7 m! }5 y/ H$ {" O( c% l
add(state){
: x+ |2 c/ H/ Z- H state.count = state.count + 1;
^7 j$ w* l8 o. l: f% R; X% g },9 O' c2 d: u O5 g* w$ j
reduce(state){
" s/ ^0 g/ E( f" [& ?9 P state.count = state.count - 1;
% a7 I5 p. Y$ S; Y }
) f7 i, Z0 y7 Q- k2 C, F },
7 m5 r ^; Q) X. R6 F actions:{
5 j) g9 Y& W( C8 W5 m3 i addFunc(context){$ t$ w2 S; v+ A$ B- W4 o
context.commit("add");
# U$ x1 u3 `$ s. Z* K },/ J1 W* d" a; x; s* \7 e
reduceFunc(context){
8 ?9 C/ p3 Q" @' ? context.commit("reduce");5 o; ^+ p) V6 T$ O1 ^" u
}
+ g4 \+ U, ], O) @ }
, P' _4 M5 J& o) L) q: P
2 t- R; O3 {: g `/ e1 {6 y* b: A! C3 D+ Q1 y. i \
7 E8 P1 R7 N: v) G methods:{7 F. O7 V) `+ M- `0 q$ t
addFunc(){
; `5 c" M0 g1 P& q* ]! D4 b7 G //this.$store.commit("add");1 T8 d! H9 q* b# ?- x3 f
this.$store.dispaTCh("addFunc");* S! i# i- Y& d' K& W
},. Q; {4 D1 V; Y( F
reduceFunc(){
& C! o. _; V4 x! m& _6 K9 ] //this.$store.commit("reduce"); W0 h- W1 ^" Y& m7 d
this.$store.dispatch("reduceFunc");
0 L5 G3 A, [2 \: y/ i; L, o }* p4 D. x" I+ Z
}, C' J3 Z* I( e) _7 E% z) f4 p
1 D9 Q+ N) N' [( } s$ j0 H
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
7 @! [. n0 Z& [8 a+ f8 A2 h实现效果一样!!!!9 `. ]) {8 l& b7 h9 ?6 ]( L7 H
+ g% G' T7 ^& h5 a7 F& |% P# k
9 @$ U5 `& f. m' V0 _9 d. B2 I
_% b m* F; h K2 `$ |' X/ N0 E7 V+ L- M
# h4 F( V4 Z% G% x( g " T# c6 _ i$ ^* V' ^/ \- P; t3 @1 i
5 o) S0 v) M) t' Y
# P/ P3 e& N* Q$ O$ @7 E- c' `* _8 R( t5 N- ~
2 Z7 [- C2 o% Z0 v8 D& }& g6 G2 M; N4 z3 Y
1 r4 n. t: M+ C: {+ a
; M" P# v' K% |: c: a8 V
/ C! R+ S- U! h, H' t a* U. c* d7 N9 u
, ^" _' z( q. f9 X3 H2 h
|
|