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

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解9 t( ]+ G( m8 O9 `6 a
2 [: W/ k1 E7 Q! w8 v: t* v
本案例测试下Vuex的使用,创建一个新的web项目
, v5 A: H# u" S. w) XVue init webpack web$ D6 K, a6 X$ Q  `# W' t1 f
安装vuex% [8 {1 N5 l) x1 q5 O& i
npm install vuex --save1 s5 V( C3 M/ u: K
启动, npm run dev,打开localhost:8080  即可! t- S7 r4 |- u% I
4 X( P) v0 p1 N9 F2 L* N* {
4 y2 e6 E) R, Q# A4 U3 h$ W4 a
(1)引入vuex
1 U& X6 t! }) Z( M4 ?0 |创建一个src/store文件夹,创建index.js , 引入并导出store
# t8 n* ?) J( T) Wimport Vue from 'vue'
5 u- V4 r# H: Q9 D& a9 Wimport Vuex from 'vuex'$ u0 ~6 c0 w: e/ g- A' r! O' Q
Vue.use(Vuex);  ^, M" F3 N) A0 r8 q  [
const store = new Vuex.Store({
) |) E5 u) Y2 [3 ^. E9 Y2 o1 ]})
$ Z6 j8 K. A  J' S9 n( q- iexport default store;6 g& v2 I7 c( r. L$ L! z3 _

3 b0 A, Z% s0 O/ U(2)引入store到main.js1 r! e8 K! n: o9 n: e
import Vue from 'vue'
4 p, D$ F9 ~, J" Zimport App from './App'- F7 S, c5 ^7 r0 j* t- a. E9 S
import store from './store'
# ?" E7 b1 _7 M; j7 |
4 H6 Z8 O# G1 B& P; a% t& h0 SVue.config.productionTip = false
* [# c+ W( v* U0 \7 l4 M" w4 y/ o; K
/* eslint-disable no-new */( T1 y3 J1 ]: m3 J( p# e. x
new Vue({! ], Q1 L' S: |2 \
  el: '#app',
# Q- o) J. w7 H" B( a  store,: I' L% N. r/ I; k; L/ ~
  components: { App },
/ s5 p) W& ]& Z5 W. h, |  template: '<App/>'& X5 t0 ~; b  ~9 @
})- x6 l* ^0 O' k& ]# x2 J

" l; Z7 s4 S) Z; g& o

7 W( E5 }' Q$ e' _& b
9 h$ S2 L4 M( L" G
(3) 修改 helloword.vue ,先使用state获取值进行测试$ i. L& O- Q6 T* {
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
9 u. V5 d; ^; Fconst store = new Vuex.Store({
. {/ i5 o8 P4 s  state: {
1 r5 h/ t- J# I% `$ x: r      count:1
9 `* I& [8 s% y* [  }1 r2 K/ p% @% x! L$ U: v# x
}); x* A. m& `# J( V5 \5 A7 [
8 Y1 m. S* f& E* W+ ]; u5 Q
helloword.vue----
& j! j- ]2 d3 n, v; q* ~8 G" {<template>
9 D, V1 D6 z! a  <div class="hello">
- n6 Y( H; H  A% B; U5 R4 o) g
7 q9 g. m% V/ d- p; g' ^% ~# {    <h2>{{this.$store.state.count}}</h2>& N; X/ {0 w1 i; f/ t

; s! {) {7 v2 w0 A3 p  h5 S( y  </div>
/ b# s3 s  j) m+ D</template>, T- I% x" s+ J: U1 F$ A% D3 P. i3 n
. g9 p) p* Y3 ?# X

5 f% u8 A, R2 s. o* s显示结果为: 1 7 L9 N* M+ b) }2 e, |; n9 D9 J

8 b! i$ D2 S  F8 a

( o2 r4 w, p3 X# o& |(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
. r. Y! h/ X, _# p' f5 C5 G  U# F/ e/ ^
const store = new Vuex.Store({. X5 U+ k9 O5 c  u2 u7 ^2 {+ F% R
  state: {! m' z+ c- h# d( n' j5 _; ?# [
      count:1
8 D0 l. @8 m# `" j8 T  },
' h" o. J* l( e& H( m+ h. Z  getters:{
( y6 e7 r% C7 ]1 _8 G      getStateCount:state=>{
  Z1 O; n5 {0 d2 ^( E: P- v          return state.count + 1;3 R$ j/ X5 N3 M& M
      }
; O& u& y% a" Z8 k/ ]  }
, l1 Y8 u, l  s: O0 c, P})! O' O* G& h/ k$ ~% Q: t) s

" ]7 Y" W- h5 |5 s2 K+ b. Z<template>
  ?8 U+ Z6 ^# K0 R/ P- [: L) j  <div class="hello">
% f1 r8 S2 P9 O6 u
- S- i# {+ c. O! v. y8 R! Q    <h2>StateValue: {{this.$store.state.count}}</h2>2 D( b3 _8 d7 ]
     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>; Z/ Z- ^8 {2 g# c/ i
  </div>/ C  ?& x2 C- \; a6 Q
</template>
9 a5 y2 `1 o0 k9 |$ H# \
% s% _+ [7 S: v

' B3 J3 s- p8 m5 r1 w) z8 q3 u! W显示结果:
7 V& @: J1 O8 PStateValue: 1GettesVaule: 2/ X5 k0 `! S% I) e# `4 F, u' P

/ E5 g8 t5 w( T0 V( U5 m(5)
/ f: T3 }% P1 {$ s5 D# `

Mutations:

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

) D$ y' z& w" y% P8 ]  k
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:4 L" g9 c9 E3 [
mutations:{
( c- i& [9 i0 Q" e      add(state){
( y1 h& O0 p- U% s: A( v         state.count = state.count + 1;
8 U' _/ l- F% U- Y      }," j7 n6 r" H; C
      reduce(state){
* a4 }5 R, C8 {+ f% z$ d        state.count = state.count - 1;: s- `' m) y; z# `1 L( E- p
    }
2 }4 ?4 c  R6 R; m8 Y  N% G  }: |" }- R3 n, A  q2 x
<template>8 o  N+ X$ Y2 w( m% l$ Y) T% l4 G
  <div class="hello">1 t, r( Q, _9 }4 j
    <h1>Actions:</h1>3 p5 z+ q/ t5 h
    <el-button type="primary" @click="addFunc()">Add</el-button>
9 m6 q9 v, `! I0 R    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>8 z: R* Z: E) D; G3 X% k9 o7 i
    <h2>StateValue: {{this.$store.state.count}}</h2>
3 M6 ~# r' M+ {- d$ t. Z9 S7 h. Q    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
% h8 T% I% A7 w' E2 T  </div>& [, V& y: V! r0 b
</template>
' z" y5 e' n7 U. e: i9 \. s8 J) Q
& m( P, G1 f+ {) i
7 K1 m8 F4 n, B$ B$ D
结果:
  q) C& f% a- C2 V: |2 t# ?& h2 C: O" I8 d
4 T- `- t& {* N6 s
Actions:Add
ReduceStateValue: 5GettesVaule: 6
: ^7 k" q) P& `' z7 B; h) G' ]' j/ {/ P( e+ D. Z  U+ s. H" y4 s

# n3 V( u: V, T2 ]% B1 F, F

9 J5 C& g  B, ~' h
5 t4 S) N. b9 K; ~% j

# Q' V! X' r* f! E1 r7 e4 ]4 U3 T3 m) p1 ^  \. H1 m3 Z. r: f

) E3 a. g6 Y. R1 K' F4 y7 T, f) z
(6)Actions:3 H& a* t- H. r, ~3 h

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


3 y7 w: l% f& }  V6 }, r! c  W) ^

1 D9 v- i: U" s) ~4 R, b
mutations:{! @# a; d# W" p7 @3 n  k& Z) y
      add(state){
# Z3 f4 U0 j4 k) _         state.count = state.count + 1;
# ^' c% f1 R1 c: B% v  S      },
1 I: L! d0 `$ @! c' K      reduce(state){
; j4 B: H$ Y; R8 @8 Y. d+ j/ v" h+ U        state.count = state.count - 1;
: }4 C% @7 S% V, z+ t; u( r/ {    }
3 W1 l( S3 n, J3 z: J/ }  },
( g! f: ]  {# h% G6 \5 s  actions:{
$ F! j4 `* [' ~% M7 \% A* N0 g      addFunc(context){
* H2 o7 m7 Y* p0 u          context.commit("add");" t. Y$ W2 T: F& I4 B
      },
% {& l3 o: {; o+ Z- ]  a5 F      reduceFunc(context){+ n% r+ z- W3 O& |
          context.commit("reduce");; o, B9 _, T. {8 [- H  }
      }9 H3 u( P  F, n: _- S
  }
& W+ t( p& \2 i5 R! g0 v
% R$ }9 @7 t. G


) H# \! d/ l5 \4 L! _& H0 W


% T7 P- m! p  I  |1 }9 U  methods:{) f& S; U$ |% |$ X% j
    addFunc(){
% e9 n: z7 g+ b+ v: g6 |      //this.$store.commit("add");% o0 l6 ^  p  _
      this.$store.dispaTCh("addFunc");  }0 t# v4 V, g9 @: t$ N
    },
; K" A% h( s) y    reduceFunc(){  ?& c+ L, {/ k8 I! h5 I
      //this.$store.commit("reduce");
9 D7 ^! A5 {+ P4 C( X6 B       this.$store.dispatch("reduceFunc");
  I+ L8 u! d& G+ I( ~5 Z    }
; y' a7 e! N/ L# Y! x6 h  }
5 i" k+ V6 N$ D) c$ }1 I
3 J* v4 Y$ V, y
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
. u7 R7 K1 U9 ]+ V* _# j' D实现效果一样!!!!
6 o' v( U+ w3 i) B" ^( {* ]4 v! U
; ^6 y% Y9 L1 T" c' f0 o: D- k2 p2 s% ]; H

8 \1 J( B" v; f- C0 w4 ~; C
9 v/ t" I. c" n' o$ J

4 H2 z8 i7 ]6 S- y( u/ f5 F6 x


3 ~9 _6 h0 o5 [& I, b/ |6 [
" A8 p6 \( Q9 u( d( G

0 `& j, D! P& u- J
2 D5 H' t& H0 {1 v

8 \, F1 \+ H' ]8 {
8 k" B" l4 z6 s2 `" @3 h( ]

. f- B, k! |3 v# t. t& i  t: z$ E
" z; w3 H" C6 @# K( Z5 U

; C7 `, g0 K' P' F# \, H+ x: @
$ M$ W8 c" @1 v& q% i  Z
上海点团信息科技有限公司,承接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文件如下:

% {. E4 u4 K2 B6 E

# X5 l. i0 N; ]' q+ J( Q


. v; \7 M. H+ p

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
! }6 z; k0 w+ |6 q- f

9 d7 y% p' J8 l& R( O' }; @, k1 aimport {mapState,mapGetters,mapMutations} from 'vuex';" ]1 f1 i8 K# i* j
export default {
6 e& p4 R, G$ p2 m: r2 P+ P  name: 'HelloWorld',
& k7 R2 M4 e" i6 u  data () {
3 ]5 u# X$ q+ ^- B; u    return {
5 t2 g8 M0 a# k) Y  b      msg: 'Welcome to Your Vue.js App'
- \0 n. i  J/ r, d7 r& x% {% p    }
3 Z( P+ E+ }; y  },6 Y) x$ ^" x3 f6 @8 h9 k$ T
  computed:{
: R% h8 O; u  B4 E# `3 ^& D    ...mapState({
4 {6 j% S6 R) {      mapCount:state=>state.count
4 P( }: h, A. K1 b8 H2 O" v    })' j, S9 B: B8 ^! M0 M
  },
0 ^4 L% P! X6 U* t2 {  j  methods:{+ b# F1 l  \) L9 w
    addFunc(){
+ x5 ~( _  @/ T      //this.$store.commit("add");
9 {+ @- y' h) N6 t      this.$store.dispatch("addFunc");
! d. a& T$ Z+ |2 k    },- d9 k; h- _$ }% [4 ?3 D: j- C
    reduceFunc(){
- G2 T1 ^  v  E9 _      //this.$store.commit("reduce");
. _1 Q+ n6 u* w  P$ ]) P4 ?0 u       this.$store.dispatch("reduceFunc");. Y/ @* _. W0 ?
    }
- T+ U6 ~; i; N+ S  }$ V4 j$ ]7 |! I: d. F8 V2 E
}
* a8 C7 r& z- q' ]1 Z' }: \0 u$ u8 E" @

: H/ V' N0 ?" I7 K% x# C
' W& T2 h* x! _6 T2 d, ~6 i

) l: S! N* }% x8 B3 u  a; c
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了