PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解& A5 d4 X% C/ V4 |& r  v

# [' |5 Z% _6 L3 S) L7 p本案例测试下Vuex的使用,创建一个新的web项目, ]0 Z2 u0 S7 w
Vue init webpack web
, Q" f. n; _4 p安装vuex
8 f" ~* [; g9 [" D, P  Rnpm install vuex --save
) `, n1 t# W2 ~/ q* @9 ^$ w  ~启动, npm run dev,打开localhost:8080  即可
! J( E) \; ^% ~4 b% J& p# _# _
! d" P7 \2 T5 Y6 n# Q/ l( Y3 g( K# }* w- J, I4 C; d
(1)引入vuex$ z- g- K1 n. l  n3 D& R2 k
创建一个src/store文件夹,创建index.js , 引入并导出store" I; G( F- \7 D3 p) R! M2 [) U
import Vue from 'vue'
& K7 r/ |5 \  H' b; Jimport Vuex from 'vuex'2 a* U4 r3 s/ d2 X" Y$ m
Vue.use(Vuex);
: g2 t  I# \& e. B; k- L1 w% a% Dconst store = new Vuex.Store({  T( @5 _( ^3 l
})- B. H, I. A5 Z- |/ U# M$ G
export default store;/ d* s3 {! ]& I& K1 T) ?) J. t) ~
, }7 C5 j' s0 n' K' q
(2)引入store到main.js5 E* Q( w* b  Q
import Vue from 'vue'
9 X" Q5 _: M6 e6 _6 c. G" Uimport App from './App'
+ A" f3 H0 z5 w; limport store from './store'* O3 Q$ w/ a* N& [0 W# b" Z

1 s$ |  A8 @" b, Z0 fVue.config.productionTip = false
9 B$ `- O0 e  K( S. V1 S, q( }' p2 W! H. y
/* eslint-disable no-new */
9 w/ S: r+ s9 f7 v( Q) Y3 r  ynew Vue({. u& i% Q8 \) ]* M' i
  el: '#app',
" {( A/ P; q- V8 ]& r) {  store,) I. e. p  H3 i+ ^1 g6 P  _
  components: { App },
4 y  z. v  t9 ?4 s7 t  template: '<App/>'5 B1 _1 A$ X, R. \8 l
})) t( U7 s  h, E1 L# j% g4 h# I( k

* S9 \$ Z: E* T- w1 l! p7 V

0 ~3 y! Z* T) V0 K9 f: z
: ^1 }; `) i0 z$ ]
(3) 修改 helloword.vue ,先使用state获取值进行测试
( [) q. s# T9 g2 kState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;+ ?" {+ q$ H% U% Z: b. @7 q
const store = new Vuex.Store({  J: G. v4 l3 b* P' p* i
  state: {
  D" j: _% I) l( Z. [1 B- I      count:1& ^# X% v- Z4 _# L
  }( G6 H  Z8 K: `, |
})& k  U3 E: X+ ?3 M
% b/ ?: x. M& ], A$ }5 }8 v
helloword.vue----
( `( V2 T8 F& t/ f<template>
$ D9 u; C" ]  b9 d  <div class="hello">
% E4 N$ p2 H) G
" E( m4 L4 V- o/ o) u: y2 k$ {7 K    <h2>{{this.$store.state.count}}</h2>5 e: @3 ?9 |: J9 C0 @4 {
# j9 X5 f" i( {* d  ^! M7 Y
  </div>2 h2 q; a2 g' t& Y  i/ t
</template>
% r+ T) X; p4 j$ Q* O# M6 n8 {0 x* o$ ~
% S, E% j, {' ~/ C8 {1 o7 q
显示结果为: 1 # N0 f  Q, z8 z  E" `7 w) T+ q

1 Z# q- a' F5 c9 \% {, u3 `* J9 Z
- v, _/ `3 l/ e6 W
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:4 X( Q" i+ Q$ \  Z  I

9 ?3 Y+ e1 |4 x& m$ v& g$ S. aconst store = new Vuex.Store({
3 z% e4 N3 B6 U, T/ G# `8 H  state: {6 N. {/ g/ Q& f: f7 F0 P
      count:1
& ~4 [" W9 G. c: v  },
) a6 A* I+ h9 H* e  getters:{$ h3 f( x5 K2 h' q# B4 ~
      getStateCount:state=>{# a" a6 S2 r( c! M$ Q
          return state.count + 1;
/ @% s0 c9 e% K, u. ^  y7 m      }/ X& \3 A( s" s
  }
3 \% p3 e1 Y  {})
5 P# N* L* n4 N! A6 [3 \4 }( S
1 I8 ~0 A) |3 q# s& Q<template>
$ I- \: w* O" u  <div class="hello">
0 B6 k7 w* c1 v  `9 P8 D9 W
3 Q" H  I* D9 t2 ?    <h2>StateValue: {{this.$store.state.count}}</h2>
0 C. t0 I' g% j( n     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>6 D) L! U& I3 W9 l
  </div>
" g: H% h0 Q5 ~& O" M</template>% |0 g% a  H; G

% Y9 t& Y) \  k4 r5 G& x

8 g0 _/ R2 n! x) [显示结果:
' R1 y8 _6 j9 ?1 p* @- DStateValue: 1GettesVaule: 2
& D0 t! ~4 a; E3 D5 k, s7 x8 D' f9 G* |: S: I6 }
(5)
  }! p& Q* U8 X/ D% S& D

Mutations:

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

. h, D! Q2 B* O* s
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:) D9 ]4 u# C8 f' o3 u
mutations:{' L/ y2 o4 G+ t
      add(state){
$ V/ ]3 n% l( n         state.count = state.count + 1;
8 i- t& T; W. R9 n      },( r) b5 l5 }5 q& h3 w
      reduce(state){
" q3 U+ t3 h4 m* F( @3 G3 ^" [; t        state.count = state.count - 1;, D7 i" V9 g4 R/ u
    }
7 @, j$ }, O; M4 T! ?  }  ]/ @' e4 A6 u. T
<template>
- Q+ ~' H7 q/ {$ Y9 m8 z5 Z4 C5 P. t, Q  <div class="hello">: U" c, e9 T9 l" F* Y, F
    <h1>Actions:</h1>/ G% q" ?- o* w! {8 K
    <el-button type="primary" @click="addFunc()">Add</el-button>( j& q/ P" i  k8 q
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>) s1 n/ \+ z8 R& \3 s; [5 G
    <h2>StateValue: {{this.$store.state.count}}</h2>
* F  [  C: D! B2 e, ?1 H    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
, d; G3 S8 r, J) x  </div>  P$ M8 C) H8 B
</template>
8 B& r; ^5 j# t7 W2 `' _+ m6 R1 ~! z
( x4 ^+ M( A; z" x5 V, F2 ?
结果:  H! `5 I$ k# B( ]6 T

- u$ z0 V: H# E9 I& l: f0 x* ?: b
4 L7 i- o- c" c5 k0 s5 s5 ?
Actions:Add
ReduceStateValue: 5GettesVaule: 6' n* _2 r+ C9 G7 w+ i7 ~5 W

0 N0 ^3 c7 Q$ N) m, j- r4 J# C) a* B9 o2 R8 {" L

9 K( ]: E5 i2 Y3 P) [$ @# X! R
1 y( b1 u4 N% p* k" D0 b
4 Q0 u( i, R7 f: V; S
! t; W: b+ c4 g! g

/ _7 U9 S: z1 r7 C8 s; g/ Y1 X6 Q/ x+ g2 t+ Y7 I4 s
(6)Actions:/ z6 G. R1 H! M& `

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

4 V$ U4 x) ?" u5 e* P- k


# E" o8 y7 ?6 Rmutations:{0 I9 f/ R- j8 i, `, Q/ Z3 x; G: S
      add(state){" p# w. J9 _( ]0 J; c
         state.count = state.count + 1;: j  F, b8 c0 ^/ |
      },
7 {- ^$ O& m' M      reduce(state){5 x5 E* O, P# ~- q
        state.count = state.count - 1;3 ?0 o. {) M& p8 l& M9 M
    }
* H2 q5 ^: d: g7 C% Y2 F  },
0 f5 `! S4 P# [* k& _  actions:{
' T3 l+ e8 M  ?; T& b      addFunc(context){
7 b! [+ M8 ?& M; u' y          context.commit("add");& G# t' e6 C; i; N4 @+ E
      },
4 w9 \2 H0 o; X  F: ]( B      reduceFunc(context){
% ?+ K2 u. G" U- A          context.commit("reduce");
; X6 R- l/ h- ?. @# G* H- u      }
; q/ |$ a/ o  c: d, Q) P" |  }
! O7 Y& y6 v3 j4 {" \9 f+ c

& ~7 J! q' z& {4 t+ t2 Q7 ]) p" H

% O/ I) B& U4 g4 ^5 ^+ ]. N


. L8 N# i0 _+ Q' l+ K  methods:{* F% a: A" f! e% ^
    addFunc(){
) a+ w$ G/ S5 M$ B7 c( C      //this.$store.commit("add");
4 U( h7 K8 x3 ~      this.$store.dispaTCh("addFunc");  z7 W% l6 p( O1 T$ f
    },' ]- X  A/ E2 {- Y$ P/ s8 x$ A
    reduceFunc(){
/ M1 k2 h' t1 x2 v' o% A; ]' C! ?      //this.$store.commit("reduce");
+ ~$ }9 U, a4 I       this.$store.dispatch("reduceFunc");
/ A# E* e6 x# z3 O    }
8 ~6 m! q8 y9 n. k  }
9 R( F* [8 J5 w, n1 A) A0 @3 L/ y

2 J: Q# d* [( Q# L0 y- [  }$ @( U这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
" l# y: w. [3 @; e" T实现效果一样!!!!$ U5 Y2 H+ e% l: r! A1 v

. M$ t% ^# ^$ J- g" x+ X$ s
) o1 B6 l  r- a6 i0 B' y
. Y0 U- {4 Z5 l! T2 f

, v4 l' L# g; l4 i

* W& w, W  d6 G) e

6 v) _0 l1 v* @) `
% y0 k7 k9 }  T  K2 ~  Q. Q2 P
/ `+ ~1 m4 r9 u9 s3 c4 {* n

4 \' b! f5 `3 M! S% x) V1 Z
6 {% P+ V2 z+ M8 L! y6 h
1 ?+ s# i2 `/ Q. Z* J: m
9 b( K8 |) ?! I4 n

* q8 r. V: G3 l) C
+ M& k' v7 C* g" O% V
! h8 t) w: X9 z( b3 `; C* m3 @- l( e" y  _  h% i( X- W! F' [$ I% f
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ 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文件如下:


5 I: p+ a6 c& u8 S% t2 w$ S7 N

8 e  t/ j8 X3 d/ W) p/ E


) d' p0 S) i* U4 _% i/ o

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。& ]* z% p% y# _, K/ m1 o0 Y

& H# F2 N. @. B; S4 t  e/ bimport {mapState,mapGetters,mapMutations} from 'vuex';
* H  F' y4 }  x* T9 @1 u  [' @export default {
$ L; E5 @- u- c- X2 {  name: 'HelloWorld',
1 i* n& M$ N) S* X! {) O- T  data () {
# u: r; [/ L: Q, W' i+ Y; D    return {; y+ T4 D  \% p, H
      msg: 'Welcome to Your Vue.js App'/ Q- c% t: @) x9 @5 W  ^
    }+ K: @( g! ?" Q( q, ]
  },
  E  B1 k% Z. f- q, ]  computed:{
( n7 G4 }% c3 ?7 v    ...mapState({
' M6 x6 M/ y  ?' q* O      mapCount:state=>state.count4 C6 T% p7 |8 N+ e. n. v+ P! ^
    })* r* ^1 G& u; M4 N, l
  },: j/ R" @+ }$ V$ [0 w/ Y
  methods:{
: J9 {, B& Z3 H( G    addFunc(){8 }- x7 [6 c; @! \8 ~6 f
      //this.$store.commit("add");* c7 |* D  {; F
      this.$store.dispatch("addFunc");  w( d8 k0 Z$ }+ O* c7 x: T; t/ i
    },
! |/ B5 r& L; {    reduceFunc(){
  T) H. [, l0 G, a2 b7 [" \      //this.$store.commit("reduce");# y9 I: I/ K4 l* N8 v! n' v# v
       this.$store.dispatch("reduceFunc");1 U$ J) X4 ]8 ]- E" K$ I1 }8 ~
    }
/ i9 i& I) r7 h$ G! ^, }, A  }+ I' A* j% i) g7 Z' G4 ~
}( W. r* |9 g" Y% B% }

, V8 t# }7 e/ ^& G5 O- C4 E4 b* j9 r7 f4 R

- a; l* N$ h5 W7 x& e' _+ n% X- {# t* f& M2 {9 Y' A* N0 A
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

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

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

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

    我知道了