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

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解
; I+ v9 f' @: I' G7 N! u- {# c' {. @8 }5 O5 q& A- S/ r. g8 V1 b
本案例测试下Vuex的使用,创建一个新的web项目
% d+ g( D  }9 M) y$ x- `Vue init webpack web2 z8 t, `# z! _' E
安装vuex8 H! O" z( \5 c7 z( h" G
npm install vuex --save
- R# H% @* h2 ?/ g$ U% V启动, npm run dev,打开localhost:8080  即可
! }5 [9 e& y$ }. x5 {% O7 H7 f! B% g/ a, b2 L
- M1 t: @8 O; t" |2 k
(1)引入vuex
- D% a/ A0 x5 c" p: }. Q* g创建一个src/store文件夹,创建index.js , 引入并导出store% |  D' m3 G& @- m  ~1 H* r
import Vue from 'vue'. S6 f( `8 G2 |, ]1 u
import Vuex from 'vuex'1 B# {, q. e% D8 H9 x
Vue.use(Vuex);8 y5 f; Q5 d( Y" u
const store = new Vuex.Store({
/ V6 E/ e$ E( c})
3 K4 |0 m, Z+ P8 A- Xexport default store;$ H5 `# t* w' ?0 t! B

8 C1 _, p4 u. i7 d(2)引入store到main.js% R) F. _( T: w0 H" s! B2 R
import Vue from 'vue'$ D. k/ T6 w6 y- r1 N
import App from './App'
. J" H- \# c/ e4 {0 b# Ximport store from './store'; |  p1 {9 j/ x' a, a0 e7 L7 S$ p& Q
. z0 V; U, _7 o  ^+ P; t3 k6 T
Vue.config.productionTip = false
4 t2 N, S. T- H# Y' J, o5 x
& k$ j" F* _5 L0 w/* eslint-disable no-new */
! [, u/ q1 ]- P; N& [new Vue({2 z7 r$ U3 n6 w; c  T* m
  el: '#app',
; j8 k: q5 d' L  store,
' k4 A# O: i4 o* E1 f9 R  components: { App },! E: h2 b7 n! T2 J& s
  template: '<App/>'9 C1 X5 ]" }$ i
})
6 b7 n: ]9 S* E. @, _) z$ ^
4 v+ z2 w/ o) P# f

2 P( i; B% ?: u: H4 b! H

3 F; M+ O7 j0 e9 T" }! M. d; N+ Z4 p- g(3) 修改 helloword.vue ,先使用state获取值进行测试
4 E' e; M9 h; H+ j/ s% \State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;$ M& b/ N7 R& m8 L' X
const store = new Vuex.Store({
& l% R) k/ Z* h: z1 |3 A/ c  state: {( b$ t8 o  f1 z) X
      count:1
/ n, l2 x2 J! m" ^6 f. l  }3 c# ]0 s# Y" v& c& m# B0 G
}), K9 }# |: B/ M1 j) ~+ F$ x2 z

2 Q5 _# T( R9 K, ?/ Rhelloword.vue----
1 s6 P& [) Z& K3 Q" A$ s: B# f<template>& K  w8 T: d4 L' C! P" t  H
  <div class="hello">
& T; W) ~/ d# z: I1 x+ M0 X$ Y* r) G1 e, ~' j& P4 Q1 J4 [
    <h2>{{this.$store.state.count}}</h2>
8 L% J6 |9 \+ X4 b& M! W2 E- V+ b! F- F2 f/ t
  </div>
: a* F0 x9 {. w) K+ n" o' W9 p</template>: E0 b, C& g, N8 i; n
9 F% A7 ?! E! Z0 P% S' a5 ?
7 r+ H+ U' U4 d" b" w/ j
显示结果为: 1
9 a( o! P$ G) K; V, ]: z  F# ~, E" N  y3 r( M3 y1 ]
7 J' y0 Y  i  n+ O* k
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:/ u& a- E! ]9 x. E6 M# G; f5 u
9 @9 }4 l7 R3 w1 {+ n* l  Y
const store = new Vuex.Store({% j& v1 r8 z: S0 a/ |
  state: {
( T  d! k0 r3 {" |  ~      count:1
' M+ z3 U5 n9 V" x) e  },- a# p/ O# N" D, R3 |2 M
  getters:{2 a9 d& L& f8 o7 k4 }
      getStateCount:state=>{  Z" Y& y$ `6 t
          return state.count + 1;
! _( \& D; E- @5 j/ j, F# G0 H% n      }
$ [* X4 E6 Z6 ?1 o5 ^* ^- _  }( e. H  E+ q) u" }1 s6 _  X( G
}); H# Q) z$ ^/ d  A+ S

# e( e- }, W4 X; m- X% q<template>
+ Q& S: K) u& m  <div class="hello">0 s9 e+ x, ~1 J+ W

, n5 m5 Y. _( z- A7 U0 M; A    <h2>StateValue: {{this.$store.state.count}}</h2>
7 Z- y; R: v9 a  ]0 v' W7 O; Y     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>+ v$ h( m: a8 X: _3 t7 h
  </div>7 H! Z% @: D- X7 k5 @( @8 k/ t* D, |
</template>
2 l% @7 S, ]: |! x6 L. ~& W( |7 U% ^8 Q8 `

$ O' A% q( W% _% t; T显示结果:
/ |1 {& D2 Y/ |StateValue: 1GettesVaule: 2
  _9 B; S1 J+ i% i( @* ^: L$ \5 K" l0 T3 r6 k/ g! Q" [2 i
(5)
! l$ S  t2 D0 o. x

Mutations:

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

9 Z5 H. z8 \* w8 {
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
0 b+ n0 M" \. x* |mutations:{* `8 @& O( ~! K' R! h  X8 o
      add(state){
9 {) |& y- S( c6 ~7 F: j         state.count = state.count + 1;4 f' \7 c  p9 A7 Y
      },* d6 u9 ^: \& z( p) P5 o6 }
      reduce(state){
8 N/ f; P! e: L* X& o        state.count = state.count - 1;
3 o! [5 X/ g6 B, G    }2 O) b- j, N. i- C/ l
  }
2 @/ [0 _. f9 j" {4 L5 L<template>
/ H6 e& m: X+ c5 z* _  <div class="hello">% Q  h2 L6 C& M" _* ?
    <h1>Actions:</h1>, O5 T# f! n0 D5 p
    <el-button type="primary" @click="addFunc()">Add</el-button>- n; B- V1 S  l! L( X
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>6 R2 ?: o+ V1 b! K
    <h2>StateValue: {{this.$store.state.count}}</h2>- x0 f. B6 R1 t* T. G
    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2># [% o8 Q, A& l9 o: V4 M1 z
  </div>* o! u: `, B! B, C! _+ K
</template>6 A5 N7 {* ^$ V) n6 I1 x

  G3 ?6 T- ^1 H0 \0 W2 L4 d
2 G/ O8 j& t/ q) C) S$ o
结果:' l1 I$ x, S2 b7 x: ?2 b
, S; C5 r" l9 P- l9 r

3 s* ^& p/ g  r/ L, U8 RActions:Add
ReduceStateValue: 5GettesVaule: 6
. S  {+ ^8 W/ i; ^$ G, @8 p7 U) P$ G1 U, q
+ O9 @" N0 M( Y+ R: M1 X' N- o8 ~

! L. d6 ^" \6 }
$ ]6 B* B" ]% A; m4 s
6 b/ A$ C! H+ s. S
: Y2 l" z7 y7 ?' g
2 N2 e2 B* P% g% n1 `, Q9 f

1 {4 ?/ k& o4 p, B) c(6)Actions:
: |7 `$ w4 ]% j3 [

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


0 f& p) O/ B* ]& W6 Z8 d  L  w( }


  _; |& B6 S$ r3 Q4 w3 {mutations:{- V5 S- m% ~! p
      add(state){
& F9 I7 x  ^& _4 j& {+ o3 ~         state.count = state.count + 1;% N! w" e4 {9 x6 t
      },! _% P7 m0 [5 _: H  m- M
      reduce(state){* L! J, Q- `. `. F, Z: y4 p
        state.count = state.count - 1;
: S8 S- b2 }3 t3 p    }+ F! U# F8 S: }  v
  },0 X, @8 D# V7 P, `; a6 Q
  actions:{
" Y5 x6 A8 r* K; `      addFunc(context){1 V3 N: n( H8 ~2 b* ^
          context.commit("add");2 _2 F: }7 z) @9 `2 O# R* q+ u
      },- r! R! x8 h( l
      reduceFunc(context){
% M3 |0 ]1 V% }9 k0 n% _1 z# |          context.commit("reduce");
' G6 m- k1 t- W6 m" m* d" v- }0 h* o1 B      }6 G1 U+ [4 L7 F' |" e
  }
7 b  b# M" T7 S6 H  f
3 s) Q. j$ ^6 i


2 x; U( I2 {" n8 H# W1 w


% B8 u4 ?, k6 y8 d  l4 R  methods:{8 Y9 G* |, h! u
    addFunc(){* i" A8 s. j2 J8 d) i6 t
      //this.$store.commit("add");
4 k4 B: C: S4 x0 [- l" z9 ?      this.$store.dispaTCh("addFunc");
2 C, A/ R$ M" [1 g9 |  d/ O    },
. S+ v) Z, _; o8 b3 ?5 e& L    reduceFunc(){
; f0 W4 v8 {, ~( a/ r      //this.$store.commit("reduce");  ^; W9 x( G3 ]4 g
       this.$store.dispatch("reduceFunc");
) A" d5 s. F- s- S& c$ {6 ^+ k    }
+ i9 |, E, Q+ H+ `  c8 G. |) w* @  }
9 X: p* `; g* y% X5 L3 \+ g9 e
7 A7 I7 J. h* J: t3 d0 W- N
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
! B5 q$ N( A3 w实现效果一样!!!!: d# d7 l* z) i7 B; F9 f
/ I7 V- o; `$ `& H1 c. f
& w7 T6 D. G# S+ q2 z" j
: \" [0 p3 X/ H) h2 V
" o. M$ h. _; N' F2 Y


& w3 @7 Q2 [6 M9 T! D) Q% r. f


) Y8 C% J6 @! i0 l% @6 T9 @7 S: }3 }  c' g# `- j
. g( w- u9 d! E, Q- X  I: E

* d2 {9 m7 s* I! ]* \+ B8 j
3 `# r- P+ A' \& _& y) J

6 J2 D0 d5 y, }  Y6 E% V1 u2 T4 R- H8 W0 t2 J. e; d
  G  s$ C( O! Y

. V, A% n( m4 U) `( S
7 {, Q- V# a6 X$ Q' A3 D" C4 w! R8 p( O$ z3 a- b- f( N# \
上海点团信息科技有限公司,承接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文件如下:


$ ?  H3 a" b! E( V& h6 N


1 f+ E. j. x1 f" f8 }3 k

- O4 s" j& E  C5 K7 [8 X1 _7 Z

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
: {4 U+ O+ Q9 Y: t# F  `

9 ]* D; x8 j! Q+ {import {mapState,mapGetters,mapMutations} from 'vuex';% t; c. j3 z! u# E: U
export default {7 |1 V( H: Z! x6 p- r
  name: 'HelloWorld',
* I, a6 @% f$ k$ Q  data () {3 z" N$ U, x- W- G1 D9 Q
    return {
% T5 X/ j7 ?1 p2 B5 x* ~' o; U4 y- x' \      msg: 'Welcome to Your Vue.js App'
8 r7 e2 y7 @& w! Q+ v7 \4 ?    }
1 A6 T8 B2 X7 B3 Z9 W. U% b  },$ i: l$ O- f7 m9 V* p6 s' f2 @
  computed:{
; K/ p% A7 B, c7 C    ...mapState({; A1 |0 T# U/ b
      mapCount:state=>state.count
3 w; ~2 D3 a% ^$ M    })
' _! y6 f2 e0 ]8 B9 n  },
" H3 |9 h+ w' s9 [2 l5 ~: f  methods:{
, [* m( g  X# u3 B0 S+ Z+ k/ H2 g    addFunc(){
  |0 P  h$ ?- T- t      //this.$store.commit("add");' s: s  B& X: r; h$ R& @, m6 W
      this.$store.dispatch("addFunc");
, p; f6 T, }& p( y. _    },
7 \1 e) G4 ?! e, c" }( ]" B  p    reduceFunc(){
5 J7 }% W6 k9 f+ P" Q: ]      //this.$store.commit("reduce");
0 j6 V% q7 {# w/ j+ Y! F+ z       this.$store.dispatch("reduceFunc");8 Z% d3 F. `) j. p
    }
3 R1 p; R& D; t# K. @1 D  }
. R+ Q. X  b  C. n. X}  f, u/ D8 R& O* A
3 C' L& Q3 k. \

; e) P3 d/ N7 ?. _; n0 `

$ G3 r) y2 Q: `9 I; z' d$ c. ?8 b0 E* l2 P
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了