|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解$ y, E6 n$ B \; V4 r) D
) _( l8 r" D" k) Q本案例测试下Vuex的使用,创建一个新的web项目 H+ A$ O# [$ {6 d
Vue init webpack web8 W4 u) n, E4 w% e. ^
安装vuex
' y1 V7 g6 b+ i: j# inpm install vuex --save
+ E8 d3 W/ e0 Z: H' C# O2 Z启动, npm run dev,打开localhost:8080 即可
% s+ C5 M( H+ [% U3 q" [3 R9 M4 o5 U7 o7 ?1 E
3 k1 e: W/ e7 G, ~5 `0 w2 b
(1)引入vuex+ S" }/ P- g! n) R3 K0 w* G
创建一个src/store文件夹,创建index.js , 引入并导出store. X, r: Y* [# Q+ H+ H% d* `3 u
import Vue from 'vue'1 w2 [5 x5 a: R# t$ E3 w
import Vuex from 'vuex'
$ y; U# \) H& a" C; d# W3 W: Q1 oVue.use(Vuex);' l. r4 k# [; n1 E% j
const store = new Vuex.Store({
# z( I0 j- A) c# {5 D8 n! R; A})' K: F- M4 c- y7 e+ a
export default store;
0 U# C2 l6 y3 {! h
8 S( h# q# R, ~& ?2 o(2)引入store到main.js `* V7 o5 o) p
import Vue from 'vue'. y r+ h: [3 p* Y! Z' K# _" s
import App from './App'5 ?) V. j8 {) h% k8 O
import store from './store'
7 L; W! D5 p2 Q! |' J+ j, }
8 U D5 E1 ~' MVue.config.productionTip = false6 r, |$ T0 o8 n6 c/ l
. ~# `& @% G+ A) j0 Q/* eslint-disable no-new */ t0 }* r( ~$ a$ C: v! @( k
new Vue({
/ e. m0 h/ C/ [ p0 `* g el: '#app',
/ c" W8 O, H2 D0 r store,4 e4 B# J1 U& C4 Y$ q
components: { App },& _, e2 U5 `) w
template: '<App/>'4 d8 C E7 E$ `) @/ G! y$ _
})
( O, _( U P9 Y: d
6 Q9 q* d2 z/ E& ?4 L
$ Z) f# Q& M0 W# m3 j7 M9 N4 S" \. Q ]
(3) 修改 helloword.vue ,先使用state获取值进行测试. ]2 c: ~7 E" a8 A* Z8 H) b3 L
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
9 |7 j& D4 i5 P) b O9 dconst store = new Vuex.Store({, L# h) _8 p! N
state: {9 V8 r) U/ Z; O$ S. W \
count:1/ e( ]$ [* j" B% p" }8 j
}
C ]1 ?% `3 `' m})$ s6 X% |/ b1 t
" o) S. l4 [9 p! @1 \helloword.vue----
3 {2 k8 N& a; |8 {2 f<template>
. Q4 X+ `- \' T! S5 W! s* z/ K: ^ <div class="hello">" F) L- j: u K" K. t; C
. s! {7 e% f; }% G6 ^. Z" t, A <h2>{{this.$store.state.count}}</h2> @$ g! d: E/ S8 v3 L' G
% `9 i# n* p1 n+ K0 m& c4 e
</div>
6 X" P/ c% e0 ]8 K: {, [* R</template>
/ L, \2 ^8 @: t1 Z! G
X1 G# K' P( w8 U' Y" E- Z, o! Q
- F* @$ O8 M+ f \; ` z显示结果为: 1 , }, r5 r5 e: I! j
% v9 F7 }0 E- D1 ^' @+ ]3 v1 {) I# U
$ V/ @. Y0 F7 y+ ] }8 A
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:7 [8 S! p5 [+ O+ e2 H
3 k+ q# w: U7 T8 fconst store = new Vuex.Store({
8 p' p' a, ^$ ~) W E* }' }2 M state: {
4 z6 x/ Z) F. _1 ~4 b- E count:10 S1 q x% y* d( Z: p. h
},
; R% v8 k: ]9 G6 E1 ` getters:{
9 x/ j; G: m( h getStateCount:state=>{: U% w5 R* T& [+ \ X) o0 S
return state.count + 1;
& {) E# C0 f2 p8 i }3 D" y+ J; l; |/ G( f
}
) Q8 m' Q0 A% G ~( C1 i: Q6 o! D})
# o) s. C1 ]- G! ?: b3 `! w) \0 q1 `7 X0 E/ z/ E9 L0 N$ {
<template>7 x: a- ^, x( u. l
<div class="hello">
; ^# _, [8 P7 F: ] J- C0 p6 x( X! X' Z8 |
<h2>StateValue: {{this.$store.state.count}}</h2>
5 E1 J$ [2 S. ?% ?( J' ^# M1 P <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>, ]8 w: d; T+ `6 w9 W4 D
</div>: E3 b. v3 q, V1 j l
</template>
9 e, l$ C" F, J& k2 p
. T& ?5 [% P0 p$ i! n( k% {; G
/ F' Y8 ~0 _- L) r- _7 B; o显示结果:0 R2 s7 ~* y' K; _0 S
StateValue: 1GettesVaule: 2% [6 Z" C( \* J* Q7 V% A
7 G5 v* K2 y5 q$ i4 X. G(5)
( x$ ?' k- K: V7 R9 pMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:
& q0 I, c2 ~& H0 y修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
5 Q3 }4 X0 E2 j) T2 l2 }mutations:{
. I6 j9 y- r$ y' F- K add(state){! x* d3 }8 K. L( _+ F! k
state.count = state.count + 1;
) @/ Y& r% f+ L6 j( O) F7 N; | },) g! x( q- [9 u4 Y7 d; c& o+ s
reduce(state){8 i- T# u6 {2 G1 j6 W9 `4 K: F
state.count = state.count - 1;$ I' x( r. Q# y, D8 f% r2 w
}
/ [3 d2 H$ T2 t; k3 T7 N }
: W5 j* `, y- ~ V% ~0 R- E* Y7 J<template>7 o% J6 w# \. U X P
<div class="hello">' t9 i1 X( x& E4 C& A9 j
<h1>Actions:</h1>4 ?: z5 L$ a0 o; h$ M' u+ s4 `
<el-button type="primary" @click="addFunc()">Add</el-button>" n K; _$ f% `: R* W
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>: n+ |& L. \! F
<h2>StateValue: {{this.$store.state.count}}</h2>
& y+ K) h7 P2 q9 t+ p5 ~ <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>! Z6 i1 u8 Y( G9 j0 E
</div>
- }. _* V; t1 O/ Y. k. J2 p</template>" H$ M/ |+ e) _4 D7 c
5 g! q3 `. t, q* Q% n1 s
$ J7 l+ I' ]; X+ I结果:% z; n4 ~/ H# O: D9 B0 s
; Q; ~* z7 J( |* E
( T8 S/ W, e+ J4 n$ f
Actions:Add ReduceStateValue: 5GettesVaule: 6
) d A% N2 G; K; y2 ~. i& ]* X. K% W
1 t) F4 C/ h. i' I
+ @; D, o$ S: a$ y# G+ b1 L
, v% ?# d1 T; H: h" b+ W
" c9 g7 b P2 b5 c* o& I$ ?
z/ F) H/ J8 \# B w
) ?; E, M/ d$ I$ ?: Q' c( D, B: F$ Q! c
/ @. B a8 X3 X; g(6)Actions:
( e& v1 u- p1 d; c+ M- M7 {我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
8 D# t0 `0 P* m: l0 B , R9 N, m2 N3 d8 _" @
mutations:{
) X9 z1 V/ P1 z! K add(state){
* k0 D# D, Y8 b( A8 x. ^+ \* Q state.count = state.count + 1;
& Y5 {8 ?6 _# r# l: h) ~ },
' i0 W; X% z* B0 L6 [- L5 y3 o reduce(state){/ j0 `* c5 J- x8 Y, r5 d; r; \ g
state.count = state.count - 1;
5 w! p$ U* p- g }, j g% _' p0 X$ h0 R
},6 [! s/ `/ T Y( q
actions:{
! w: }3 s: {2 g" Y2 d6 l. N' \1 X/ k6 b addFunc(context){
9 u# e/ l3 c; i+ w. b' W context.commit("add");
: z; I' C# }- t: `5 Y },
5 V! [" z3 D$ Q9 \9 w reduceFunc(context){
4 Y3 B- c7 \) j+ t4 ?- h3 c context.commit("reduce");
1 \) o; e8 C7 c! w% R& Z$ i7 q; Z) t5 @2 c }7 ~& z ^4 S# |7 \7 f3 V
}& y. { x6 a6 i2 F
! z0 |+ _. v4 T& G# X( u+ w3 Y3 C0 n; I- b6 q
8 [, n/ J* o' L6 M* k
methods:{
: Y8 \: C. P8 b! ^ addFunc(){
- x8 g" T8 l$ ?" t //this.$store.commit("add");' G' H+ k; ?8 I# W: W
this.$store.dispaTCh("addFunc");
5 D" `; N0 x% z8 d7 p" R% V },
# B: M7 b. |/ r( t/ {) j reduceFunc(){# l- I$ u* A7 G) r4 |0 p
//this.$store.commit("reduce");
' @+ Q2 Z! N+ b$ X! z3 P this.$store.dispatch("reduceFunc");7 l+ o" ]! p$ {8 [, p8 _
}
6 D) h' u/ R3 w6 s6 U4 F5 _ }0 h2 C- O% _/ Y0 U: m
1 S8 R4 G' _( r9 }- o/ x3 p, M* q# W这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的% ^; Q' R; Q& |9 {9 r1 l5 [
实现效果一样!!!!7 }5 g1 S( e1 N! ~6 Y
8 p/ R$ f3 v7 Z) Q* n( T0 @9 ^ n+ ^# r( ]6 {( \
0 |; G: ^- _/ n' G( }) U
$ N+ \' G$ x. t: h: T7 H
6 T8 _8 y' W+ b# d/ Z3 ] : ]+ Z) ~% L; a. ^
1 T7 o8 a' J% R) g+ Q. n/ I7 G4 K8 N6 h
6 n6 z. L/ P; Y1 Q, f4 ]3 z$ }* j7 q( J) B& }) ^5 \3 a3 B" j
/ o" C, c3 b( a4 Y k/ U
& B) J: b) ^- E* q* }1 M
+ P) ^& _9 ]( A
$ z$ V2 x. T' k8 Z3 z& v, Z Y/ A; {8 M+ ?8 j$ W
3 T7 W! @/ T3 L0 J$ K
; B+ \- `+ `% Q" _; m4 Q
|
|