PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

admin 发表于 2019-6-12 15:24:50 |阅读模式

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解7 o: m6 h+ T+ ?

0 O0 i2 R, M+ `- q8 K7 Y0 X0 |; J本案例测试下Vuex的使用,创建一个新的web项目7 k8 A2 F# K0 B; H6 Y
Vue init webpack web
- f, j5 }" f5 l6 t; N- m9 Y, _安装vuex
' k5 j* ?! j1 z0 b. Cnpm install vuex --save
9 L8 v! R9 }5 i% K+ B) H  E启动, npm run dev,打开localhost:8080  即可
; b. S' L1 h0 Q2 |1 e3 W: S! x( l) C. y) C/ K

! v# V4 [9 E- m/ z2 {(1)引入vuex
% O* b  X4 g, @! T2 u* B/ |创建一个src/store文件夹,创建index.js , 引入并导出store
! q/ x3 |7 U  p; h" t/ Iimport Vue from 'vue'; b+ ~% E/ e1 p( L' {
import Vuex from 'vuex'
* Q# s4 h" T' e" F# \4 M. OVue.use(Vuex);
# C$ w- G* {; g3 N- yconst store = new Vuex.Store({
  o5 o: Z' g, ~0 Y" ?})/ I" J$ P7 \/ h, A
export default store;
* T' @3 X, @+ W7 o$ v, j
0 L. h0 Y  {, r, U3 `+ k! U8 e3 ^(2)引入store到main.js, P9 m2 d* d" I
import Vue from 'vue'( |* i8 u9 `" D
import App from './App'# ~- c0 @* J9 r4 t
import store from './store'$ Q1 e! y! F- Z
7 b% C3 c! V# V8 X  E& C8 L
Vue.config.productionTip = false
4 Y& v8 Y* K6 k. u* \6 B7 e! w; @, }
1 Q8 Q* h- X# [/ ?) v/* eslint-disable no-new */
$ E& o, g; H4 d# N) ~8 E$ b4 M1 L, \; F. ~new Vue({' Y/ l& {6 P9 ^, W* v1 i
  el: '#app',5 x" P7 j2 |6 O2 Q9 [+ `
  store,
) n8 J& H/ S& L  components: { App },$ s- H. [  }2 _( |7 |4 ?# i
  template: '<App/>'- U$ V$ B# `4 P0 ?
})- b  o& }: R$ m9 @7 u& h$ P
- l: y) T1 N2 K+ l& U) v8 s9 Z; v
* b. }# w2 g0 f9 i

# ^: F! n5 `/ y3 M# p0 G0 y3 F' X(3) 修改 helloword.vue ,先使用state获取值进行测试' h; ~3 r2 X; w8 i
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
" @: _: q/ r$ }# H7 T% Gconst store = new Vuex.Store({
, b( e  V6 _  D" o  state: {
& p$ w) P& O# P! j7 R+ c6 ?) h      count:1
2 \- Z- d% a. ]8 Q2 M  }5 ^5 I( N. X) p! r( T
})( a+ C( D2 g0 P0 K

- I" p1 V1 x" Jhelloword.vue----
8 Z' N% d, Q! c; z9 ^/ h<template>, d( u6 m4 V4 y, P! g- m  i/ P% s
  <div class="hello">
! t% D* o& _' S# C/ H8 @
- M+ S& K! |8 }( L# E) X    <h2>{{this.$store.state.count}}</h2>, D0 N+ b3 l) y6 f% t. S

, \* w: _! f2 R  </div>7 Z% S5 O/ R' P$ C
</template>
* [% W& h: ?, c3 _6 o5 J8 O8 h) o& U' E3 q8 B/ m1 G3 C/ W

! I. u4 w  G5 ~% v显示结果为: 1 ! T/ I* b! g6 C! E% J4 b  ]
' q  p- C; ~5 y- d. `

- e+ i3 b( O7 }) j" o7 k% T(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:) d3 M1 j* Q% z/ c9 @' M" X: Q

' K$ x- f8 d$ `) S8 Tconst store = new Vuex.Store({0 h1 w9 ]8 S  A$ x+ A) C' a/ H
  state: {8 ~; O2 }& @- i
      count:1
  W  B, M; P) o% h  },# J0 M3 A0 |7 A
  getters:{
5 v* N- D" Y, @% T" a      getStateCount:state=>{7 C. h, ^; {! ~- V8 L
          return state.count + 1;; c3 z$ }1 k  s2 l4 O5 p& V
      }( s% K( f' C2 c$ V: ^
  }
! {- T* q% \1 [# \3 o3 s})- {* e$ [8 Y, u/ C  |# S
: A  ^( s3 h- m2 z* K% {, M$ @
<template>1 I; D9 {1 _/ h0 x( s
  <div class="hello">1 H# A6 i: L4 g9 x
( E! G* t$ u2 m' ~5 |
    <h2>StateValue: {{this.$store.state.count}}</h2>
2 H5 @8 [2 f& U& o( ?     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>7 W' j& x, q  }$ O1 K
  </div>
) g; s. I) }. B' i1 Z</template>/ r* |* f' t7 i* j1 F+ b

1 D$ A& D- {2 r1 l- K

! O& r( }) |; K5 v7 s) P9 J& b/ r% x4 E显示结果:6 ?" V+ V% D( c2 b5 L- E
StateValue: 1GettesVaule: 2" T4 X- B' l2 l+ L$ H- R7 C5 H

: r! l0 B* [) e. g# \7 _$ ^9 T(5)8 U, P5 Z" n% w6 C

Mutations:

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


, X3 O- Q" y' M+ D修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
& C* p) c0 u- B1 l" U  c- o+ omutations:{
) q5 N- w" ]; y( E9 K% {- F1 u      add(state){
& v+ W+ `- O$ p0 k         state.count = state.count + 1;
: N' d9 k' b; G0 [      },  H: {' b8 U( F3 s- B( l
      reduce(state){/ v9 A- b5 ?: b+ u7 g! |
        state.count = state.count - 1;( V+ H/ J" n% J. W$ K8 Z+ x  h! f
    }& i# M. [$ K! M& R1 ]
  }2 X* i+ g* p! Z3 |5 |
<template>- e  N1 F5 @& y( i2 k- g% l( y+ D
  <div class="hello">; ^- Q5 t7 A1 S- h0 E
    <h1>Actions:</h1>7 {* N* L1 ?2 }: F6 _9 J5 a; ^
    <el-button type="primary" @click="addFunc()">Add</el-button>* E: ~/ w# t% i
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
1 O/ H7 Y. ?; {% D! X3 S0 Z    <h2>StateValue: {{this.$store.state.count}}</h2>
, ^3 u# |% |- n+ G. O2 E2 j    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
+ {5 @* L7 F2 x2 n& z  </div>: O( k' }- ]7 s. s7 ~! @
</template>
; R# `7 A9 X, M/ _- `4 Q- y. f  T# q" W8 F

4 s! f" |( X. y$ o结果:; {) ]- B* I; W. B" V

1 y0 Q# T) f9 c+ V& N

/ ^% i% G! U% k. |6 |Actions:Add
ReduceStateValue: 5GettesVaule: 6' m6 r$ V. ?, R: |2 \! D
+ ?, {) \  D- J1 F7 S: _7 q
& A7 r! H& h5 c/ }, P- [
' r$ V/ T: e6 D$ `4 [

. V6 D3 X# i# ^" M( X
, c% }& F+ X. M7 j

7 y6 S+ r0 Y; k% A* j! w/ F8 L

+ t) [; x1 Y5 C6 o- H: u
9 L1 m" ?4 f, {  P. O$ M# r(6)Actions:
6 A  |7 D: h' b: i! {( g

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


9 n+ W1 F, m- p

& o# W6 u( u3 V- K
mutations:{; A  I0 ]8 T& b2 X5 a. Z
      add(state){
' \" q* q5 J! `0 H1 g5 B/ y( F         state.count = state.count + 1;) b3 P) s/ V# ~0 |2 q% W$ P
      },4 [" n$ J* z* G; s$ X% X
      reduce(state){
& `$ f/ s4 j- u8 S. H6 z2 ]        state.count = state.count - 1;! I' \: y; P; Z9 i
    }
. T9 a- J, n1 c+ e3 D5 b, y  },
6 J: I. I& E9 g" f8 v5 `  actions:{
1 I5 X6 _  [% \9 k5 }      addFunc(context){; F7 Q. a* I3 o
          context.commit("add");
, w- \: v. J. O& B      },# S% v( i( L; U! b7 e# O$ U
      reduceFunc(context){
4 `, m4 n' c+ i          context.commit("reduce");
7 Z, j# u* e; h. R3 L1 v+ V2 ~      }5 Z2 e4 T+ G5 Y" @
  }
8 }' p+ e- R2 m( m' K
" g7 g' c$ K# C; V; m4 {/ ?+ R  l

: j6 r+ O7 J& B- d6 v

2 F6 J; _5 ]: l9 @% e, K
  methods:{
% v) b& {' k5 G: J" s4 H6 E    addFunc(){5 q2 X; ]: A3 u
      //this.$store.commit("add");! L( |) P" }" m, ^
      this.$store.dispaTCh("addFunc");, \4 S. ~& r( [' r
    },0 E2 s1 [! Q2 f+ A, w) y0 G. v
    reduceFunc(){
4 q2 K) m3 _( K. t9 u1 T9 e0 P( s+ U      //this.$store.commit("reduce");
& A5 n5 }& u, o  o5 j8 y       this.$store.dispatch("reduceFunc");! g! i- d! ^: b6 J. ?
    }
* K) {; u3 L% I3 R) `( I5 p  }

" l9 C, K' j" X, p& v  r
! I% V2 R7 N; D+ E5 H
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的4 Y5 _; o& u  i  N4 p* ]- J
实现效果一样!!!!# I0 I0 m+ k! m/ i' d
4 y- q% B6 B& Y9 E& \# m  [
2 ^/ O+ ~/ ^! l6 \
1 `* A* E" b7 C

2 ]( l* H* X0 B* a0 B  _$ E


5 _3 y' D5 h" _8 f: P

7 h/ e! ~# x9 e  b. c

" z4 z" s% |' Y* K7 [
. {' R. ?! q2 g, L6 a

* W. e9 E  o: u% B, W0 }  N
. \9 Z& a) y- H5 V0 J1 c7 J

/ I' N0 L* ~5 W. \; a
* X  u, m8 A0 ~' d/ h9 T6 O6 l, D2 m1 k0 Z" z5 g: b  d# m
5 p% F' G7 U* V+ d: |

* B5 P3 g* y% X. W6 V! Y6 N0 W8 d0 U. r- `& Y2 ^- |6 K8 M6 H
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

全部回复1

admin 发表于 2019-6-12 15:28:01

admin 沙发

2019-6-12 15:28:01

mapState、mapGetters、mapActions

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

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


* r2 Y% k3 Y6 o% q3 C" ]: |6 Q


) T, [' V' N! \, f0 g7 e4 U


3 F6 F5 V. Z+ G9 I* }6 R

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
" a% e9 E% s3 [9 C/ q% q. b% d9 ^

- D3 s4 E' \+ u& y9 i. Fimport {mapState,mapGetters,mapMutations} from 'vuex';  ]: b4 M# S0 j
export default {8 ?8 O: s' ^3 C4 I: a3 D& a7 X0 I3 ?
  name: 'HelloWorld',! N/ o7 f7 g) `! A5 s/ ?* A
  data () {+ e5 D9 W+ ]/ ^1 m1 L
    return {
. o$ h$ M" J# K' W6 ~+ S& G      msg: 'Welcome to Your Vue.js App'% K" F3 `+ C, r$ U  m/ k& O, X
    }- y% H3 `- S1 e) K
  },
+ N7 m, K( K8 o4 r! K/ o* [  computed:{& F1 N7 U3 D7 r. T3 g
    ...mapState({
/ z7 E2 N3 ]$ i2 [8 X1 H5 z      mapCount:state=>state.count
; C% O2 M2 J3 h  p1 ?# y; C5 D    })( P7 x5 R& v; I
  },+ g( \+ {: X5 e9 K: F' j+ _
  methods:{) q* D7 e# k" u7 u% |. ]2 p
    addFunc(){
& E' W: Y1 ]+ I2 F      //this.$store.commit("add");
" b9 @, S' I' [# e      this.$store.dispatch("addFunc");
6 ]+ p' t8 V  E    },
( d5 p! Y7 d/ M; D0 @    reduceFunc(){
6 s2 A/ B; J7 e, @- F      //this.$store.commit("reduce");7 \, E. n3 e. E9 t
       this.$store.dispatch("reduceFunc");: f. ]. P" y4 q
    }
; E' x9 k1 w3 N, B3 }6 G1 f  }
3 @+ @  [" O) R}
9 j4 y, @! M0 o/ _
( t1 j' x% I6 B% X  @& C
$ H) F+ q, q- F, a$ ]/ t% G9 d
& r6 q5 j5 k9 K
' I  K) v) p* ?9 d5 |# q" 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二次开发专题模块培训报名开始啦

    我知道了