PLM之家PLMHome-工业软件践行者

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

[复制链接]

2019-6-12 15:28:01 2218 1

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
Vuex 的用法详解
; o' ?0 E2 {) [( M- P) u( w4 u- e4 R5 U: y2 S7 o
本案例测试下Vuex的使用,创建一个新的web项目0 o7 y: j2 l1 G; r6 L
Vue init webpack web' W: b5 E) R0 c" S
安装vuex
( ], R$ B0 _% h' n1 @npm install vuex --save
# o; D1 ~/ T4 n4 I; ^. r启动, npm run dev,打开localhost:8080  即可0 a( _* M. g$ O- o
& g- G# f2 `$ s' k; T9 A
, B9 L) ]& s1 \) s- C& \6 w. f
(1)引入vuex# \9 Z) v7 i4 ]
创建一个src/store文件夹,创建index.js , 引入并导出store2 s0 O% o2 |# g  ?4 g
import Vue from 'vue'. }/ \8 k1 \$ S- K3 e
import Vuex from 'vuex'9 K9 J: S* Y8 i( J( ]4 u
Vue.use(Vuex);8 D  |  D/ _4 U( h
const store = new Vuex.Store({
6 {! t& X. r: t6 F})
- P2 J" x% i4 P+ nexport default store;
& f; t& P+ ~# v4 T# y8 ]' |, \+ q3 E2 |, l- Y8 K" M
(2)引入store到main.js: U# n! ?* o" g# A0 G% D; n
import Vue from 'vue'
! H. V% }9 P9 e8 C; |7 A8 Y7 @import App from './App'+ A: }* v2 |- y" F
import store from './store'% Y9 v4 t* Z  E

2 O/ h. B. R4 ~- |4 r9 KVue.config.productionTip = false/ e% m5 E4 P* o* r$ q" [+ H

! u! i" A2 ]. i/* eslint-disable no-new */, |8 z! ]  y& v9 N
new Vue({
5 }/ z" ^4 f' M2 B- y) @3 T  el: '#app',
' ~( Z' O/ I0 v' H1 M5 K6 j  store,# t# p3 i  o; U% |' I, A  ?1 I
  components: { App },/ P4 O' T* {  s4 L+ F  A6 F# O6 t
  template: '<App/>'
, c4 b) J6 [  j9 @3 {8 |- n; s6 J6 o})
$ M5 W1 g7 p# b  K; ?
$ X. r$ h( P! `# A0 ]- X# @
+ p6 _' Q3 K+ i% O! V

9 B; m% v2 o4 o0 ?0 K. v(3) 修改 helloword.vue ,先使用state获取值进行测试
9 k5 _5 L3 U+ _4 k( P3 s4 vState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
5 @7 m; o1 g; Q9 g4 o+ Mconst store = new Vuex.Store({: A% g8 S! O0 o0 C/ I$ ?4 B
  state: {* E( j4 F, f4 }. M
      count:1. G+ S5 M% `  L5 i2 T
  }
( v! C5 ?' U& c, Y6 r3 J# n1 {/ m})1 Y  i& P# W4 ^& ]( H
' l, h( b1 T  E- R# l: s7 W7 f2 x5 u
helloword.vue----5 T( v: Z: S3 K8 h, b$ @
<template>
: Q; E( D4 d, j1 \5 o  <div class="hello">
/ |2 P4 y# a" T% N1 O: t/ u' l
9 `/ G: \( e+ q" v    <h2>{{this.$store.state.count}}</h2>, P0 _% ~" Y# G0 q1 D$ y
9 g$ {, j  l! B9 D( m" C+ U) @
  </div>
) u5 b/ v4 g( `! x. v- R2 B</template>. |  ~1 j2 h4 U# O9 D- n: F" F
  `" @' ~- y# M5 z

+ b% S2 |0 Q7 W; C8 p显示结果为: 1
( A5 E' Y4 N) J6 N# E9 I* m. o
3 ^+ Y6 W; g. N' M* S
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
" U1 e- R4 i: |, @
5 [' O' u+ O2 o; E5 _const store = new Vuex.Store({7 X7 `" [+ \# n' }, G
  state: {1 u" c3 W! y4 h8 |5 O" c
      count:1, V! ]# i$ \% i" U, P" C5 Y
  },
. {( v& O' Q2 s. _9 T4 L  getters:{% ?3 u, M  j/ D6 f/ @8 v$ z# g
      getStateCount:state=>{! z$ T7 @$ j/ M* R' b
          return state.count + 1;& C, S  U- ~6 i- h$ ?* s
      }
& \2 I. _' i6 D% X% C, G9 \) Y  }
4 M5 [% P5 A7 T7 @2 R$ \! v. [& q% Q8 l})
3 P0 L5 b0 z; w- ^6 P8 a, b" q3 h, F7 V' N  v
<template># s6 p) D+ C; l5 w# @
  <div class="hello">0 L5 |& `, \% @$ T

: _- \6 |& W/ v  `    <h2>StateValue: {{this.$store.state.count}}</h2>
% q* w' Q6 R9 R1 L4 O) X( j9 u5 ^     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
1 [. F) y9 F3 r  </div>
7 e$ s5 V$ U$ W- x# K8 M+ Q' N</template>: i: B- ]! a4 f) _7 |! B

! }3 o% y3 u- j7 V. n% Q/ x' C  X/ U
7 _) V: A, r3 T1 E, x1 V  o
显示结果:
+ K5 f3 `/ _) ^5 f# YStateValue: 1GettesVaule: 2
0 f' U# H3 E$ C8 O- ~9 U% t/ w- I- s& ]4 \6 [5 L% x8 z9 O
(5)6 t. i( U; q- h7 l8 o

Mutations:

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


3 R5 d' m  {' [7 M修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:4 @, u% B% z0 d5 a2 M' P
mutations:{
8 S0 X2 R7 k0 k) h9 u; r1 A: T      add(state){
, @  ^8 d* n& ^         state.count = state.count + 1;. L/ F- ]' R/ [, H- m" n
      },# X5 L; F1 n" ]5 B5 m9 q. s, t
      reduce(state){
0 x9 ]6 `; T$ e4 Q! \! E& Y  W, [% M        state.count = state.count - 1;4 V; Q, q9 m8 v
    }
/ {0 Z! S0 K& A8 Q  }2 u/ K7 G9 R/ Y" Z' |
<template>
6 G: p' ^! |1 i6 @2 l4 [" I) Z' j3 B  <div class="hello">: }" e$ Y+ w' D0 X
    <h1>Actions:</h1>% S) n# H5 m( \% S% `
    <el-button type="primary" @click="addFunc()">Add</el-button>
; q0 x, ~( |+ h, q% T% L( F    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
" q6 Q5 b" `) O    <h2>StateValue: {{this.$store.state.count}}</h2>
9 s( j" `/ |1 Q+ D    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
  T1 b' u; E( @$ ]5 f) C  </div>( B  @5 {& d0 g
</template>
* A) i' t$ [4 ^8 e+ Q- ?2 N0 A$ f5 \$ r6 q% U( g
: f  Z: y# t! m' F' I# @
结果:* P; y7 |- B$ [& s- M1 j* ], c

5 d8 b1 b$ ]  a  _3 N$ v
7 x( t( X$ u2 Z5 p
Actions:Add
ReduceStateValue: 5GettesVaule: 61 N) ]$ c* w: L0 O! x
- M* O+ P) |: l! Z5 q0 W

- M4 r  X. m$ o" A3 o& v

: J) p: f+ u1 E' {" z, m/ ]
# X4 y8 U- B+ G4 d8 v- B& A! k
3 B3 a1 Q0 W: v( C- Z% X

$ b, ?. R% h; B6 `
" |) t: G) U/ [: X
- c: x2 f4 D$ a4 s- T+ H1 f
(6)Actions:
: Y9 q8 f2 r* R

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


1 h$ l, a" Q7 R

6 l- P& N  e3 I5 y
mutations:{
3 [( @& j7 i- M8 p8 U      add(state){
0 `( q; A& `0 I9 V8 ~         state.count = state.count + 1;
, {% K  P. |& K* [. L      },4 ^7 H( @/ p8 g
      reduce(state){: O/ M* t* _: k
        state.count = state.count - 1;
" j; y3 ]% L# U+ T    }
6 }$ n2 h9 A! o$ ?) K1 [* j  },
' q/ D' _# V4 ]$ Q' j: x5 L$ l% A$ U, S  actions:{$ p8 g& Z, @7 N# s1 q. n- U
      addFunc(context){$ e6 o" s7 m1 A3 h$ E8 {8 F
          context.commit("add");
& U+ t3 Z1 t2 M/ N& a% Q' J      },0 F& ^& I' @! e% z
      reduceFunc(context){2 x: y+ o' H# @- h5 R% l8 a
          context.commit("reduce");
$ f' {; W1 I' ?$ R      }# m' Z) b+ m8 t
  }/ R  G+ s+ @5 P  {
/ q, ~9 t! N$ p! R# W/ E- W( J


& s7 u& e6 L* X" p9 y


$ R3 a( t7 h- J! S0 L8 O  methods:{
9 G0 h9 \% C' i& |2 R! m; ]    addFunc(){4 E7 o, Y4 P( R. u9 \
      //this.$store.commit("add");
) G/ O2 [8 n0 U+ K0 ?+ I4 l      this.$store.dispaTCh("addFunc");
. B+ c/ u0 K( y/ N3 J% D    },- P: {$ u! h8 U8 ]& Z, n; s
    reduceFunc(){
! F. q' w) R* f# f- ^      //this.$store.commit("reduce");$ }* Y$ O5 V/ g' I1 t6 r
       this.$store.dispatch("reduceFunc");, p' ]# k2 @/ `" z, F
    }
* H7 N+ n9 y6 S) G! a/ c  [  }
* Q$ Q, X9 c* ^, S9 X3 @
) F2 f! ~5 q- U
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的% H' W% K# x) k0 G* n
实现效果一样!!!!3 d7 p7 s& h3 V
2 G* A, r! ?/ n7 f1 d/ ^
5 W$ V& @6 a% p0 ^- ~% I

8 Z; m5 G% f% h4 H
! z: m. M* L( {: _$ ^3 N


7 z, L9 T, Y/ b: r


& ~8 g9 }9 w# X  U) S; e$ [7 {# F4 t  r$ o6 N* V7 A
" K! j; k( `1 K0 }- O' O% z

5 B- o. l: i- e( N
( s% c' b- P1 h" X
  |: V* c: i3 ~2 b' p0 W
5 Y- h6 {% U4 h% t
) S7 }% e* U/ T& Q
7 X9 C" z. w9 m6 T
6 q% D) r) }/ _3 U; |( C/ Y

1 I% U" F+ D% x
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

全部回复1

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

mapState、mapGetters、mapActions

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

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


$ l3 t/ {5 \6 P; s- C


* X+ A% a% S, T: Z$ N" j4 u

6 w3 |( k! @' x8 |

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。8 r( h8 Z5 b, g' e$ V- o  {
8 \" l  J2 R$ m9 |7 P
import {mapState,mapGetters,mapMutations} from 'vuex';
9 f9 v, e3 I) v+ A) c% oexport default {& Y1 t) K( G. o! _2 I
  name: 'HelloWorld',5 c3 W2 ^; W2 F- s9 }; P
  data () {" o  X& d# l! h$ j2 Q
    return {
$ A8 p$ A# w- l* i3 F      msg: 'Welcome to Your Vue.js App'
9 p5 Z& r( l* |7 C) r    }& J7 C  z# M+ s. S( d* J
  },
" x+ o, y- {7 z: @/ m  computed:{
4 O! ]( F$ K1 s+ f# }8 ~! q    ...mapState({' J' I  @+ v: Y9 A3 m
      mapCount:state=>state.count
7 P, Z9 ~2 o: D1 D1 I    })) V( L" a1 j( [$ e4 \
  },
- O6 a+ T$ p- U$ Q8 y% w3 x% {  methods:{% R; A! q. g  z% A
    addFunc(){
; t3 R7 @8 C4 ?: F      //this.$store.commit("add");/ [" b& u( ~# Y
      this.$store.dispatch("addFunc");
/ o. S& [) x8 B4 o    },
  k6 c9 ]1 K8 z$ b# u3 S    reduceFunc(){9 O2 f1 Z8 O5 D/ z+ f8 W! \
      //this.$store.commit("reduce");
3 F& g( S! l$ u9 V       this.$store.dispatch("reduceFunc");
  U9 u4 R: w! L7 r& v% ^4 c    }  N. e3 U+ a  q( K; g
  }
0 K) \$ [" C- c" u}
0 F) P$ p% J  S- b; C6 }- c* U9 u5 U1 w

! m9 y7 L  v3 I6 n/ b( H
/ r$ A; Z8 |- }0 f. P0 ]% n
4 G7 U* N. B' E( u
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了