|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解1 l5 ^7 s, H& ] A3 v0 F7 i, t3 V
* B+ R( {) m! e4 q( \! b本案例测试下Vuex的使用,创建一个新的web项目* O& q3 F0 a/ u N6 {. ^
Vue init webpack web
H: V5 q% z6 P安装vuex+ d, _5 ?' I1 g: P. Z
npm install vuex --save+ F7 P. H$ R* o" u+ Z/ [% Z# e
启动, npm run dev,打开localhost:8080 即可/ u. W- A% t' A! b2 o$ w
4 M+ J, h/ T X/ B0 N
$ _! e: e. z3 n4 ?(1)引入vuex
[& D, L3 _- H8 f& v创建一个src/store文件夹,创建index.js , 引入并导出store
# d/ C* u' E H( ?4 Z' Zimport Vue from 'vue'0 G+ _; f- H1 c+ c' @2 R
import Vuex from 'vuex'6 Q [1 {/ `" u- }4 v$ H- C7 f
Vue.use(Vuex);
) v2 ~$ I2 C0 b6 dconst store = new Vuex.Store({8 U- V! D1 D: t) ^8 C8 X
})
) m- \+ i+ y: x# ]. jexport default store;
9 V% T* N+ o) O) q6 Z- {' ^1 W6 k! H; j' f1 ]& x8 R
(2)引入store到main.js
. K; D7 U: k7 m2 x1 zimport Vue from 'vue'
& j$ g$ X& l9 }! C* F; oimport App from './App'/ x4 l, }9 V6 d D
import store from './store'
4 B P* N" |4 R+ |9 [( E, x
0 A% L5 j2 |% F7 ?3 `" o: yVue.config.productionTip = false5 g* Y+ q t8 Q) c$ h. F$ C/ D t
; h! G% o5 `, g; |* {# |$ J/* eslint-disable no-new */7 `$ Q O; G3 n1 G
new Vue({
3 i# ~4 Y. O4 x: ? el: '#app',0 |4 W8 M- u& c
store,
! l5 n$ D/ _7 v components: { App },
9 w& A: O* k, g0 c* q: D2 c template: '<App/>', P: F, h4 D- v- G+ e
})8 V* |( k6 |" k2 F9 U4 K
4 v% F0 H" N$ e3 @3 [; f* R7 `
% P+ g. u i. a
5 E; Y! E( H2 u4 | [, Z+ S. L
(3) 修改 helloword.vue ,先使用state获取值进行测试
) R9 ~; v1 Z# `8 ] S- }) zState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;5 S5 d3 i- z, {, h8 c# H, s
const store = new Vuex.Store({
9 e9 J# ^/ z+ d, t# o' h# Z state: {( H! v' L' B9 s$ g
count:1
& B4 C' p: P0 ?# x5 d+ `( i1 H }
) h# Y' q# F! @! l+ u})& T" w& R( a" s: l+ ] O
- J8 i! k. Y3 x# w8 q: Phelloword.vue----, \# u* b& |, H$ M0 b; ^! d
<template>
- V& t6 z8 Y: n, R2 a; A, p3 b( a <div class="hello">
$ s8 j& g* { f8 {) j. I
6 t: l! l; @& Y" B3 J5 T <h2>{{this.$store.state.count}}</h2>
. w* {' k* v! I( a5 R5 k* V4 t0 S! ]3 R
</div>
. ^& [4 R7 K8 Q</template>
3 { ~: w, d1 |: {8 i
3 D" Y6 l' \/ ?8 w4 s$ V) Z3 C; R; ^) t7 Q) z3 ^0 k8 ]' a
显示结果为: 1 6 Z" J. w, N3 \# V/ Z2 v5 Q2 ]
2 u. o" t( u& r; A6 a0 y, m; o9 R& T# Q
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
+ Y. [# X: y, F5 \; a6 I' k- _4 z' w3 a- |6 J
const store = new Vuex.Store({
7 H$ v) L( D K/ {1 ^& u, d state: {
* x) S; J7 ?4 { count:1, T" M5 ~1 Q' |3 u" J' z: H
},) y! w( w3 [0 g/ v0 q
getters:{3 o7 l/ q- G0 V3 P6 |( ^' }
getStateCount:state=>{1 J6 ]( U3 V( p+ w6 o @! [: R ^, X! L: Q
return state.count + 1;5 o) W4 J) H! U6 S( B! T
}, h7 [# z; H$ m- J% I2 y
}; J3 X( X, F( \( t
})( R) b" X4 K0 P( d
: U3 Z$ f* b! |<template>1 H' Z" v) I) R- c
<div class="hello">8 x: W$ i! z; S5 d
, y- V2 R8 a: B/ z5 J
<h2>StateValue: {{this.$store.state.count}}</h2>
7 C8 ?6 S& w# M$ J' n+ o <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
2 n: q5 c" o- F# u6 U$ R* n7 M </div>% v5 q9 N& a3 L# H2 Z7 m
</template>% P* g* `4 N, P3 \0 {
' U$ O) E* ^: }: n/ T
9 S9 e* r1 m! w; X+ {+ ~
显示结果:
0 k* T9 D5 P) H; {+ _StateValue: 1GettesVaule: 2+ |! t8 H: R: J+ M: ?. m
# l$ A" T1 I0 n. w0 P7 y9 R
(5)
" ~" C2 q# u# c6 y# PMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:
" B4 K% b5 p# {* h修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:- n' P) Q7 q' U
mutations:{& \) `3 w# ?* Z( X8 J( x8 ^9 C
add(state){9 ]& V Y, c) W7 c6 ]; x; N2 R8 X
state.count = state.count + 1;/ _0 A$ I8 n* h0 m5 p' M' D
},
- w" q( Z- U. a3 _5 I9 l, K& I1 p: r reduce(state){
6 ^% |- v# {! ?: E5 b( H. i* j4 Q- A state.count = state.count - 1;$ v$ s, q: j4 t2 N2 `6 N% f& w
}4 P5 U* n4 \6 f; Z4 }2 t
}
0 e' R1 m$ T8 M) G+ o! F7 \<template>
r3 R @" Z$ N4 h; U8 W <div class="hello">' ~# l" d6 O3 B
<h1>Actions:</h1>8 N; B2 A! `; E9 _% @+ `% G
<el-button type="primary" @click="addFunc()">Add</el-button>( X8 l0 v- \6 {- L, S& X
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button> e" a! ]% X/ |+ X: l" _
<h2>StateValue: {{this.$store.state.count}}</h2>( P. N% F/ L" F4 D" `3 D8 o
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>3 {- u9 m7 h9 H2 y7 q* B: H$ Z* Q
</div>
$ s( g1 h# N( [7 o: T</template>* m( N. z5 c" T# H# d. H6 v% F
4 R1 }1 V, e1 g
2 q- K$ }7 l8 {2 _结果:$ M& |! u+ D9 c2 I
0 E4 z5 d( y# R1 ^
( B4 F8 L1 G3 B3 L: h4 h
Actions:Add ReduceStateValue: 5GettesVaule: 6
U" J5 I5 ^4 ?& }, B+ a: Z4 t3 r$ ^" |, O: ?
9 M0 f l8 _! s
. ]' t' X' o7 v
' [! G! {+ Z$ H. V% |( l9 B- I, |- w5 e
8 H/ \$ d' n% f
# ?. B! H' Z" r3 F8 o! E3 P+ X j5 U3 T
(6)Actions:
5 R" T! q; k7 `$ `" G9 k6 {我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
0 F% m6 x) v, c$ `
1 k7 \$ r( H, v* Q4 vmutations:{, N7 n2 [) x! \/ p7 B9 a
add(state){
, I& Z) O0 B0 t5 \ state.count = state.count + 1;
0 H/ l9 M! o) F& {* L% Q. ] },
( x' p& S6 O; H reduce(state){" i' Q" q6 r0 L( C% c4 v7 |: h( X
state.count = state.count - 1;
3 z0 J! }" D& t! {( f9 _ }0 k) U2 Q6 X8 ^5 y0 d/ j
},7 ? K, f$ m! Y/ f! o, F$ B
actions:{
( |, X# m) H" M addFunc(context){
$ t2 c2 a; Q+ H; |" ?" A context.commit("add");- r: n1 x8 M) r. ?
},
0 ]( m2 V/ L0 n/ p& V3 K reduceFunc(context){
/ A' R; X# ]; p" v; [ context.commit("reduce");' x( t L _- M! n% z' H# ?
}0 P+ g4 U* f* o( F; J% Y
}! d- {! k$ k$ t/ ~# y
3 C _; b# Y; H" N' k
8 ~5 t* j: O& S
r. A/ A: Z5 @6 n5 M0 y+ y methods:{( u c& g0 p6 l* G! _9 B3 h
addFunc(){( i% F G: \3 \- w( n
//this.$store.commit("add");
& o4 g/ T6 o" ~0 y$ {: w/ A this.$store.dispaTCh("addFunc");" f* V) D! W* s0 U
},& `0 r" `0 J& K6 ~
reduceFunc(){
$ e' B9 n' ? J6 ~: u# r) l3 M //this.$store.commit("reduce");8 ?! Q+ d* f9 k6 E; y
this.$store.dispatch("reduceFunc");
" j7 x5 R# C' T+ N }* K1 O' t/ }8 } g
}
9 \( U. \( C3 {- C9 G$ } J; D4 s5 l- c# t( U' y9 I& C
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
$ F0 e% T" w% B5 B8 W" j9 [7 y实现效果一样!!!!6 Z8 V2 [1 L4 L; Y* y. \! R' q
( p9 f: b* ^" d( x# i6 d7 T- Z3 X- Y3 r$ y% e; u
! r+ z3 {* m1 X% t' @
4 q- _! t1 {" n. m' |% H
% n0 V# I8 }# x- v" G 7 {; `9 ?5 S( \5 n D; u- D7 i+ p
' c5 j$ R, C8 ^8 o0 M; T/ R! e
" J+ A! `2 E3 g$ i) [6 ]! z, }/ w: ` ^, V( ~3 {" R
% c7 a' g9 ]! D; \# x P8 G5 L
8 y+ n5 w' |! T( U
+ m4 N* M v" R
. ~; U) b* e: |/ Q, y' i# O" m# C# w6 D
- K M4 \8 s0 q* t
. ]; W6 q; w3 M7 T |
|