|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
Vuex 的用法详解8 ~+ x a0 Z, T- U9 ~1 a
5 n0 H6 V; c( c! ?; S+ c本案例测试下Vuex的使用,创建一个新的web项目 o: R* {2 o# u6 ~
Vue init webpack web& S" `. G3 c( _& s7 z0 Q- |
安装vuex
: t' a9 F6 I; \% q4 Rnpm install vuex --save( ^/ G3 J) K8 Y5 \
启动, npm run dev,打开localhost:8080 即可
" {9 [9 |/ }& g
. b5 I4 V; @. a, g) K0 n. l. Z, D
(1)引入vuex" S/ _: T' |# m8 k7 H/ q
创建一个src/store文件夹,创建index.js , 引入并导出store' U; }1 r, V) R7 c3 R; b* R) }
import Vue from 'vue'% r# p$ e2 A: U3 |$ j2 _* G
import Vuex from 'vuex'
6 x+ t/ B; t1 QVue.use(Vuex);/ Z; v) Z/ K7 f
const store = new Vuex.Store({) u j; ~- T @
}); W4 M8 z6 o- n( a! I
export default store;4 N% U }3 P8 ?6 e$ A9 h
) [$ |8 I4 u8 t4 O
(2)引入store到main.js
: \) e# h- W4 L4 z, |' Bimport Vue from 'vue'0 J( r; U3 ~6 f6 Q: K. @
import App from './App'
% P) d6 V8 |7 F! g6 Fimport store from './store'* `8 m C2 q4 B
4 S& l' m6 P) g9 s8 _& ~, w
Vue.config.productionTip = false
8 r3 s$ S7 B8 R) v
; o$ c, Z% q; ~/ Q4 r- ~/* eslint-disable no-new */
: F5 V. f4 Y1 a4 Onew Vue({' I; z$ H3 r U, |# o; q8 _! ~
el: '#app',7 W) q" Y7 |) P
store,2 t$ ?2 o: R0 l6 W0 c
components: { App },- s( U+ z, b% I* E
template: '<App/>'
; c6 z( t- z4 m* M7 C' H})' O' G1 Q3 A5 D
# m6 H7 P# ^3 |: q. G- |" l1 z
V. ?2 z/ n0 p3 Y4 K
1 o8 l( [- v. Y) }+ q H+ F(3) 修改 helloword.vue ,先使用state获取值进行测试
+ U7 {6 T# @) n |1 u6 BState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
: H2 ^ E: j9 ]% I4 Qconst store = new Vuex.Store({2 U( F+ R3 N% s# D
state: {
2 T" @0 P8 R) A$ R0 F count:14 w, n4 w" ?, j5 W+ j" H$ B
}
/ H& ~5 P! ]8 I}), M& d' B, a' z* w4 Q* I
0 u. s$ h( e4 ^4 U- B1 @
helloword.vue----
$ a6 p, z+ ~3 p4 E; D+ K: {/ L<template>) N p; u9 y" \2 P0 @9 N! X, T
<div class="hello">% r5 M% [$ L$ o. r+ M7 L& z5 t
) B0 j- R: B+ @( ]; N T
<h2>{{this.$store.state.count}}</h2>8 L2 y$ s( l; L) i5 l7 W
$ n. {, {5 N4 b0 q @ n. n
</div>1 s) Y- G5 i5 M& D4 b3 O
</template>
2 h5 A/ W1 R3 V3 H, f3 f
8 @9 `# D( z1 u9 T: ]; V
; Q4 V' o. H; P. F( x4 h显示结果为: 1
( v, o* r* O# [( _. H T) h7 d) j8 @1 a6 r
$ T1 X h8 P. C/ A/ n! C(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
; \( z8 G a i7 Y% j4 P; Q
& P: x k9 H' A' d# R. zconst store = new Vuex.Store({
) ?' h8 @5 Z8 ^ state: {5 Q% j2 j( K$ E! p' \3 r" s
count:1( N% e( w6 H5 L5 N1 M" }4 m
},
4 P3 R3 c8 B* u, N getters:{
9 k* R* @" Y5 ^% h getStateCount:state=>{
# Q4 S! v2 S1 P2 p, q5 F return state.count + 1;
7 k4 l# F% T9 z5 i }) a7 }1 Y* l Y* z, ?
}
8 [9 ]# d4 j5 B" ?9 l; S})
- h* R6 `! H) G0 S# L7 w3 _
/ e! y* d1 V, w) Y$ [<template>/ U. b: l6 ~3 T# a/ D
<div class="hello">
, @1 `' q- G0 q
* a9 `* @6 `+ z$ b( ^- F$ x <h2>StateValue: {{this.$store.state.count}}</h2>4 y% h; q0 E. V' o
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>0 L$ c9 R7 A. y
</div>
c# \& t9 s3 l- U</template>
. A& ]# C5 z3 U1 E8 n; W3 r" m; H6 t9 D
% x2 i1 T4 ` Q4 F/ H# x
显示结果:
2 l" ?7 T# _, E- ]8 hStateValue: 1GettesVaule: 2) O1 \0 B/ v4 e( ~& h; B
' y7 y, i7 D3 k3 ]3 B# R(5)
4 @" S% C$ @* ~: JMutations: 数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:
& K! M& E: s" y/ s) P修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:, {! q6 \+ ?( K
mutations:{
: Y$ M' `5 K; y add(state){
. A- N! w% D7 g9 \# f$ z state.count = state.count + 1;% t9 ?. c8 u1 @
},
& [2 a0 u7 l+ G0 i, |% u: z reduce(state){) h+ X/ A' w9 j( w' a
state.count = state.count - 1;
4 ^0 O5 ?5 Q+ A2 F3 d3 X }
5 ?7 r6 n% Z6 ]' R }
8 |' B! _" ^/ w; c& j% Q<template>
* T! s- L, R" J1 X$ ^ <div class="hello">
. y# w3 X3 Z+ T \5 A6 Q0 ]* { <h1>Actions:</h1>5 v( h; K) X5 d/ n. B9 ~2 s
<el-button type="primary" @click="addFunc()">Add</el-button>" m6 [% _: L% e7 k+ c; X, Q
<el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
) F. p3 }4 G% b9 i# B! D <h2>StateValue: {{this.$store.state.count}}</h2>; O, I: q" ]- p) D! R
<h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>, J4 y1 W: h/ M& o6 u
</div>/ i: |, s! g0 @/ T6 q( P {
</template>
( N, `0 B! m& y" F; i/ l4 R& H1 d; K: ~! o( t- F) K
" D r( c$ [) M, G7 U( [3 U- i结果:1 j! T6 D% m5 O1 D8 Q- h
6 e! T) M& r! g7 J
3 T' |- C7 z( C- b9 {! J
Actions:Add ReduceStateValue: 5GettesVaule: 6
3 t) q% I0 i2 a, R) c+ Y" X. K
/ l, ^2 c9 @+ l/ P7 T; ^
4 S4 e% r9 N8 Y0 i+ o2 h
) ~" D/ t; v" d2 z$ a- q9 k
" t$ K' h% N" L5 S0 l1 c% R% L6 T4 k& Q9 _+ k# k. S
4 [ \& k: y: O! x( `
- p7 S2 y7 ]) v+ W: z, R& z# V/ {0 L5 j, U. M
(6)Actions:, o" H/ b" m! C D8 T
我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数: & z$ L& O6 E. u/ F3 }
% y: e, J) h% j; b2 }* Q
mutations:{
9 I9 x3 o: Z1 y' j6 H add(state){
+ a0 I' e" H' J3 n R state.count = state.count + 1;
7 \, ?' D$ t j6 a- d6 I. ~ },1 b$ R$ r0 P/ y; w0 H& l8 }- V! x
reduce(state){
9 u$ H9 v* L6 X) i: w state.count = state.count - 1;
; m8 C% J! T7 B) [9 E }
7 r$ A# p3 M2 k1 l u$ e },
3 Q) i: q+ n$ q( p3 j actions:{1 u2 l# f+ {# f+ m& ]9 E. p
addFunc(context){( Y. m! G( E% Z8 D5 ~& m- X
context.commit("add");4 Y6 Q( s+ F( s ?
},
! f6 J2 s0 a5 O" w( P reduceFunc(context){+ e# U+ q4 r( K0 d
context.commit("reduce");
5 U! w/ [/ K R6 ? }2 @3 K$ J. m8 ?0 z: l3 r
}8 L/ a* w6 h9 c! a" w5 U
" H1 Z; L9 M: Q4 ?' p' Q6 ? L& t0 Y* L" H s8 ?3 ^% e% L
4 q5 ]1 Z! Z. g0 C( D S
methods:{( ?3 f8 z/ J! i8 z, r% F% K( X
addFunc(){9 E* |3 O& l' I. H1 k8 ^. ]
//this.$store.commit("add");
+ j$ D7 Z: c } this.$store.dispaTCh("addFunc");
& X' h7 O: r' W },
. O7 y0 w) V1 G6 b reduceFunc(){6 e. z( W$ ?' i8 L7 d. c; H
//this.$store.commit("reduce");
0 k) f$ x: u: ]# H( k this.$store.dispatch("reduceFunc");
, W! v, M1 w5 Q1 j% m! J" M8 U }
T9 ?, x) x% l% i, O0 Y# P A7 m }0 ?) s4 Z$ D% W# D
j, {/ `0 U% ~5 V1 T6 X; o! q0 w
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的$ U" I) O/ V8 `& D
实现效果一样!!!!: V' W- [. V& f1 g
6 B' Q6 o6 g! s5 |5 x) c
4 R5 L) }$ s+ _
0 [! V. o' q7 f$ \) J1 G, B
( x9 i( e+ ]2 X* @
% d! d4 y/ L# m3 O1 X; ^% s: K
+ d: [: G( {/ t+ V, q4 g8 n% x4 X! ^ X& y2 |; L+ i1 v: N* ^: |% @
. O6 `9 y8 M7 k S6 P" H: L3 e2 b+ T9 c/ i
. s) ]4 }4 S3 M, A- g: i2 A
* \6 T6 P) b9 B6 a0 R
/ f, `& w6 |( b
0 H* O. M; Y5 ]# T! `4 _4 k* d7 I9 \! X+ q4 T& N( U% H5 i
8 y y" [) {8 S+ \; a8 K, ~
3 U u; |, F4 _( H |
|