|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
×
Vuex 的用法详解
4 J! w% X6 a0 I6 o) }
1 j; p; A4 s/ P7 |本案例测试下Vuex的使用,创建一个新的web项目
, H; q: y5 X7 T: C( e; S" Y# ]Vue init webpack web5 c# @; @$ V9 q( b$ V( \9 `
安装vuex6 s: t' n) T0 J4 f2 r: z
npm install vuex --save, {% H6 l" r l
启动, npm run dev,打开localhost:8080 即可1 `% p: h* O! T8 |# A6 Q2 d
; {9 P3 O, X1 F: B
* A: @% ]- E) K; K) @9 [2 o
(1)引入vuex# O' e( s3 E2 P' G6 q
创建一个src/store文件夹,创建index.js , 引入并导出store
) u6 c/ Q' h1 s$ b7 h5 L5 |4 p. qimport Vue from 'vue'" n: A; g" K: g- V7 E
import Vuex from 'vuex'- A( ]( M7 N$ Y1 r2 s
Vue.use(Vuex);$ q" s3 C4 |) y6 q. x( N% K
const store = new Vuex.Store({
, y, Y. f! y) h+ @6 m- f) i( h+ x8 i. \})$ U% \) e4 o% i4 f* p5 v& K6 w- J( K
export default store;( W; f' `- O. `2 ^' C
% ]! S& Y4 s3 |! v7 b; Y(2)引入store到main.js
7 q6 P9 U- L& eimport Vue from 'vue'
& B5 o, Y+ Q7 U& F) L+ w' s9 bimport App from './App' u& R1 W) ^# L) ~
import store from './store'
+ d8 V+ K& d" m: J: e" d2 G* w' C# [6 H9 I* a
Vue.config.productionTip = false
3 X1 y9 y% M* c ^5 H) i
; }! [; c# }$ p1 N/ }/* eslint-disable no-new */+ ~/ x6 ~5 t* P6 U
new Vue({
" K3 h( V- ^9 F0 X3 A el: '#app',; d* Z6 \9 d5 C7 p6 T
store,
1 H% L3 d/ F5 ` components: { App },0 Q8 B5 n; ^( M: D6 G& l% y
template: '<App/>'
. n4 D1 ^" ?. N: B9 W0 p})
9 W, }3 @; { L8 J, }
& o: ^" d5 t7 @1 T @
% v7 k! @3 K" o' n2 _* [" k m V* S8 R7 H4 q! @
(3) 修改 helloword.vue ,先使用state获取值进行测试
9 c0 T; a/ T& z @& rState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;0 [, I' ~5 M* v) {( w2 t' ]: i
const store = new Vuex.Store({, n6 @* h0 y9 M6 c% z+ d
state: {7 n8 e; k* e/ J v* E4 p6 A6 u8 M
count:1
1 Y& J/ e* o4 c! Z }$ E, D; h* A* U4 S
}); c& c& }9 P, }. T9 O
0 q" q! A- E8 n; T9 S B3 n7 ?helloword.vue----
4 A0 p3 @( x0 c7 V3 g<template>& k% i$ C, Z- v/ g( g5 a
<div class="hello">
% {) j' o: f- t, \# v: u& k! |8 y" P3 b9 v( S: Q
<h2>{{this.$store.state.count}}</h2>' \! {0 J8 M' V2 ]
. T) Q- H6 h: c% E: }# y. u
</div>
" g# D6 D6 o$ w0 S, i% Z; `: s</template>
# _8 T5 A& i" P; u; e9 l7 w
' I/ r0 L2 F, \9 ~ k6 _# N' N# f) |' {
显示结果为: 1
7 F! [; a" ]7 R- h% ?
+ g5 ~' o, ~+ l* ^( V8 s2 k, T7 r: }' l5 {8 M$ a; w
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
& ` z- \8 s2 f T1 a- o O) e: J9 E) c
const store = new Vuex.Store({, y% y- F" z" B# p+ O
state: {) e. B$ t' X- a* d+ m2 S
count:1
. R+ D& J- R7 s. z8 r/ V& |1 m },
0 z& k' r9 S) s getters:{* K; E$ l3 l+ ~; x3 V( \; O( ?: N
getStateCount:state=>{
& f1 D6 I, H# p return state.count + 1;
$ I$ a, Q" q% h2 B. g/ e$ e; ^ }
: S3 W9 j; `+ t }
4 q% `1 f1 J* T2 M: h4 `! e# r})
- e# _5 f0 z% O9 b* Q" O- a
5 S: i: m# D9 A. D! g- L" e<template>2 O! O: G4 v$ h" p& t) Y$ g
<div class="hello">
4 w n0 Q5 y+ W; S
$ s2 I' |7 a+ R9 }1 {% i& N <h2>StateValue: {{this.$store.state.count}}</h2>
$ C$ D, L. t2 |- P! n$ U( U; x3 i <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
; U# h4 ^6 S' ^! k9 s; S1 h5 f </div>
# Y& r6 b6 Y8 ?+ U</template>4 Q" z1 Y# U' `$ t/ y
) N( v m2 K% N% \( t% A
% V8 w5 x: n* X* q; ]显示结果:+ H+ u) h! @5 I9 M C, y
StateValue: 1GettesVaule: 2 ]* ~6 t, R" u
& y% P) [2 n& ?3 ~4 U t+ [2 u
(5)0 i1 u5 p4 n% I$ M! T) \
Mutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值: 0 F1 Z- {( y* K7 {7 K
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
. o5 X1 e( j/ I8 m& U+ P' K# amutations:{
* F- k) r5 w: m& o$ r add(state){
8 H* \! m C2 Z( }2 O0 t state.count = state.count + 1;
/ l. i6 E* L' P$ E! c- [ },
% |/ D$ ~. f& P o( A# F/ b reduce(state){2 o# k; U" l8 m o
state.count = state.count - 1;
: q, ~& P: q o0 _2 p }( m: U: ^/ M0 [2 g0 B2 K: e4 t
}
) E' g, C2 X7 U& b4 a<template>
+ Y9 }2 |7 F& D; } <div class="hello">
6 Q. {& E$ H! j- G9 [, L <h1>Actions:</h1>
% K# R# n4 p* q c# u <el-button type="primary" @click="addFunc()">Add</el-button>" u1 A2 |& S% H
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
( f9 R% x( K0 u$ i# X7 V8 i1 A <h2>StateValue: {{this.$store.state.count}}</h2>4 k0 ?3 k: V. z( b3 F! x
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
: Q9 b; f6 H q$ l* m" t </div>7 v n( l1 g- d
</template>
( g/ o# y, Z" w7 T- u# N
1 f: A& n7 G) W: m! X/ R9 B+ S, D. z/ T# W
结果:
, ^& I! W; y0 A4 n
2 B4 ^; c# w, r/ N) o: Y- ?4 @# u6 P
Actions:Add ReduceStateValue: 5GettesVaule: 6. Y X+ s7 t4 M: \# [
, j4 j5 f, d* l% }! f- A9 C
. x' i9 Y. z; L1 ~% u, W
9 N3 E) \- L. G6 S8 b
+ h7 Z" D2 b. B6 ]/ H
% {, s; I0 ?9 b
' b3 Y9 X0 K# N* y
8 Q* A- L$ W# s) N# @
! w1 }* j0 i- Y1 F0 A6 ~(6)Actions:
/ U9 L; X0 O) E( J我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
+ }- G1 V. L" w7 {+ D' r; f" P ' ? M* p( m$ ^& H3 X5 V; x) A
mutations:{/ i4 k* T4 z7 |( Z9 l5 x- N: V: [
add(state){
( A' I; U* Q1 e0 r a% D state.count = state.count + 1;
/ t9 y6 D. P- e },
' m" }9 b+ B5 Y. L reduce(state){. U7 W9 }* N' a. T# r0 }
state.count = state.count - 1;
0 W8 k3 ?1 T1 @3 J, V }
/ {* o& J) \6 N4 A) P7 J, Z+ _ },
5 r* H. p' P) ^( W) _7 X5 Y actions:{; u4 l1 n* \4 ?
addFunc(context){% S* O; |0 @0 Z5 F# F" S
context.commit("add");
7 h5 z& a" V) D },4 {- r9 p* K; G4 N, ?; Y9 X
reduceFunc(context){
. R' B4 N% D% ]" `5 n context.commit("reduce");
2 h" k, t4 l& O4 ~. h }
( }: T+ s0 v, A1 c7 X; [1 N }
4 C% |) W: a2 y3 U9 u x. z! L% g7 |+ o, T: V
, s& Q+ b k( k: X/ V1 s( J& s9 z , A6 G, T$ ?( |5 J& r& t6 @
methods:{
* }4 ~3 T4 \. ?* M/ V( G0 k# h addFunc(){
' {0 k" u; k/ C% c- h5 ~" h: A8 r, Y //this.$store.commit("add");
. r6 S2 j8 p ` ?) B this.$store.dispaTCh("addFunc");
7 n6 r% Y- j& n6 S3 B+ m: g },
) [! Q: _1 _+ s) @ reduceFunc(){6 h: @5 a0 J N) M. Q
//this.$store.commit("reduce");. }3 G) m0 \3 Q: M; c3 \ Z2 m
this.$store.dispatch("reduceFunc");
8 G- q# g3 W/ v; [& S, s% V }
; X; Y( y* W- O! h( Y2 Y& h# f }
+ u) i+ C: Y# x3 t) _8 q5 j/ w4 D% p: o2 f, D9 u
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
, w4 J% x+ R6 a8 L实现效果一样!!!!
9 H3 F7 P8 M% ]+ \0 [$ z* }& G- ^8 o. k: l+ |; o. Z
9 r; Y) v' q5 n
3 v7 x8 H! H+ _
1 t0 g/ P# I4 W/ t8 E. K( W) K# t; m
; a O+ B6 e+ o2 m% A- K6 O
8 I* Z9 x7 k* ]0 K7 X+ z4 r+ I% L
! c- m; q8 o- w
0 y/ Q0 d% K3 N: f* d4 X! u8 E. {+ M1 U8 W2 x
. g+ ~6 Z3 C6 q( ^2 Q: J1 @8 U9 @
- f4 h* c& h( P' S5 k. d# J; S
* @4 m) y' o( n- \+ D2 `) W
' F8 i& ~% q b c. {$ M
, { a5 Q* J% J* |+ g" L
6 V+ l4 @9 @! [9 }6 j0 \ |
|