|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解& z% u; {# `3 Z! t9 X& J+ \
8 K- a' H& D$ Q' h- X
本案例测试下Vuex的使用,创建一个新的web项目
! k, E& |* Y! J4 m- G8 f+ V* QVue init webpack web
- g2 r3 m' P, ~6 P- H安装vuex! [2 k8 C8 M/ ~6 P8 t0 J& H4 {
npm install vuex --save$ x$ f% W9 B, y5 E( G% O
启动, npm run dev,打开localhost:8080 即可5 }. q* t; W9 {" M6 q4 I& w+ f: Q5 k
" ?( T( t+ V9 R6 V3 e: }
- L$ v5 W! Z. I& ~/ Q- d. y
(1)引入vuex
$ \! N3 [( v5 q创建一个src/store文件夹,创建index.js , 引入并导出store
' Q* f- l9 @: S$ D7 w# ~7 ximport Vue from 'vue'& B. ?5 Z9 B! B8 N& g' X( Z Q' P
import Vuex from 'vuex') o+ i& h& U/ f8 W! d- _
Vue.use(Vuex);
2 D6 Z# N3 d1 C$ w' M: sconst store = new Vuex.Store({
' H+ f3 Q; q+ W4 w7 Q})
+ w4 Z: O& r2 p7 I* Uexport default store;# x2 L7 O5 B$ ?/ a, V
1 Z8 b: V+ i; p8 P; a: m/ A1 L(2)引入store到main.js
7 x$ V; t6 s$ ^; ` S# V* r Timport Vue from 'vue'2 Q9 o4 [, N3 a. F9 a
import App from './App'
% i4 h: F% H( Q+ T0 V e; @; _import store from './store'
8 ^# ~5 h" ?1 E; ^
0 R; e+ R. K: d) @$ a$ JVue.config.productionTip = false( z; [3 x- e9 [% L9 n( x
. P0 j+ c3 |# a/ ]; u/* eslint-disable no-new */
8 d, W1 k; ]9 W- vnew Vue({/ X- A# B- Q5 t5 g
el: '#app',
& f/ J: w. i: ]6 T store,
: Z( g: j y" E6 \3 N O1 a' T. v components: { App },$ ~! N% a: e2 `% k
template: '<App/>'
- r0 Q; J4 r7 z% j f' `; J T0 v})
* m6 ?& b# P$ S. g2 ~1 Y5 z: `. A" ]$ _, l# Q
& b) U! n! z) D7 V
2 Q D& n% i' p. T' u# k(3) 修改 helloword.vue ,先使用state获取值进行测试6 }. q# L% k; B( B5 @
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;0 r1 d: e6 W, m3 B- e; M
const store = new Vuex.Store({7 J! L" P, H2 R; s
state: {
2 ^; G/ Q; j' U count:11 N2 l8 J7 A/ y- \1 x* \
}
6 T, K& K+ ~4 p. @# s4 Z6 E})! E, V" F9 [2 f; V( w8 ]1 ~- F
: R7 f4 v. ]- G( F J2 p+ m" }
helloword.vue----4 G. L" P6 H# V
<template>
" E3 R' @; J2 `: [1 C, \2 g; ~5 V <div class="hello">
/ D2 H6 }" a. b0 X' q9 o% h T7 W+ w0 {0 M4 |
<h2>{{this.$store.state.count}}</h2>
8 M. B% z( O0 }5 o, ~
# Y% @4 e. c# p. G; j5 ~$ Y. C </div>& s4 n: l4 u" X& v6 {
</template>0 W3 N$ [0 ]0 ]3 l2 @
0 `9 c6 t% W) K; M5 `. o
* e6 V0 ]( C6 j2 ?
显示结果为: 1
& @, E/ q- f4 R2 K
/ d4 k4 O8 K9 n* w( y% ~% h2 e& a3 u! \
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:# c: e( I+ y* ?+ C1 ^
. T4 P; I5 A6 g7 Zconst store = new Vuex.Store({
" N3 v3 B. f2 R0 K6 X state: {( ~, B( k/ Y) h0 q# t- U+ E
count:1( A$ ?; N' ]0 ? M1 m! Z
},: W' n. I+ H. b# d4 F: n
getters:{
) C) K; i* e: N& f6 r getStateCount:state=>{7 ^! ]- d r. u X2 k( D0 E6 N
return state.count + 1;5 T) W J) z0 S
}
% ]! U3 L7 y+ Y s* a# X }
& ]* h ?8 F- z6 v})
* B1 z: [* N; J4 a7 Y' e k4 \
4 ?4 \# f) J7 U& B2 `; y7 J<template>
+ }% e) g6 a' s6 z+ E0 ] <div class="hello">
% ?5 e8 A) b1 h* R0 w, ?* D1 X$ S2 ^# K4 x: \9 m& Z4 }1 g- E8 [4 {
<h2>StateValue: {{this.$store.state.count}}</h2>
U/ ^3 q) u6 v1 D <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>1 |, {: }; E8 \4 {3 ^& h" u
</div>' a* y8 r f; a* w
</template>+ _( y4 ]2 D+ m- ]4 o/ v* Y
x* D9 v) J: Y0 j3 Z) j/ _
! ?) ?; Z8 X4 w) t0 C6 |) P: c3 d显示结果:. k- r- J- _- e0 m% j0 A
StateValue: 1GettesVaule: 2- K' M& a4 x! M
5 `0 k3 r3 ~4 ]" z0 t0 e(5)
) ?/ t8 Z {9 j. _Mutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:
% m6 v2 W9 }- B1 x; H修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:; b4 i; t ?$ }: w" c
mutations:{
) u' y9 f& v* n& y- `# R- [5 F+ ` add(state){/ ~1 `( x9 H6 j1 }& S
state.count = state.count + 1;
( [( {5 m1 q' V0 g% v },: f! ~+ q6 w& N6 o# w7 k
reduce(state){
! t+ A; f- F/ [& U; p state.count = state.count - 1;
7 C% J& K0 R+ z9 K( } }
0 b' @0 V3 s" S( S; {6 F }9 B- k; ]+ _: ?4 S5 t: s/ W" z
<template>$ s& `( P- _6 r2 o
<div class="hello">$ s% Q7 c4 x: e/ L2 R
<h1>Actions:</h1>
4 O( l6 C, p4 S! p7 l; D6 @ <el-button type="primary" @click="addFunc()">Add</el-button>- d8 p% E4 M }, h8 y! ]2 M
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
4 M& @! `* P1 B& v X. a$ R0 e <h2>StateValue: {{this.$store.state.count}}</h2>4 J% E) Q# z* D% {8 y, Z
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
& e& c& o) d4 B" u/ p+ v </div>3 l8 ^2 n$ M0 c. t1 g
</template>$ \! g- m6 j1 `1 ^$ P
9 o- M1 h7 B! m
; e! d2 q& m9 G$ {2 g
结果:
+ u2 o1 Q- x- I% _; y! r- r8 v4 `) _: |, ` c1 P7 k4 Y
( X% d4 R5 Z" K8 E# s2 q- y' FActions:Add ReduceStateValue: 5GettesVaule: 63 W/ o! k# r7 K! e( G. l" V: w
! j+ B- Z, a. _/ L4 L( B% F
' ?2 E C$ k# D% m9 D9 q' K6 L, Y! S) L9 A4 }
- F6 W G$ }* z2 p9 p4 \
3 a) N+ A( W6 F3 a) d
- D( a9 P, q/ @1 P/ N9 d0 I1 M1 k& u" i& p, X
- @, e8 O# ~' R6 h+ k1 j2 n(6)Actions:: R9 _4 D6 _' Y6 O- |! n
我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:
: h2 A+ b: u) n+ Q1 Z
" A1 P3 `7 h7 Mmutations:{$ r. ~! c. w" F7 L3 t" W* C5 T9 V
add(state){" i( b3 ?! z- T4 e
state.count = state.count + 1;
1 g3 R! h- f3 O+ k' N5 y* u$ I },% @' ?) ^, z" ~% R2 L/ N# {
reduce(state){
& P% x- K8 _8 X' { state.count = state.count - 1;% j# ]# {8 j) x2 S) E
}
7 w: A- d& N5 Q% _% [1 v9 x0 a d },
9 ^, ^0 V0 A7 g R& A actions:{* Z: }, f7 g+ u" X$ m/ H0 O9 L
addFunc(context){" A! |) s$ w0 }& r- S' y- X" ]
context.commit("add");
" a' r# J) ~4 t' ]( j- u4 J0 u },
' {$ }: V( I6 v reduceFunc(context){
6 a3 h7 o3 `- u context.commit("reduce");4 \, h' t8 h. K7 Z
}
' b5 c: }6 L3 x }
- r4 l9 H |/ _$ n; o& D* `
/ J/ F* p' n7 ]5 y
; h K, Y/ n% [, G+ ?4 b. e' V
5 a- E1 P7 m& ~# \! A6 d methods:{& ^# l1 Y/ K' {. V' r2 ~4 t! p! X
addFunc(){6 ^9 Y( h2 w4 L; `8 v
//this.$store.commit("add");
+ j0 R3 R* P$ |3 E- r B this.$store.dispaTCh("addFunc");
) S. M# C" c, l# _9 {* G },
# F( z* N: q7 y1 O5 m s: `$ U& p reduceFunc(){
! a, m# L' c) o% k( Q' [* d: d8 u //this.$store.commit("reduce");$ o) U" {& k5 W. |
this.$store.dispatch("reduceFunc");) o" d4 J h! o5 m& R
}+ i3 O! {' g; C6 ]/ a. Y; q8 _! a
}( I, y: a4 t# s# |6 E
7 a" {& G; M |( s这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的% w' D; {/ q4 R$ O2 v3 _
实现效果一样!!!!
3 g# m0 I7 ]* a. p8 z5 b1 u2 E9 @( |# @! C) C1 l1 a8 K/ G
; G: b4 H) G& i; a
( @6 p6 ` T d1 s6 G5 m: i& ~! [
) p& e1 W, ~' M3 x 5 x9 b" G5 \0 e. w
& G `* @1 x2 F' {. x% }+ h
' l2 u- B( C% W( r2 B8 d" F# V/ m3 o& n# C
3 q0 a% n$ ~ s ^: O8 ?, F; r, S- P, o. {, S
. O4 a8 _$ l) s! s: f
( o+ L5 c! D' _5 y! c: @: h5 v2 f3 l2 o
: q) X1 N5 c. T% n# A
. a0 J/ A" R, M) |; W$ u |
|