查看: 2484|回复: 1

[前端框架] Vuex 的用法详解

[复制链接]

6

主题

4

回帖

60

积分

管理员

积分
60
发表于 2019-6-12 15:24:50 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

×
Vuex 的用法详解
1 k1 i, g7 d! J" ~4 Z) {1 g
- T- Y& S- R  ^& z( l3 J6 w本案例测试下Vuex的使用,创建一个新的web项目1 X. h7 D) e8 ?3 G. i0 W9 V) D
Vue init webpack web
5 l$ \+ L2 C" C" ^) J安装vuex$ l5 z8 a! |1 t6 D6 z2 M" Z5 R
npm install vuex --save
6 J9 y6 W( B1 w+ M6 {  z启动, npm run dev,打开localhost:8080  即可
$ @% @5 ~1 ^. a# v  Z2 o( T% {1 o  D0 Y' t" ~+ T
; _6 @: Q* q* M
(1)引入vuex, W# @  x/ O* I& _# G' }
创建一个src/store文件夹,创建index.js , 引入并导出store( ~; S1 A# p( {/ ^- }  s
import Vue from 'vue') k$ S5 o* [6 `4 |4 o
import Vuex from 'vuex'
( Q$ u! g& W; M2 P  ]- hVue.use(Vuex);
9 V- \2 h$ @) _  }! H/ Lconst store = new Vuex.Store({4 u" g' @! v" X8 F
})+ N+ y6 E0 Q5 g+ B
export default store;
! F  [: d: c* ~$ B# o  c3 S! B! R4 q, I/ X
(2)引入store到main.js
' e4 J5 b& C) i6 Aimport Vue from 'vue'
& E1 W: [' y5 S% U0 ?import App from './App'3 p8 q( X9 y: \$ z6 J2 Z' }9 @0 h5 I/ v
import store from './store'. L3 ?, ~+ x& c5 i) h! |
" z6 Y+ u% j8 k
Vue.config.productionTip = false9 k$ m) c! Q6 G$ s5 G- F% H

/ Y! g0 A2 ?" \! l/* eslint-disable no-new */
( o) z" f- p% h' e% U% fnew Vue({
8 Z! _7 S# e) G+ k& b) r- N  el: '#app',
! I. r( T6 ~% P# Z3 W8 @2 m" }  store,
( k: F) L. F# |) p6 e& |& F/ Z9 i  components: { App },7 a; h/ S7 ?1 \3 {0 y
  template: '<App/>'
! L9 b# O7 j: L7 a0 P})
& ?/ R, n" P! |( T$ t% W# i4 ]
$ \! w, _( J. p! q: P" ?
2 T; I+ o' R& l# _2 D* e
& J7 u! j& a, H. ]% f* S+ \
(3) 修改 helloword.vue ,先使用state获取值进行测试$ Z/ K1 A3 l; j, _) x! ]; Z8 G
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
+ J/ b7 H1 Z7 gconst store = new Vuex.Store({% A& o9 _# ?4 I( U9 P' R
  state: {2 o' T( p6 ^0 n9 `, W& Q! |' X) _
      count:1
* Y/ P3 T  U% B8 [7 @/ B  Z  }) m2 ~9 s  q6 B
})2 q1 w$ Y& P, i5 u6 |7 M  m' h0 S
9 g7 ^# l7 ]+ X
helloword.vue----
' x0 Y, D$ O  F1 {  `<template>
2 {, P  y& H( v- a5 }  <div class="hello">& Z( \3 Y( {3 e7 x

5 d, U  N6 O$ y7 h' c4 v# Y2 e    <h2>{{this.$store.state.count}}</h2>1 r3 ?) c% S3 ~2 f
  D  t# H6 a8 ?/ b
  </div>2 j0 k' @! Q! k$ `( I& y
</template>
' @4 E1 Q  R( F; N7 ]; M# M1 Y' n( F2 m

! I' T; [% p% _' U. b' U显示结果为: 1
4 p. K2 P. O) d
% o' H/ q# u6 S1 v) }) v
" T3 g( y4 {8 {- t
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:0 O. `) `% s. _) W4 {+ z( \

8 Q; T4 b# @0 a5 l& b- iconst store = new Vuex.Store({
& g% y+ w6 f4 j6 Z& g& o  state: {3 m- ?% `) }( A( K+ g5 U# N
      count:1) w% ], D" e* s
  },
6 Q. }: E2 k  M. P( J1 ?) M  getters:{
" J' _* P8 d% p& q) X# V      getStateCount:state=>{7 Z5 P6 Y# j4 E$ k+ t1 p. B
          return state.count + 1;- r* U, U# c9 i. A' |6 I- z
      }! D( A! o! c, p5 Z& Z' ]
  }
2 Z( [* i  g" u2 [" o})8 S5 b2 t* A- B' G

8 f) f' C, [( m9 d0 Y<template>; k& e, ~) k8 c( D
  <div class="hello">$ E7 a2 I4 w" W+ s

/ i0 d- a; j& @3 r) O! ^* s    <h2>StateValue: {{this.$store.state.count}}</h2>% J; q! ?- ?: V# `( P, t6 D
     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>2 q+ I5 i, W" W
  </div>1 ^# d8 t) J4 D# b" Q
</template>- K% ^" |7 `' s- b0 G: V
7 V+ h6 K: x' O$ R" y

/ x. ]6 k% {+ s7 ^0 ?显示结果:
! _6 R+ I. ?$ ?# M* c8 p5 vStateValue: 1GettesVaule: 21 t' y( W* [2 Z6 J0 Y

; {5 i- n' v( m' b9 ^  P% P& G; U; J(5). B1 e) p4 S$ e' \

Mutations:

数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:

: F; @" v5 [; l2 c/ a  L8 d4 _
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:& d! C5 _1 y1 p' ?3 i# D
mutations:{1 j( h- A/ O% r$ d1 K* H% Z/ j
      add(state){
; w; B- T! {- I  ]) s% }- s& c/ O         state.count = state.count + 1;
; J, N( c. L2 k# n      },
- H2 ~7 N# n. _7 {( D2 h. U      reduce(state){) U% s+ @% i2 c6 y
        state.count = state.count - 1;2 N5 O( M/ G( s' N) c
    }# {' r; K" `& T. G# T
  }- [( P1 [) V# A' F3 y9 _& w
<template>8 w, @8 o- L  E
  <div class="hello">! b, e4 B* e0 ]( y+ f; `. |
    <h1>Actions:</h1>  V" r6 o1 r, [8 O) v/ Z) @
    <el-button type="primary" @click="addFunc()">Add</el-button>0 P: u2 P. H: F1 y  D
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>& ~" W4 [! R9 a
    <h2>StateValue: {{this.$store.state.count}}</h2>
) A  {9 e- f: r, m    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>0 [4 N; }$ t  `
  </div>
1 a) f. Q7 A, @* t</template>
6 G/ Y+ a1 W. F* A" \
; U! O* V% b$ M; y  j

% q, |; W. x" u# O- s9 ~结果:
1 P2 Z6 F) }6 M+ ]2 t
. m. z# Y1 A- O$ J7 M
0 I9 t' e5 k( Z; o+ v* O
Actions:Add
ReduceStateValue: 5GettesVaule: 6% r2 j) s4 ~2 X9 J7 X
7 g" g+ C' g8 W- ]
% w& z, U8 }$ d8 B5 A: J) a

6 p* W, w* l/ S3 \5 |
8 y0 A$ K' c# h  F% @: Z

+ Z5 b5 |2 Z2 i; d8 c5 ~; M1 |8 L- D

* U) n# r# N( @! v  d4 I
! Y0 ]9 E9 s9 w, c: T(6)Actions:
* ?  C. h! ]/ R! K; I

我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:


! H$ v9 w2 A; G* ~' M

7 V/ D' I9 y# d4 G$ ^* c. \% y, A
mutations:{+ ?6 H: ]- V8 A! w* J
      add(state){5 `4 u& R* t# b8 v/ O4 x
         state.count = state.count + 1;
/ a0 a5 h6 h( t3 L      },- y% }( f; k3 D$ D
      reduce(state){
3 `% J. K, W9 o# E        state.count = state.count - 1;
1 J, \) E$ v  {  l6 v6 h* a' o    }* L& s; [0 s# b; C' g! X% M
  },$ L/ h: G) \7 s, z6 _& c
  actions:{
) T/ _* ^. c- z+ e# ]$ ?9 @- p# p: u      addFunc(context){/ ]- l7 U+ e* a& K+ \, h
          context.commit("add");+ z9 Z. E+ {( w: h, {5 m/ h, ?: B
      },- T8 ~% f4 x% y$ x
      reduceFunc(context){" j) J* X6 {9 |, Y1 \
          context.commit("reduce");5 G* j" N  u! T6 g9 ]. l
      }
. H0 J" a2 D$ D  j4 _" y  }
3 s' t" j2 ^7 P

0 }# X; ~$ q: k, H

7 ~! P, B) b2 m: T


) f5 r% Z* F4 H: m  methods:{  t9 q% ]# O: q5 M( C) `6 E8 h
    addFunc(){% c* B9 \$ T" f' g0 H* k
      //this.$store.commit("add");
5 Q/ m' y$ f# J      this.$store.dispaTCh("addFunc");3 q- F- `( q7 w7 w4 O. ^
    },/ _& u2 `3 [- c; A
    reduceFunc(){& r& x/ O" r9 g3 o2 {
      //this.$store.commit("reduce");* x/ ]$ [- ^2 u$ W
       this.$store.dispatch("reduceFunc");
9 H2 A' I  {$ d6 O, D/ m    }
2 I" S5 y( B- x' H) }" S  }
/ ]1 K6 A) }& E' U$ G  A: M
7 B7 _1 a; I- c) }
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的& h$ L. M4 w  c6 _$ m; K! N
实现效果一样!!!!
2 l$ O6 a9 [9 R7 ^- D/ S; r0 [1 w; x8 m. L7 [

) {5 q  x1 D1 b4 r  N6 I
+ `6 I6 R" R" G

, o% Q6 r0 b6 v  a7 z2 u

) T9 C! l# V& |3 }( ?2 L/ @


& m5 n- [$ a( g, r; h: o( d( p
" m5 o2 ~2 r- `. q

/ w3 a2 b# y( P* W% n
" F& A* r% c" k+ n! F, K, f
( @1 Q! k7 j+ V2 u# K/ V! n' A
% p% `, O; L3 o  M- i$ k8 j, M

; h: I# K4 `8 k: |/ _7 R% _1 B9 [4 h5 L. G3 c0 r: s. `4 s2 U; x1 [! O

% p, W2 w5 K; l5 V% |9 {9 Z* B- y$ W0 J

5 _5 `4 W$ V0 V+ Y2 j: H
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

6

主题

4

回帖

60

积分

管理员

积分
60
 楼主| 发表于 2019-6-12 15:28:01 | 显示全部楼层

mapState、mapGetters、mapActions

如果我们不喜欢这种在页面上使用“this.$stroe.state.count”和“this.$store.dispatch('funName')”这种很长的写法,那么我们可以使用mapState、mapGetters、mapActions就不会这么麻烦了;

我们修改Hello World.vue文件如下:

$ j. g' t' r' a5 J. ]) K

% w+ o5 K) @1 X4 G1 H# P


2 t; I8 J3 I7 a! z( \' u" ^( U

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。2 x1 L# ?4 c3 F& w  i

! s/ S, r3 t# g# b4 \import {mapState,mapGetters,mapMutations} from 'vuex';
" S' F# J0 Q- b: G. v2 dexport default {  p! ?! j: S, N3 }& Q6 J
  name: 'HelloWorld',, W" }! R. W+ w
  data () {# @5 l' d) |: m+ Z0 G2 ^* K) i$ c  z
    return {+ W/ F" m6 O3 v
      msg: 'Welcome to Your Vue.js App'
1 `2 A/ r) U8 t  t+ I3 X# s    }2 l+ F6 P# b) E5 R2 w* a& U! ?
  },) v6 h  A* c; {- {5 N
  computed:{
6 a7 Q. q# d4 z% U    ...mapState({
7 ?1 L# r) ?0 J      mapCount:state=>state.count" U0 U% X6 r% Y% Z% Z+ E% V
    })! G4 \$ B  _( w& U1 b: ~- m
  },
) _) z2 h1 O8 C  methods:{0 s2 \# k2 W5 ^: X; ~' m3 @6 k
    addFunc(){
% Q0 _4 @5 u$ ]# g# [6 o      //this.$store.commit("add");
. U  g7 J  T  u5 r" E      this.$store.dispatch("addFunc");
3 E* G/ g5 r% F: y( {    },5 Z7 _7 Q6 x3 K
    reduceFunc(){
( i" `: d* I( Y      //this.$store.commit("reduce");9 @$ f* T  ?+ ]  T
       this.$store.dispatch("reduceFunc");
0 X1 w# i) x. [3 \    }' V7 [) {( {! h5 u+ {$ L+ _9 ^
  }6 u, R6 n8 ~. H5 ]. l
}
+ u4 ?* o/ Z- `  O/ |/ C8 ~. O4 _/ y  a, G$ w$ t/ w8 O& T- k4 X

# p* H" m4 R- D3 J' h7 K" O4 J( @
+ T/ p5 S; w) L* C! Z

, l. R& m9 v( J! Q7 c
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部