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

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解
( l8 ?6 H- k4 B$ V  i# w1 a& n/ ^: m' \# Y5 W  R7 {3 P* q# n
本案例测试下Vuex的使用,创建一个新的web项目9 c) E0 T6 |) b  Y
Vue init webpack web
% N; ~' s' y8 t- W7 K7 V安装vuex  P2 S. I! m; p. F7 K2 l- O
npm install vuex --save* R$ i1 B2 g2 J' F. ?% }
启动, npm run dev,打开localhost:8080  即可
" ~* A0 Y3 a3 A* G& r! a" ]2 d$ ?8 s# g/ F( }$ W
( O3 D5 @9 ~7 R, n7 B/ J$ Z; s9 o8 a
(1)引入vuex
8 D7 V7 R5 p/ a: C/ h; p  q创建一个src/store文件夹,创建index.js , 引入并导出store
% h  w$ u' C% p, W4 ~import Vue from 'vue'  Y1 e: L# r' A/ S7 ~
import Vuex from 'vuex'
5 T" [, y2 O: R( KVue.use(Vuex);5 X% J& K; s0 i3 y
const store = new Vuex.Store({
0 A+ V2 D5 Z" w) ^$ j})
, U. [: w- t$ x3 iexport default store;
$ K; y( N2 R" m+ d) c3 m1 C) E( C8 T1 q! m, e3 l1 `
(2)引入store到main.js
# s/ t/ p; g; H/ T1 P" m+ b; ]import Vue from 'vue'+ }5 W+ E( W3 b0 S
import App from './App'; Z! H, o3 G7 E. g; r( o
import store from './store': t% w& p! V9 I4 H$ ^
% G) M1 R8 y2 x3 I
Vue.config.productionTip = false, W2 g% k# G2 H. K, Q# ^2 C* d

% S6 T1 i" M& q$ x4 A; R. B6 h: J/* eslint-disable no-new */$ h0 X1 x5 n/ T- W  F
new Vue({
- A! k* Z  w# O  el: '#app',
8 h+ G3 T! G& X# T0 f& F: N  store,0 r' h3 c- w1 m/ x
  components: { App },
7 ^, T) F; u+ C& E" _5 c# |  template: '<App/>'* T$ l: r& l# W5 {+ {' s" c- E0 z
})
* [1 F5 V* Q  f" f1 ]' o% ^4 ]$ L9 |. q3 E& b9 C1 V6 _# {8 m
/ K6 Y5 n; E2 i: X3 x
" `3 Q8 O* F9 h, k3 j% b! @
(3) 修改 helloword.vue ,先使用state获取值进行测试
( Z! Q* u, n" Y& D/ M. uState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;6 P* Q* {% Q; [
const store = new Vuex.Store({
2 \# u( m* ?% \  state: {
+ {# [( ]/ }4 S      count:15 M0 M* a/ l, V. Q# L
  }# z$ \+ J2 v5 y/ e
})
, {9 W5 {) }8 J' L0 z! g/ B# s( _8 y9 b. S
helloword.vue----
8 G9 T) J3 S7 D0 I. f8 M<template>
% a( L3 u9 y: t1 }1 }  <div class="hello">+ B9 p% A/ B* ?+ P
. [8 x: ~6 f; F8 |3 z8 [+ Y8 T* Z
    <h2>{{this.$store.state.count}}</h2>
( h! |# q6 J2 l- \( g
2 w" h8 |% E, @6 L5 d4 O& j! r  </div>
; I% J% [' `7 Q# [, H! s+ S</template># M/ ~6 p; C, D9 j: u

1 }0 B! {5 I9 d1 y' d3 Y
: @3 E  H0 V% b0 F
显示结果为: 1
1 ]2 R0 W. j" f& @) N/ d: {
( P( s' M* d6 {8 N
& I/ f2 c5 \9 d% \
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
4 S3 @% `: p) J4 q. t, S2 E% |$ M3 j1 Z  M& f9 l  u1 D
const store = new Vuex.Store({5 ~) B. x, q9 b
  state: {  ^* V3 W/ a3 P9 G
      count:1
: W6 ^5 q0 q: n8 U; R' _3 Z  },
( h# p+ W% O6 `+ _' q. ^6 Q  getters:{- `2 V9 j6 V+ h* ~
      getStateCount:state=>{3 S! K, K, [/ b( G/ f
          return state.count + 1;3 ?. ~' Z" T, b1 E& s# q
      }8 ~! l$ A! w0 s- j1 ^7 T- _
  }1 M4 M1 z& n1 P4 l: z$ n
})" n  X# d+ Z2 g
# [/ V+ t2 s1 H( I
<template>
. K2 w) b1 T3 R  M, V  <div class="hello">
3 n- k+ e7 K2 u8 p# |, N
, p: t0 ?" e8 A; B9 w    <h2>StateValue: {{this.$store.state.count}}</h2>) g4 n# M! x: H: a. C
     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>4 f, z0 v* `6 f8 g3 k1 P. Z
  </div>
( e; I/ ], f* [</template>
9 v0 W. j  P+ ^, U- R/ r0 j! W7 z4 L% s, x

& o% G! v. @  E0 K9 s显示结果:6 I) ]: x$ \) @$ e
StateValue: 1GettesVaule: 2
. K. r! O5 K2 h
- ^0 |  ~( y! v6 J# s(5)/ t9 J0 \6 H6 Z) j. w! k

Mutations:

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


. Y5 E: g1 _$ r- P1 b% H7 j( z* I! Y修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:6 k! ~9 a" u! y/ b" d3 q9 o6 h
mutations:{: z/ p& U5 M& g' v  i
      add(state){1 P1 W7 I* K# |# F1 M2 v
         state.count = state.count + 1;4 \5 z7 H8 H- w
      },
/ |' o3 t8 M; j6 H- n$ S" I      reduce(state){3 A0 H, N2 {8 ?3 @2 X+ g
        state.count = state.count - 1;3 q' i3 |4 T6 Q. u. [" \, H3 D
    }
* I- ^  q5 ], b8 h, o, }5 a6 c  }  ?1 [  H2 D  ?# }+ E% c
<template>
+ A( {$ }# u" A$ _: x  <div class="hello">6 \& j" g( n* R/ @+ t7 h
    <h1>Actions:</h1>, d  M8 S" D, J
    <el-button type="primary" @click="addFunc()">Add</el-button>
: H& ]5 r& C/ E5 c5 c" I1 G    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
+ o4 v7 t; T! ^$ f) m1 p8 A9 O0 `    <h2>StateValue: {{this.$store.state.count}}</h2>
/ d, z, Y) y0 O0 W1 S( h    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>1 d- W- C( E+ H' y: f/ X+ f0 s- I
  </div>
8 Q: a7 I7 e" O2 y1 G</template>
# m( p: v7 ^! M; _* ^
1 t8 Z& `8 v2 ~; c/ @

6 O3 T# x. j; A7 i结果:3 P( e3 U7 g! w5 z2 x) y: ?: x
6 y, S- V! {- x0 |% {; b

0 r5 Y5 P* _# t2 ]/ rActions:Add
ReduceStateValue: 5GettesVaule: 6
% m9 D$ Y/ V" {/ C
/ H( ~3 G% }. e5 v- l) B5 E# R  \0 J# T- q0 q

7 `8 n  m: O6 g" I1 J+ u2 U& T4 Q% @4 n) |

4 M9 H; b* F* S- n9 K6 G
0 m& H$ Z: K& M/ W1 Q
/ ~: p! J) P0 j5 ]# V. k
* o/ s5 d2 s0 z% f9 u, I
(6)Actions:2 j+ k/ W3 ?. W8 C! F+ @5 u

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

; {+ @& i6 x8 ]


% Y9 F. x& ]: zmutations:{& r! f3 z( D. u* n
      add(state){+ i; q$ l  d. ~4 T
         state.count = state.count + 1;# `- [$ C2 D7 o' a. K) C
      },
6 f% c4 v8 Z' N3 y      reduce(state){' c" v6 P1 W, ~0 F3 V* ]
        state.count = state.count - 1;
4 ^. y# a$ R3 O4 |3 c0 O0 e" z    }, ~% A$ Y& Q3 w* `9 T3 R7 G: M8 `. _
  },
: ~0 y. p- f. H+ Y# e! z  \  actions:{( h9 t+ V0 n  ?+ y- y# ?# W  m
      addFunc(context){
2 o9 X! L8 w$ M  b; T9 f9 H4 G          context.commit("add");: w- h! j+ T% ?- _! f
      },$ L/ O# B2 j6 ]7 e' [
      reduceFunc(context){0 M: N. |* H' [
          context.commit("reduce");7 z- P' y# l3 K5 b) K
      }
/ d- B2 @$ Y, Q  }4 o' c) q( \# y: A: k0 \! g4 e
( l! v3 F# Z% x

9 I# B- \- k8 X; Q" u6 N

) M$ Y9 X! d3 f" a. m
  methods:{
5 O+ d6 t% \6 w& S) k4 |$ F) n    addFunc(){/ X9 }4 l/ A# ]: B3 P. Z
      //this.$store.commit("add");
: ^- M$ D" L" V- X. F3 y6 g      this.$store.dispaTCh("addFunc");. s# S9 G* X. r% `9 x
    },
3 D* N2 A7 }1 G# f; O# \* I1 @    reduceFunc(){
- X5 f9 C/ Y" ?; n0 L1 f      //this.$store.commit("reduce");0 g1 j1 q+ l1 x. Y* c
       this.$store.dispatch("reduceFunc");
/ `! m5 I4 O$ x0 Y: ]    }+ A# s+ h3 \) V  w
  }
4 f' e5 B/ z7 {/ R% m: e

  \2 T+ z- `) ^7 S2 _这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
1 h; m- s& k' b/ H* l- B实现效果一样!!!!
1 l5 u( a7 B9 l) V  u5 D. h: S$ e3 i4 S% b- e/ O4 r! ~
% R: e: M5 @# R4 p  h+ O

; I+ r% D( B. V# _- `2 H
/ Q6 j: ~: e, t5 l: J6 t3 x9 P3 C8 L

5 g6 A, p5 C  Y2 C2 r) |


6 I3 ]( b- b3 K7 t7 j8 i
& j. O' I# a9 m) x' I5 v
/ |" K( b$ t- G5 }! \

" d6 q! b9 _5 d
& {2 \3 S% H2 t8 |4 c4 D# w, u

& D8 m+ e9 A& b; W- r& r. J9 h$ N( _! M5 }( P+ H& Y4 e6 g: e& E

( q. N0 L! Y& x0 d
/ {- i, x9 Q+ w' u6 s4 `9 A0 T9 o6 _% o! h

% g9 g1 q2 q5 K. Z6 l
上海点团信息科技有限公司,承接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文件如下:


% l. r2 E! [( c; P. Z


* @; o5 ]$ ~- J; O0 ^4 N  x6 U

5 m( z& m2 S. C- j9 O& ^

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
) H: L! ]) v, ^9 V; |2 a
$ b0 N- Z/ J) r& f: Q9 l) ]6 A
import {mapState,mapGetters,mapMutations} from 'vuex';
2 V9 z' d% Z+ m1 ]0 Gexport default {
% I8 S9 p3 |! o! r  name: 'HelloWorld',& @7 O/ o- s) T6 Y; w* p' C
  data () {
: x3 n& {0 L5 n& C    return {9 w9 I, M; ^( J  }
      msg: 'Welcome to Your Vue.js App'+ C: w6 x- [7 p9 h
    }
3 o4 N% J/ {% n; M5 {+ r& l  },
: s( B; `0 V% |* K& B  computed:{
4 e; d; C; I, ?4 ?    ...mapState({
) F: Q/ w+ J+ R      mapCount:state=>state.count
- @" e- y8 J2 I$ k" _2 p, U    })
6 R& w3 F8 R" f  },
. L+ @- Q# `: b  methods:{
9 O; p$ G8 v# [; l; ~2 V    addFunc(){3 |; e) \+ e1 h7 b4 a
      //this.$store.commit("add");
7 A8 j& X& E* W      this.$store.dispatch("addFunc");, V1 G; d$ x$ h0 K: R9 P  B
    },. A5 A8 ]3 N' Y; K
    reduceFunc(){2 S" g4 ?, ^; P" a0 `* W  ?' j
      //this.$store.commit("reduce");6 u: G, w! b4 x* ^7 J2 `
       this.$store.dispatch("reduceFunc");
$ S4 R' q( k6 }& C; J2 O+ Q    }
' {  |$ S$ U$ Y, e" q4 U  }" d: S( Y; K* B6 Y, F
}: q/ V: {- _4 r$ {0 a0 s5 d
% s+ V: G( [) m
/ w0 y! \% F9 ]! s( U8 l2 O8 J

* I6 E% a7 |' A- T) d6 g9 e8 d2 r8 ?6 i* o: o
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了