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

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解$ y, E6 n$ B  \; V4 r) D

) _( l8 r" D" k) Q本案例测试下Vuex的使用,创建一个新的web项目  H+ A$ O# [$ {6 d
Vue init webpack web8 W4 u) n, E4 w% e. ^
安装vuex
' y1 V7 g6 b+ i: j# inpm install vuex --save
+ E8 d3 W/ e0 Z: H' C# O2 Z启动, npm run dev,打开localhost:8080  即可
% s+ C5 M( H+ [% U3 q" [3 R9 M4 o5 U7 o7 ?1 E
3 k1 e: W/ e7 G, ~5 `0 w2 b
(1)引入vuex+ S" }/ P- g! n) R3 K0 w* G
创建一个src/store文件夹,创建index.js , 引入并导出store. X, r: Y* [# Q+ H+ H% d* `3 u
import Vue from 'vue'1 w2 [5 x5 a: R# t$ E3 w
import Vuex from 'vuex'
$ y; U# \) H& a" C; d# W3 W: Q1 oVue.use(Vuex);' l. r4 k# [; n1 E% j
const store = new Vuex.Store({
# z( I0 j- A) c# {5 D8 n! R; A})' K: F- M4 c- y7 e+ a
export default store;
0 U# C2 l6 y3 {! h
8 S( h# q# R, ~& ?2 o(2)引入store到main.js  `* V7 o5 o) p
import Vue from 'vue'. y  r+ h: [3 p* Y! Z' K# _" s
import App from './App'5 ?) V. j8 {) h% k8 O
import store from './store'
7 L; W! D5 p2 Q! |' J+ j, }
8 U  D5 E1 ~' MVue.config.productionTip = false6 r, |$ T0 o8 n6 c/ l

. ~# `& @% G+ A) j0 Q/* eslint-disable no-new */  t0 }* r( ~$ a$ C: v! @( k
new Vue({
/ e. m0 h/ C/ [  p0 `* g  el: '#app',
/ c" W8 O, H2 D0 r  store,4 e4 B# J1 U& C4 Y$ q
  components: { App },& _, e2 U5 `) w
  template: '<App/>'4 d8 C  E7 E$ `) @/ G! y$ _
})
( O, _( U  P9 Y: d
6 Q9 q* d2 z/ E& ?4 L

$ Z) f# Q& M0 W# m3 j
7 M9 N4 S" \. Q  ]
(3) 修改 helloword.vue ,先使用state获取值进行测试. ]2 c: ~7 E" a8 A* Z8 H) b3 L
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
9 |7 j& D4 i5 P) b  O9 dconst store = new Vuex.Store({, L# h) _8 p! N
  state: {9 V8 r) U/ Z; O$ S. W  \
      count:1/ e( ]$ [* j" B% p" }8 j
  }
  C  ]1 ?% `3 `' m})$ s6 X% |/ b1 t

" o) S. l4 [9 p! @1 \helloword.vue----
3 {2 k8 N& a; |8 {2 f<template>
. Q4 X+ `- \' T! S5 W! s* z/ K: ^  <div class="hello">" F) L- j: u  K" K. t; C

. s! {7 e% f; }% G6 ^. Z" t, A    <h2>{{this.$store.state.count}}</h2>  @$ g! d: E/ S8 v3 L' G
% `9 i# n* p1 n+ K0 m& c4 e
  </div>
6 X" P/ c% e0 ]8 K: {, [* R</template>
/ L, \2 ^8 @: t1 Z! G
  X1 G# K' P( w8 U' Y" E- Z, o! Q

- F* @$ O8 M+ f  \; `  z显示结果为: 1 , }, r5 r5 e: I! j
% v9 F7 }0 E- D1 ^' @+ ]3 v1 {) I# U
$ V/ @. Y0 F7 y+ ]  }8 A
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:7 [8 S! p5 [+ O+ e2 H

3 k+ q# w: U7 T8 fconst store = new Vuex.Store({
8 p' p' a, ^$ ~) W  E* }' }2 M  state: {
4 z6 x/ Z) F. _1 ~4 b- E      count:10 S1 q  x% y* d( Z: p. h
  },
; R% v8 k: ]9 G6 E1 `  getters:{
9 x/ j; G: m( h      getStateCount:state=>{: U% w5 R* T& [+ \  X) o0 S
          return state.count + 1;
& {) E# C0 f2 p8 i      }3 D" y+ J; l; |/ G( f
  }
) Q8 m' Q0 A% G  ~( C1 i: Q6 o! D})
# o) s. C1 ]- G! ?: b3 `! w) \0 q1 `7 X0 E/ z/ E9 L0 N$ {
<template>7 x: a- ^, x( u. l
  <div class="hello">
; ^# _, [8 P7 F: ]  J- C0 p6 x( X! X' Z8 |
    <h2>StateValue: {{this.$store.state.count}}</h2>
5 E1 J$ [2 S. ?% ?( J' ^# M1 P     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>, ]8 w: d; T+ `6 w9 W4 D
  </div>: E3 b. v3 q, V1 j  l
</template>
9 e, l$ C" F, J& k2 p
. T& ?5 [% P0 p$ i! n( k% {; G

/ F' Y8 ~0 _- L) r- _7 B; o显示结果:0 R2 s7 ~* y' K; _0 S
StateValue: 1GettesVaule: 2% [6 Z" C( \* J* Q7 V% A

7 G5 v* K2 y5 q$ i4 X. G(5)
( x$ ?' k- K: V7 R9 p

Mutations:

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


& q0 I, c2 ~& H0 y修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
5 Q3 }4 X0 E2 j) T2 l2 }mutations:{
. I6 j9 y- r$ y' F- K      add(state){! x* d3 }8 K. L( _+ F! k
         state.count = state.count + 1;
) @/ Y& r% f+ L6 j( O) F7 N; |      },) g! x( q- [9 u4 Y7 d; c& o+ s
      reduce(state){8 i- T# u6 {2 G1 j6 W9 `4 K: F
        state.count = state.count - 1;$ I' x( r. Q# y, D8 f% r2 w
    }
/ [3 d2 H$ T2 t; k3 T7 N  }
: W5 j* `, y- ~  V% ~0 R- E* Y7 J<template>7 o% J6 w# \. U  X  P
  <div class="hello">' t9 i1 X( x& E4 C& A9 j
    <h1>Actions:</h1>4 ?: z5 L$ a0 o; h$ M' u+ s4 `
    <el-button type="primary" @click="addFunc()">Add</el-button>" n  K; _$ f% `: R* W
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>: n+ |& L. \! F
    <h2>StateValue: {{this.$store.state.count}}</h2>
& y+ K) h7 P2 q9 t+ p5 ~    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>! Z6 i1 u8 Y( G9 j0 E
  </div>
- }. _* V; t1 O/ Y. k. J2 p</template>" H$ M/ |+ e) _4 D7 c

5 g! q3 `. t, q* Q% n1 s

$ J7 l+ I' ]; X+ I结果:% z; n4 ~/ H# O: D9 B0 s
; Q; ~* z7 J( |* E
( T8 S/ W, e+ J4 n$ f
Actions:Add
ReduceStateValue: 5GettesVaule: 6
) d  A% N2 G; K; y2 ~. i& ]* X. K% W
1 t) F4 C/ h. i' I
+ @; D, o$ S: a$ y# G+ b1 L
, v% ?# d1 T; H: h" b+ W
" c9 g7 b  P2 b5 c* o& I$ ?
  z/ F) H/ J8 \# B  w
) ?; E, M/ d$ I$ ?: Q' c( D, B: F$ Q! c

/ @. B  a8 X3 X; g(6)Actions:
( e& v1 u- p1 d; c+ M- M7 {

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


8 D# t0 `0 P* m: l0 B

, R9 N, m2 N3 d8 _" @
mutations:{
) X9 z1 V/ P1 z! K      add(state){
* k0 D# D, Y8 b( A8 x. ^+ \* Q         state.count = state.count + 1;
& Y5 {8 ?6 _# r# l: h) ~      },
' i0 W; X% z* B0 L6 [- L5 y3 o      reduce(state){/ j0 `* c5 J- x8 Y, r5 d; r; \  g
        state.count = state.count - 1;
5 w! p$ U* p- g    }, j  g% _' p0 X$ h0 R
  },6 [! s/ `/ T  Y( q
  actions:{
! w: }3 s: {2 g" Y2 d6 l. N' \1 X/ k6 b      addFunc(context){
9 u# e/ l3 c; i+ w. b' W          context.commit("add");
: z; I' C# }- t: `5 Y      },
5 V! [" z3 D$ Q9 \9 w      reduceFunc(context){
4 Y3 B- c7 \) j+ t4 ?- h3 c          context.commit("reduce");
1 \) o; e8 C7 c! w% R& Z$ i7 q; Z) t5 @2 c      }7 ~& z  ^4 S# |7 \7 f3 V
  }& y. {  x6 a6 i2 F

! z0 |+ _. v4 T& G

# X( u+ w3 Y3 C0 n; I- b6 q

8 [, n/ J* o' L6 M* k
  methods:{
: Y8 \: C. P8 b! ^    addFunc(){
- x8 g" T8 l$ ?" t      //this.$store.commit("add");' G' H+ k; ?8 I# W: W
      this.$store.dispaTCh("addFunc");
5 D" `; N0 x% z8 d7 p" R% V    },
# B: M7 b. |/ r( t/ {) j    reduceFunc(){# l- I$ u* A7 G) r4 |0 p
      //this.$store.commit("reduce");
' @+ Q2 Z! N+ b$ X! z3 P       this.$store.dispatch("reduceFunc");7 l+ o" ]! p$ {8 [, p8 _
    }
6 D) h' u/ R3 w6 s6 U4 F5 _  }
0 h2 C- O% _/ Y0 U: m

1 S8 R4 G' _( r9 }- o/ x3 p, M* q# W这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的% ^; Q' R; Q& |9 {9 r1 l5 [
实现效果一样!!!!7 }5 g1 S( e1 N! ~6 Y

8 p/ R$ f3 v7 Z) Q* n( T0 @9 ^  n+ ^# r( ]6 {( \
0 |; G: ^- _/ n' G( }) U

$ N+ \' G$ x. t: h: T7 H


6 T8 _8 y' W+ b# d/ Z3 ]

: ]+ Z) ~% L; a. ^
1 T7 o8 a' J% R) g+ Q. n/ I7 G4 K8 N6 h

6 n6 z. L/ P; Y1 Q, f4 ]3 z$ }* j7 q( J) B& }) ^5 \3 a3 B" j

/ o" C, c3 b( a4 Y  k/ U

& B) J: b) ^- E* q* }1 M
+ P) ^& _9 ]( A
$ z$ V2 x. T' k8 Z3 z& v, Z  Y/ A; {8 M+ ?8 j$ W
3 T7 W! @/ T3 L0 J$ K
; B+ \- `+ `% Q" _; m4 Q
上海点团信息科技有限公司,承接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文件如下:


7 T4 O8 Y+ H* X; X% g# |, I: B

, ~) U% I( _& M. I4 J, d/ t+ L

, ]2 i0 [" @! W

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
6 c4 r) B5 g+ ]" m& Q3 V! U/ `5 z5 y
( _8 n( J# a: ~, y2 T
import {mapState,mapGetters,mapMutations} from 'vuex';% N1 W& S! c6 U5 t' a8 m
export default {/ H  }6 y  V& i0 ~2 t0 J
  name: 'HelloWorld',
. k8 W; F! v, S. W+ T" O  data () {  e/ Q% D$ M  L! l* w
    return {
2 s7 C! K9 S9 x% r6 Z5 e      msg: 'Welcome to Your Vue.js App'( D; K7 B, A+ ]7 g' Y* k) I' ?
    }* v2 V1 Y2 |8 n8 L
  },
! ^- `( [* T" t* w! `  computed:{, a) c. A* d$ ?1 y3 W- N
    ...mapState({
8 O' }% y) H9 S' [' k      mapCount:state=>state.count6 s2 y* M4 @8 J9 R
    })2 L" ]6 z1 w: ~; I) ^0 x" M- z
  },
$ n1 r5 G4 H, i- }9 a5 W4 o% B  methods:{
6 U( f2 ~% s- _/ [& a  ?9 M    addFunc(){
' T" ^4 }- p% N& Y; G7 O& w$ I/ F1 r      //this.$store.commit("add");
; g" w4 a: ^* }* I, I& T      this.$store.dispatch("addFunc");. N5 a+ E# ^1 y1 Y6 G2 r
    },
" r0 ], m. E( ^    reduceFunc(){
, Y" T3 m; F7 u- O6 T+ o      //this.$store.commit("reduce");8 v8 ]3 j/ R4 y2 J, e
       this.$store.dispatch("reduceFunc");2 E& M# r$ \' }! g
    }2 K, f# I/ b, y0 @+ m6 y
  }
6 p5 G& A( E9 p3 w}
! C" b" C7 r6 N; M" B/ _8 D* ~- k: g2 ~, s0 {/ P
+ P- c9 }* G. w1 ?

8 }% O' `$ V! k2 L: }$ l9 I: T3 d; ^% K; g3 S" e" i* ^
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了