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

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解0 d- a" f( \! h- G2 t2 `

5 V6 Q$ G1 U2 I  R) ~0 V8 [" x: Z本案例测试下Vuex的使用,创建一个新的web项目
! N3 J" ^8 Z& R! z# C2 u  `" ~/ B3 zVue init webpack web
$ l) s/ ^. p- p( W: v  T安装vuex
. w2 d6 D( D( o5 L  s" d: enpm install vuex --save2 Y) i/ {. z! r8 L$ U
启动, npm run dev,打开localhost:8080  即可
7 `& i# A( D& b* I' x7 `: t
. A: }2 `( ^  Z% H, f
. D2 m2 s- u4 q, X: S: a. d  @(1)引入vuex
8 ~% P2 w* U  T2 `+ D创建一个src/store文件夹,创建index.js , 引入并导出store: N& i0 J, `5 V4 v* Z1 \
import Vue from 'vue'
# K) Q7 N/ P& x6 {) U* [import Vuex from 'vuex'
5 c$ R( m# o6 L5 u" lVue.use(Vuex);
8 n+ A1 k4 D5 x  R9 r9 V- \9 W. nconst store = new Vuex.Store({
$ V) O* T( x7 D})8 Y4 f) C) Z1 q$ q% t
export default store;
7 Z  K" @. {9 c% C8 B3 P$ y; v% Z5 S$ p2 L' {- \. C* V5 i3 {4 _
(2)引入store到main.js/ q+ A9 J! g6 b& p+ |
import Vue from 'vue'
; A* s# I4 z! q+ T: J$ X. Cimport App from './App'0 b1 o/ `" L+ ^4 g7 w6 A* }1 X
import store from './store'
( ]) [( F$ f! M. J' r" }; H* {0 ~; }/ E/ |
Vue.config.productionTip = false
- U/ t8 J) U2 j" F, p9 `: d! Q! X. O; ~) o. _8 N! a: _1 B
/* eslint-disable no-new */
+ X, ?) S4 P/ i( s" vnew Vue({
8 I! |0 y2 ]) o3 E# R3 S  el: '#app',) c6 w$ y+ s  S
  store,
5 ?6 v3 M$ r) }6 y: c  components: { App },
5 A: y8 w* P: ^1 m  template: '<App/>'; S; q# @7 @, s" [' O
})7 f( I1 {+ E8 [1 W. x

! L3 b' }3 n" N6 D$ ]2 S

$ G0 E7 c7 d: K2 M9 T
0 _. A* P. G- h7 X4 q6 y
(3) 修改 helloword.vue ,先使用state获取值进行测试
, @# @/ C; S" Y( q( z: x1 ~State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;. r# k1 r- J' j5 R1 G- ?  y
const store = new Vuex.Store({& D% @8 `# B! p# U7 A# U* J3 _5 S6 V
  state: {; C  F# a! Y5 q' ^$ x
      count:1
3 i! M; Q) V9 \4 v  }
( r2 ^. f9 p5 [$ h})3 ?! a# Q' n9 S) N6 V9 A

* n. ?. o$ y% t! T0 F; y. `helloword.vue----
" U1 ^" j' j3 G<template>! @4 p7 d. d0 y& w0 u0 T; R6 r) G
  <div class="hello">
9 h0 t9 F! f' d) U! a, a6 J
/ G) g) [) W' A4 a8 {7 E0 D    <h2>{{this.$store.state.count}}</h2>* W* t( b8 L3 M7 q! w7 k; \2 p2 l
9 L& x" \8 t4 T8 G" f  m$ A
  </div>
. Y2 F6 p4 G, @& k</template>  ~/ \8 i4 L0 f' U; r0 [

5 }) \3 l- A7 e9 n7 w  ?2 l3 K# a

* a1 D1 C" w3 X显示结果为: 1
$ {  d  a: `# w" u
( n9 f9 k& u% f/ V2 C# O( j% W
. m4 a, z0 T! P  |$ V
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:, D7 G( f: B) h
5 e; J/ B* k& Z" x$ h
const store = new Vuex.Store({
9 l' h7 D" G0 s7 Y  state: {
: `0 p$ H: b7 Q9 w; [7 R: R      count:1
/ _0 B! ], W/ Q9 R7 j+ f( E  },
9 Y3 ]9 ^& i# @( D  getters:{
6 C  t3 Q  E; h+ B) R; z      getStateCount:state=>{
3 g! N2 w/ H3 E( b* C          return state.count + 1;
: C4 v7 c* L- W6 T      }$ j5 f, j) e, n* a9 ^
  }0 j; ^6 }1 j0 @2 |; P
})
% M( N+ V) h& @/ |- z8 v# n: I# r) z& A
<template>% ?& d' Y9 H) c4 v. s1 x8 r! |7 T
  <div class="hello">
* v; J" H- y- v! m0 K' _) U% o$ l% r4 f! c# ^
    <h2>StateValue: {{this.$store.state.count}}</h2>
3 L1 O& Q! \5 ]8 h     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>5 _' o) Y  ^. L2 z
  </div>
  x/ g  A* ~2 X& C</template>1 L8 ?% r% Z  P

0 a; f; c+ `6 ]2 C; m2 e
8 g% B0 X& X6 R9 [8 b; }+ H5 D
显示结果:4 d2 F: r$ }  p/ x1 ]
StateValue: 1GettesVaule: 2
4 v$ q% C( N2 A- X5 P
8 S; ?  y$ O3 k, e2 d(5)
( U3 R8 ]# U) `6 |

Mutations:

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


+ U9 j( @7 O+ \! d$ y修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
8 ?" A( r( o6 Xmutations:{
; X- i6 |  c+ n5 Y6 G: u      add(state){' b) k- C* |: P/ V" @
         state.count = state.count + 1;
( q2 Q) j8 y; G" p      },
: z; W6 e6 J* B. L# j, T      reduce(state){
0 n; ~0 b/ K  E* K. j& \  q        state.count = state.count - 1;# z' u6 y, l* N. n  E7 d
    }$ \) y( {4 c/ N0 e7 k
  }
8 `# T9 `1 F& V; K, L3 ?<template>
3 }% R% T5 c9 d" G  D* t8 I  <div class="hello">: L- ]* _$ C& w1 b5 _
    <h1>Actions:</h1>) ^( ~* b% y. i
    <el-button type="primary" @click="addFunc()">Add</el-button>  d8 D* p" F( D- E' _* V6 @
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
3 d' u7 e. r, T    <h2>StateValue: {{this.$store.state.count}}</h2>$ _. d. j- F" V
    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>0 b( A3 t% M) k9 T( v
  </div>
0 }5 X  V% ?, B7 d' O</template>" p, \, C  N) _: g+ C: ?3 W/ `

. {# m; X" u' {' B" Y

& v4 j1 o# f4 z+ N4 F9 l: ~结果:8 O! m2 e$ w% x

) K! M8 b2 f6 C- j9 r; Q1 O& f
& u/ l- q' P& D+ U/ @" b! E6 @
Actions:Add
ReduceStateValue: 5GettesVaule: 6
! G" r3 @2 _8 R' m* p$ z4 e& t% n: U% s! t
0 _5 m9 v8 S# `9 r, n. x

! r% O4 z' O' I* D0 k
3 k; n, \* U- _0 K, K
6 x* B' n) v: x; j3 T, \

9 C. o# x; O4 x3 o
' ]0 ^* D  t8 n0 s) p1 C
! {6 o1 k7 Q$ I  H# p; I  Z
(6)Actions:7 Y8 v7 y& x3 i# l

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

! f9 b: P, T1 e* Q


7 P# W+ B# V8 ^; `5 Q% ~0 g: |mutations:{+ l, ?& c& x( w: z( `5 t0 s
      add(state){
/ I; o" g' u" D# r" v         state.count = state.count + 1;+ H0 t. e# i' s0 z
      },6 L; w$ V# i1 d; B8 o- S# S! _
      reduce(state){
, O" V/ o9 ^+ J- U2 n5 [# ^        state.count = state.count - 1;
" ]% f/ e) C8 B6 L! ^    }
% K1 R7 M7 B8 {3 z& @; e  },# \9 f+ X! B2 R9 [0 R0 F, ?
  actions:{
, R4 h  J" Z7 t9 o% J      addFunc(context){1 H2 G7 Q+ _, e, n$ H  }
          context.commit("add");
; R1 i+ F. @0 e6 Q1 A1 x" V/ B7 d. y      },. V+ x' e. U. B" I3 R8 d9 z9 I( h0 V
      reduceFunc(context){
& D$ }8 M0 X* q0 O/ A/ u5 Q/ @( s          context.commit("reduce");
+ x& A3 s& P* S      }3 b, g% O0 \0 ?
  }- t8 D$ W& U& k0 K

( W" c$ @3 b' v; J" ^- a' N

; L' Y3 F; o( f% K+ V) X- x

' Q! i5 g# r, }7 ?/ U+ O
  methods:{
* V, B- t- ^( u7 S  P  z. y    addFunc(){
$ C" h/ d! ?+ M  k& I      //this.$store.commit("add");
) c6 s9 r/ t$ |; Q! T      this.$store.dispaTCh("addFunc");
( `% V9 {. s! p4 Z' O    },( n3 t/ q3 i5 t4 d3 g
    reduceFunc(){/ h" _) d3 ^0 U4 j8 f" Z
      //this.$store.commit("reduce");% ^; }5 o$ f; W, ^! u3 o1 {. _
       this.$store.dispatch("reduceFunc");! m* ~0 \& S. D* J
    }* A# W0 d  f- `
  }

( I. X9 c& A: v( i0 ?

0 |4 H) b$ H, a$ L. n这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
9 e8 t$ L1 U0 Q: Y2 P  A实现效果一样!!!!, K% u' {0 W" M4 s

5 h0 K8 m7 L3 J/ d4 |+ S
/ p' p/ J. {% o/ ]1 J/ E5 d  p5 ]  y8 }  m+ n% Y0 ?+ r* j% g+ t% ^
, S: n' o3 E6 |6 S$ Y

0 O7 {& Q. d6 s. D

2 p* {* c) y5 B5 x* n7 {+ \; x/ e
$ m! g& J! L- E! Y4 g% p& _
9 M# h$ h- S4 V; {, R- Q7 i

2 t3 l! W( t5 M7 C1 ^: T
/ b9 v9 d# S# H# M) l- w6 Q& `6 Q

8 j- }- _' ]' m9 K2 s; E, r5 \: s* c9 H) v* }6 C7 c0 H& `$ p
- _; V, V3 n: h0 X% f: G% a
0 ^+ c$ n) g: q  c2 c- s. B0 g
5 R! r3 ~! O, t" Z2 W: ~" z$ C

) e7 y# N# K7 D) a" Z5 ?  Y! ^
上海点团信息科技有限公司,承接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文件如下:

* q) \1 _- b* K7 ^/ J+ l7 D/ X/ I3 }% f

. B2 S9 C, _/ }* N4 ]: T


( M) d/ U" B) }8 v+ p1 z# o- V

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
4 P- R: e0 b# b: ~) R

3 b0 D) _1 w, r8 L6 [# himport {mapState,mapGetters,mapMutations} from 'vuex';
- M& p! w% g* M( T- D3 Z* ^( |export default {5 h( a! z! g7 a% P; P3 G0 c/ i
  name: 'HelloWorld',. L8 E  T3 \7 H  V& |% `* [
  data () {- Q$ E! b( L( K
    return {
5 q2 E9 v6 F: i  ^( N) s3 P      msg: 'Welcome to Your Vue.js App'
1 v$ U- t0 J( T/ t; V9 e    }
1 |( c3 s- |! q8 `0 i  },
/ K- I- ?# k" u- h; @3 k  computed:{# Z' l7 v. H* l) m
    ...mapState({
! p7 w6 B, p* D2 K% A6 L  [      mapCount:state=>state.count
# [$ ^( ?6 G2 T# g7 j) |    })  l! b6 D+ J2 e  d5 O$ ?
  },: |1 x" l/ k' n' h
  methods:{
$ _. z# n  u. p/ P    addFunc(){
% I, s8 P' `6 q$ B      //this.$store.commit("add");
+ r9 m8 Z5 h. T3 Q* R      this.$store.dispatch("addFunc");
6 J( M1 R/ I% R. u8 O* {    },: Q8 P2 o9 k! C# U* Q  r
    reduceFunc(){
+ r0 s1 }" F* z7 `3 w      //this.$store.commit("reduce");1 R5 H3 U  T( a% @8 I+ x$ Y  ?
       this.$store.dispatch("reduceFunc");, v8 ~( a$ Z- o- s
    }
% H8 q4 g0 y6 o3 l! ^9 ~  }
9 r& u: }& @- O# e9 S}" V. f4 ~  s1 j
- X9 p4 J; k3 b( O$ }8 m. t4 U

* L" E( t) s# z* c1 _5 t5 G

% b4 K! n" F* n* E' d. `# {7 o' ~6 x5 J; `9 T& D1 s
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了