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

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解
! q' `# u4 s  d9 O( \" C% \& W, U/ f
# X; _" p. A5 ]( r7 l4 N; ~本案例测试下Vuex的使用,创建一个新的web项目
6 I  X1 d$ j' ?; S6 B3 M, v8 ~Vue init webpack web- g* Y) @; Q) V
安装vuex$ m+ z* k( L6 m: K) S
npm install vuex --save
( [: y# w) A! x1 p( x9 u$ w9 D4 J启动, npm run dev,打开localhost:8080  即可
- c3 C. f5 R& x  e
' D6 X" K5 x- }( W0 J$ Y% A. j9 d8 h
(1)引入vuex" W- Q- s) Z# j" `3 s- ~0 e
创建一个src/store文件夹,创建index.js , 引入并导出store3 f0 m" ^2 K: ]- u" a" Z
import Vue from 'vue'" E1 z* X: ^2 T3 d
import Vuex from 'vuex'
! w' W0 ]7 X' ?1 W- X/ XVue.use(Vuex);, A. L7 l, F- f$ N! v7 `/ S8 D
const store = new Vuex.Store({
  T$ a; r, L. b% M3 ^; i})9 ~8 B, W6 z  V# r; Z3 m( E
export default store;0 v" p( }/ I# Q
$ ?$ i/ q  K; W9 ~% y, S1 u( j1 X
(2)引入store到main.js
0 }9 ^+ X5 M7 l/ |$ D( Nimport Vue from 'vue'
. N: r+ i2 v/ ~; U4 oimport App from './App'0 N  f) y$ h  I. G/ n0 c
import store from './store'. D# j) o) M! V9 n
7 i# M  O- w8 R. g. t  ^2 e7 R
Vue.config.productionTip = false
2 X2 l, `$ c) X4 R
) `' h! W+ ]7 K7 e* [* h. R/* eslint-disable no-new */
% C# {2 R" O' I! Q# L- @4 pnew Vue({
7 D4 g% ]) j- e/ V  el: '#app',: J  R2 H+ S8 c' Z& {
  store,$ ]; I8 y) F( V4 N/ D* E
  components: { App },* l+ e' ~- @+ I! @3 w" x) k
  template: '<App/>'5 p! Y( _* ~) W
})
% f' Z- t6 G2 c* `" [: o2 b* O- o5 j2 O! G

# h, k4 ]4 I. e/ H2 g9 i8 K

6 \, E* ?* Y2 E5 U; U! ~(3) 修改 helloword.vue ,先使用state获取值进行测试
% _$ Y8 l) M+ EState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;& W  Y& p5 d9 f1 L8 S; V
const store = new Vuex.Store({$ P; j, M, c5 V% `
  state: {
/ v# U" I: _& a4 [" m      count:1
9 L$ R+ J6 q4 W# i" D$ D, \0 R+ F  }
+ P1 ^+ f0 Q  U})
; W& g* |  Q# c6 m" b3 _2 {- J
( T. k1 p$ W" L" K3 q7 W/ ?7 Shelloword.vue----/ i0 l6 E* k2 B. N1 f# @( M4 M2 }
<template>" p, \, A) }& K8 c- H
  <div class="hello">; l* E) B2 ^' o5 _) X. g; \
* N- f9 R5 T' H; g; L
    <h2>{{this.$store.state.count}}</h2>
  l8 \: g/ }, y) m
1 z+ N8 ]: V) ^2 X2 V  </div>
2 r5 {! c( }/ M7 \5 ^: s</template>
* }6 X# D. V7 M$ B
3 z5 }4 C. M& i0 }

& G% e7 P/ S  T  F5 W" J9 Y显示结果为: 1
& |4 q( w3 F6 z' f8 ]2 I# Q0 p. [8 @; C

( f! n) f. W- h  R6 H(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
- c' u) Z/ \/ I0 t+ t' @) x  m- d, Y9 q* I5 |
const store = new Vuex.Store({
: _5 \' J  y5 P, z( c  state: {) N1 q) O3 a4 T' y8 L- b
      count:1
; G% Q$ q5 j2 V3 m8 l& R: [% g  },
5 Q$ y) Z6 U  L! @7 V1 h! V  getters:{
( C$ U6 P+ ]" @! Q- V- x& C3 W1 p% X      getStateCount:state=>{* m% J) o) e: l1 A# [! |3 @# o
          return state.count + 1;
& R, A$ K5 u+ z5 m) q. I      }5 L6 s/ T$ T  z1 j5 n
  }
8 {$ P  J0 u- B$ K' u) m/ T: ~, N})
2 |9 h6 K4 [. y* r+ e8 B( G# _3 u- s# _
<template>2 ?# [7 v2 n/ J' L, }
  <div class="hello">
, s2 R1 Z0 B9 [; H/ A/ c- N5 G" b, h% u+ t" m+ X
    <h2>StateValue: {{this.$store.state.count}}</h2>
! @$ q0 ~) n3 C5 Z+ [) j     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
: m& U( g: h/ d, s, K1 l  </div>
  y! k& l8 `, b: [' \# T( T</template>( Y7 ^, C" U+ l6 k
' u6 E; b; ^! o( o* p) c4 {, x" L3 w

+ z- T3 a: V9 w显示结果:
2 e- H3 w, v, S- Z6 HStateValue: 1GettesVaule: 2
( @9 K2 L$ G& {5 ], M- B+ o/ ]# l* \
(5)
& V  j; I, B; i

Mutations:

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

( N) h$ A& r/ g; g
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:+ X6 `( }: |& R+ g9 g
mutations:{. ]! r7 S. \3 n1 P1 h4 y
      add(state){
# e! x1 R1 J; `/ {' `6 W         state.count = state.count + 1;
' p$ H% ?- [. L" ^; _0 o( ?      },
0 Q5 j# D/ N' z& C0 U: g/ D      reduce(state){5 [/ O- o8 l" e; f( ]! p
        state.count = state.count - 1;+ A5 I- _/ c) S& @2 G* C0 h4 R
    }
5 t# t  _/ a7 u, z  }
% r) _) j% l! J& I8 Y/ u<template>
3 k! D) E+ I+ ~; b  <div class="hello">
  x! J' d8 W( ?8 F& q    <h1>Actions:</h1>
7 D& f& o7 p/ A8 @; n8 l3 h+ y    <el-button type="primary" @click="addFunc()">Add</el-button>0 i' T) G9 s8 B+ c
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
( B) ~( j% r! _' a1 o  u    <h2>StateValue: {{this.$store.state.count}}</h2>
( @- K( o5 v; F5 v1 R1 y    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>; }* `& ?  S! L! j  X' n, ?3 F
  </div>
) ]. c: s1 h9 b</template>- i+ I3 Y; Z# p  J# E! ]6 O4 x
) c1 p5 a1 [/ C8 c
! S( s3 c- s7 O
结果:
2 O. w4 P% W$ Y0 }" [$ \2 s9 C; L) g: |4 q. ]$ \' ~
1 h. T4 q7 D% [! ^; n
Actions:Add
ReduceStateValue: 5GettesVaule: 65 X/ d5 E# g6 h: f
6 p( T$ v  H9 C+ m! ?

: u/ G" I: u2 l' j: z9 n

4 t+ n$ [" t  `& F, F- |  L
8 c9 T% V2 F; o) O; i

! H, G9 [0 ~2 M% |. q( I% j1 y# w' h  M/ p
9 a) v" \0 Y8 `% Q6 U3 C" g

3 P! j5 U1 A& `. X(6)Actions:0 G8 z0 }3 x) v

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


( `6 F0 ]' R  L3 ^7 E: `

- V  M1 i5 O+ N
mutations:{
6 K7 [& o  B/ m- Y      add(state){5 q& B5 r# s, }% D0 E* p) S* J
         state.count = state.count + 1;
% u" A7 e# Q5 w5 b2 D9 g; m. Y      },$ q$ L  U1 |. f- Y1 H+ b# x2 G! C
      reduce(state){4 M9 [0 o. ~/ K& x% {8 `, I3 s8 R
        state.count = state.count - 1;: q, n* `+ s& x; x
    }# m& B6 `9 O  @- G7 b% |3 t$ j
  },& ~; u- m: ]: e/ e7 h) E
  actions:{
( h# {4 ~+ a4 K  _      addFunc(context){
6 ?1 l+ l/ h7 ^% r+ k0 Y          context.commit("add");/ ^! y$ O' w% }9 N  K) \& G# n% R
      },
' w* K# x  X4 [# E/ }      reduceFunc(context){
) K9 `$ w, T9 K" y3 B0 f          context.commit("reduce");: N4 r2 @* B! E6 }0 z
      }
5 J* Z3 G+ p& \& k# y  }0 A8 I2 t5 y8 r: b9 b+ H; O

! k$ J# |8 g/ {


8 P! l4 q/ J8 |  ~& O


8 W1 T! m7 h6 N4 [) Z, l' r, p  methods:{4 G* F. r+ F' o: O, f! u- B
    addFunc(){% C' E. O  M5 u( _# Z
      //this.$store.commit("add");
$ L9 H7 P4 N$ k* j( T7 g& v      this.$store.dispaTCh("addFunc");* u! \5 ]$ A0 o; V! t
    },
4 h+ K& j4 O- b; ?2 Z; e    reduceFunc(){6 R: M8 [; |) g2 F
      //this.$store.commit("reduce");
3 R. O: R1 w6 f" I       this.$store.dispatch("reduceFunc");
% w( ?4 T$ U  M8 ?    }
" u" ~7 p6 u2 b* s6 k& k2 @2 E  }
0 C7 a4 U! I# t8 _4 U" @

4 q2 c/ K) E& s* w这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的* [: ?& S3 c4 W6 D/ u9 o$ w
实现效果一样!!!!) {. k% u' z, z( y; v$ |4 {
, {3 A/ g+ w+ ]0 f4 u6 z

* H& g2 B( w& S$ E5 N$ m6 ?0 B; M- [' [7 d3 C
9 u# L5 h4 L0 F4 c; f+ T! Q

/ [1 P: I/ H) x


7 U2 {& P8 T0 P& s8 O/ j( X
8 s  `* D2 c& N1 @* x0 ?
- H% S; B# Y# V* N: e

* T% W' h* D* T) k4 ~
2 `+ _4 i: ?4 w4 ]/ |7 S0 g/ p( T# I

+ ]( ^5 c( I4 k) L
( {$ m' g# F( P+ N9 U
0 t: q6 k" S4 L) T! I
8 |" @, m3 l; c' d% p, X  r
" r* i8 K/ N; V2 {9 E( C+ O9 Z
: |- d; `7 ?6 J
上海点团信息科技有限公司,承接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文件如下:


% _2 a8 J1 X) f) B3 W

0 j7 F$ l5 Y! [  l2 ^9 i


; c' L2 T; W2 `( T) r) X; q6 y

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
: V3 _& P' _; w4 [8 ^% @

6 v3 ~: ]/ i4 O9 eimport {mapState,mapGetters,mapMutations} from 'vuex';
+ w3 r/ |, }( Z& x- x8 Bexport default {0 F) p7 |/ q/ J+ q
  name: 'HelloWorld',
2 f2 m0 ~* A5 P9 S+ _/ h$ C( r  data () {4 D, k% L1 [! |& ^
    return {' _8 M& K8 S; w
      msg: 'Welcome to Your Vue.js App'
3 Y" G% V" I+ y% r4 E7 {) X5 n3 `1 `    }) m- l, z+ g& c; }) F- M
  },& J" s) ^( L5 g) \7 m7 `0 Y
  computed:{6 k6 \. O; U! _: j* A' {' S
    ...mapState({
# Q+ s. W% i1 W5 l# P/ F( C5 q      mapCount:state=>state.count
5 m) A6 `9 s6 U! k; N: p6 G* ]7 A    })$ Z( Z6 s8 C5 E9 c
  },
) d1 f% L, E/ a& D% x  methods:{
' r9 k4 ]; B, H( i    addFunc(){3 Y: [. e. ?. B, A5 G
      //this.$store.commit("add");
( S& [1 Y0 @- g& g7 i8 c5 S      this.$store.dispatch("addFunc");. n& ^' u+ ~4 B
    },+ n. O+ ~4 N8 p, w3 ]7 K6 z
    reduceFunc(){- K* Q  [1 T- N* y( J. B+ Q
      //this.$store.commit("reduce");
: {0 {2 Y' ]. n+ ^2 k% z8 E  t       this.$store.dispatch("reduceFunc");2 \& D( T: I! B2 i9 X! ^9 j
    }
4 j( r3 P: t4 n5 |" X  }) h, t3 `) o3 M+ X7 Y
}. Y; {5 c" C+ w. Z  c& F' j4 [
2 c) a1 i5 ^. M5 Q: Z6 x! X

, k9 ~& Q; M7 E

" g9 |8 @- i6 F6 |  x* M  j7 J* ?1 r
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了