vue全家桶-vuex深入讲解
目录
- 使用
 - index.js
 - getters.js
 - system.js
 - 全局使用:main.js文件中
 - Vuex概述
 - Vuex中的核心特性
 - A.State
 - this.$store.state.全局数据名称-组件访问State中的数据的第一种方式
 - 组件访问State中的数据的第二种方式:按需导入
 - B.Mutation
 - this.$store.commit是触发Mutation的第一种方式
 - 触发Mutation的第二种方式,按需导入
 - C.Action
 - this.$store.dispatch()是触发actions的第一种方式
 - 触发actions的第二种方式:按需导入
 - D.Getter
 - 使用getters的第一种方式
 - 使用getters的第二种方式
 - 代码总结
 
使用
index.js
import Vue From 'vue'import Vuex from 'vuex'import getters from './getters'import app from './modules/app'import settings from './modules/settings'import user from './modules/user'import System from './modules/system'Vue.use(Vuex)const Store = new Vuex.Store({
    modules: {
        app,        settings,        user,        system    }
,    getters}
    )export default storegetters.js
const getters = {
        sidebar: state =>
     state.app.sidebar,    device: state =>
     state.app.device,    token: state =>
     state.user.token,    avatar: state =>
     state.user.avatar,    name: state =>
     state.user.name,    currentuserinfo: state =>
     state.system.currentuserinfo,    count: state =>
 state.system.count,}
    export default getterssystem.js
  const system = {
      namespaced: true,      state: {
          currentuserinfo: {
}
,          count: 0,      }
,      mutations: {
              SET_CURRENTUSERINFO: (state, currentuserinfo) =>
 {
              state.currentuserinfo = currentuserinfo          }
    ,          SET_COUNT: (state, count) =>
 {
              state.count = count          }
,      }
  }
      export default system全局使用:main.js文件中
import store from './store'new Vue({
        el: '#app',    router,    store,    render: h =>
 h(App)}
    )Vuex概述
Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享
使用Vuex管理数据的好处:
A.能够在vuex中集中管理共享的数据,便于开发和后期进行维护
B.能够高效的实现组件之间的数据共享,提高开发效率
C.存储在vuex中的数据是响应式的,当数据发生改变时,页面中的数据也会同步更新
Vuex中的核心特性
vuex中的主要核心概念如下:
- State
 - Mutation
 - Action
 - Getter
 
A.State
State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储例如,打开项目中的store.js文件,在State对象中可以添加我们要共享的数据,如:count:0
在组件中访问State的方式:1).this.$store.state.全局数据名称  如:this.$store.state.count2).先按需导入mapState函数: import {
 mapState }
 from 'vuex'然后数据映射为计算属性: computed:{
 ...mapState(['全局数据名称']) }
    this.$store.state.全局数据名称-组件访问State中的数据的第一种方式
//访问console.LOG("1111",this.$store.state.system.count);
    h3>
当前最新的count值为:{
{
$store.state.system.count}
}
    /h3>
    组件访问State中的数据的第二种方式:按需导入
 2).先按需导入mapState函数: import {
 mapState }
 from 'vuex' //将全局数据,用展开运算符映射为当前组件的计算属性   // 然后数据映射为计算属性: computed:{
 ...mapState(['count']) }
 mapState()可以传入对象或者数组 传入数组用法: mapState(['counte', 'name','age'])// 传入对象用法:可以重命名store中的数据  ...mapState({
       sCounter: state =>
 state.name,   ...... }
) computed:{
   ...mapState({
          count: state =>
 state.system.count,      ......    }
),   }
    B.Mutation
Mutation用于修改变更$store中的数据
只能通过Mutation变更Store数据,不可以直接操作Store中的数据通过这种方式虽然操作起来稍微繁琐点,但是可以集中监控所有的数据变化
this.$store.COMmIT是触发Mutation的第一种方式
1.定义:
  const system = {
      namespaced: true,      state: {
          count: 0,      }
,      mutations: {
          add(state) {
             //变更状态              state.count++          }
      }
  }
      export default system2.使用
template>
      div>
        h3>
当前最新的count值为:{
{
$store.state.system.count}
}
    /h3>
        el-button tyPE="Primary" @click="BTnHandler1">
    +1/el-button>
      /div>
    /template>
    script>
export default {
  name: 'Addition',  PRops: {
  }
,  data() {
    return {
    }
  }
,  computed: {
}
,  mounted() {
}
,  methods: {
    btnHandler1() {
      this.$store.commit("system/add")    }
,  }
}
    /script>
    style scoped>
    /style>
    1.传参—定义
mutations: {
          add(state) {
              state.count++          }
,          addN(state, step) {
              state.count += step          }
      }
    2.传参-使用
methods: {
    btnHandler1() {
      this.$store.commit("system/add")    }
,    btnHandler2(val){
      // commit 的作用就是调用某个mutation函数      this.$store.commit("system/addN",val)    }
,  }
    触发Mutation的第二种方式,按需导入
从vuex中按需导入mapMutations 函数
import {
 mapMutations }
     from 'vuex'通过刚才导入的mapMutations 函数,将需要的mapMutations 函数,映射为当前组件的methods方法:
sub(state) {
     state.count--}
,subN(state, step) {
     state.count -= step}
    ,method:{
    ...mapMutations({
      sub: 'system/sub'    }
),    btnHandler1(){
      this.sub()//直接引用    }
,    btnHandler2(val){
      this.subN(val)    }
,}
    C.Action
Action用于处理异步任务
如果通过异步操作变更数据,必须通过Action,而不能使用Mutation,但Action中还是要通过出发Mutation的方式间接变更数据
this.$store.dispatch()是触发actions的第一种方式
actions: {
          addAsync(content) {
                  setTimeout(() =>
 {
                  // 在actions中,不能直接修改state中的数据                  // 必须通过content.commit() 去触发某个mutations才行                  content.commit('add')              }
, 1000)          }
      }
    methods: {
    // 异步的让count自增+1    btnHandler3(){
      // 这里的dispatch函数,专门用来触发actions      this.$store.dispatch('system/addAsync')    }
, }
    actions携带参数
触发actions异步任务时携带参数
      actions: {
          addNAsync(content, step) {
                  setTimeout(() =>
 {
                  // 在actions中,不能直接修改state中的数据                  // 必须通过content.commit() 去触发某个mutations才行                  content.commit('addN', step)              }
, 1000)          }
,      }
    methods: {
    btnHandler4(){
      // 这里的dispatch函数,专门用来触发actions,传参      this.$store.dispatch('system/addNAsync',3)    }
, }
    触发actions的第二种方式:按需导入
      actions: {
          subAsync(content) {
                  setTimeout(() =>
 {
                  // 在actions中,不能直接修改state中的数据                  // 必须通过content.commit() 去触发某个mutations才行                  content.commit('sub')              }
, 1000)          }
,          subNAsync(content, step) {
                  setTimeout(() =>
 {
                  // 在actions中,不能直接修改state中的数据                  // 必须通过content.commit() 去触发某个mutations才行                  content.commit('subN', step)              }
, 1000)          }
,}
    import {
mapActions }
 from 'vuex'  methods:{
    ...mapActions({
      subAsync: 'system/subAsync',      subNAsync: 'system/subNAsync',    }
),    btnHandler3(){
      this.subAsync()    }
,    btnHandler4(){
      this.subNAsync(3)    }
,    }
    D.Getter
Getter用于对Store中的数据进行加工处理形成新的数据
它只会包装Store中保存的数据,并不会修改Store中保存的数据,当Store中的数据发生变化时,Getter生成的内容也会随之变化
打开store.js文件,添加getters,如下:
使用getters的第一种方式
//system.js文件中的  getters中的showNumh3>
{
{
$store.getters['system/showNum']}
}
    /h3>
    console.log('$store.state',this.$store.getters['system/showNum']);
    使用getters的第二种方式
h3>
{
{
showNum}
}
    /h3>
      computed: {
    ...mapGetters({
      showNum: 'system/showNum',    }
)  }
    ,代码总结
system.js
  const system = {
      namespaced: true,      state: {
          currentuserinfo: {
}
,          count: 0,      }
,      //   只有mutations中定义的函数,才有全力修改state中的数据      mutations: {
              //   SET_CURRENTUSERINFO: (state, currentuserinfo) =>
 {
          //       state.currentuserinfo = currentuserinfo          //   }
    ,          //   SET_COUNT: (state, count) =>
 {
          //       state.count = count          //   }
,          add(state) {
              state.count++          }
,          addN(state, step) {
              state.count += step          }
,          sub(state) {
              state.count--          }
,          subN(state, step) {
              state.count -= step          }
,      }
,      actions: {
          addAsync(content) {
                  setTimeout(() =>
 {
                  // 在actions中,不能直接修改state中的数据                  // 必须通过content.commit() 去触发某个mutations才行                  content.commit('add')              }
, 1000)          }
,          addNAsync(content, step) {
                  setTimeout(() =>
 {
                  // 在actions中,不能直接修改state中的数据                  // 必须通过content.commit() 去触发某个mutations才行                  content.commit('addN', step)              }
, 1000)          }
,          subAsync(content) {
                  setTimeout(() =>
 {
                  // 在actions中,不能直接修改state中的数据                  // 必须通过content.commit() 去触发某个mutations才行                  content.commit('sub')              }
, 1000)          }
,          subNAsync(content, step) {
                  setTimeout(() =>
 {
                  // 在actions中,不能直接修改state中的数据                  // 必须通过content.commit() 去触发某个mutations才行                  content.commit('subN', step)              }
, 1000)          }
,      }
,      getters: {
          //添加了一个showNum的属性          showNum(state) {
                  return '最新的count值为:【' + state.count + '】';
          }
      }
  }
      export default systemsrc\views\learnvuex\index.vue
template>
      div>
        my-addition >
    /my-addition>
        p>
    ----------------------/p>
        my-subtranction >
    /my-subtranction>
      /div>
    /template>
    script>
    // 导入import Addition from '@/components/Addition';
    import Subtranction from '@/components/Subtranction';
    // import Subtranction from '../../components/Addition';
export default {
  name: 'learnVuex',  props: {
}
,  //   注册  components: {
    'my-addition': Addition,    'my-subtranction': Subtranction  }
,  data() {
    return {
    }
  }
,  computed: {
}
,  mounted(){
        console.log("1111",this.$store.state.system.count);
  }
,}
    /script>
    style scoped>
    /style>
    src\components\Addition\index.vue
template>
      div>
        h3>
当前最新的count值为:{
{
$store.state.system.count}
}
    /h3>
        h3>
{
{
$store.getters['system/showNum']}
}
    /h3>
        el-button type="primary" @click="btnHandler1">
    +1/el-button>
        el-button type="primary" @click="btnHandler2(2)">
    +2/el-button>
        el-button type="primary" @click="btnHandler2(3)">
    +3/el-button>
        el-button type="primary" @click="btnHandler3">
    +1 Async/el-button>
        el-button type="primary" @click="btnHandler4">
    +3 Async/el-button>
      /div>
    /template>
    script>
export default {
  name: 'Addition',  props: {
  }
,  data() {
    return {
    }
  }
,  computed: {
}
,  mounted() {
        console.log('$store.state',this.$store.getters['system/showNum']);
  }
,  methods: {
    btnHandler1() {
      this.$store.commit("system/add")    }
,    btnHandler2(val){
      // commit 的作用就是调用某个mutation函数      this.$store.commit("system/addN",val)    }
,    // 异步的让count自增+1    btnHandler3(){
      // 这里的dispatch函数,专门用来触发actions      this.$store.dispatch('system/addAsync')    }
,    //     btnHandler4(){
      // 这里的dispatch函数,专门用来触发actions      this.$store.dispatch('system/addNAsync',3)    }
,  }
}
    /script>
    style scoped>
    /style>
    \src\components\Subtranction\index.vue
template>
    div>
      h3>
当前最新的count值为:{
{
count}
}
    /h3>
      h3>
{
{
showNum}
}
    /h3>
      el-button type="primary" @click="btnHandler1">
    -1/el-button>
      el-button type="primary" @click="btnHandler2(2)">
    -2/el-button>
      el-button type="primary" @click="btnHandler2(3)">
    -3/el-button>
      el-button type="primary" @click="btnHandler3">
    -1  Async/el-button>
      el-button type="primary" @click="btnHandler4">
    -3  Async/el-button>
    /div>
    /template>
    script>
import {
 mapState,mapMutations,mapActions,mapGetters }
 from 'vuex'export default {
  name: 'Subtranction',  props: {
}
,  data(){
    return{
          }
  }
,  computed: {
    ...mapState({
          count: state =>
 state.system.count,    }
),    ...mapGetters({
      showNum: 'system/showNum',    }
)     }
,  mounted(){
        console.log("mapState",this.count);
  }
,  methods:{
    ...mapMutations({
      sub: 'system/sub',      subN: 'system/subN',    }
),    ...mapActions({
      subAsync: 'system/subAsync',      subNAsync: 'system/subNAsync',    }
),    btnHandler1(){
      this.sub()    }
,    btnHandler2(val){
      this.subN(val)    }
,    btnHandler3(){
      this.subAsync()    }
,    btnHandler4(){
      this.subNAsync(3)    }
,  }
}
    /script>
    style scoped>
    /style>
    以上就是vue全家桶-vuex深入讲解的详细内容,更多关于vue全家桶-vuex的资料请关注其它相关文章!
您可能感兴趣的文章:- Vue全家桶入门基础教程
 - Vue全家桶实践项目总结(推荐)
 - 一篇Vue、React重点详解大全
 - vue项目刷新当前页面的三种方式(重载当前页面数据)
 - vue跨窗口通信之新窗口调用父窗口方法实例
 - vue通过url方式展示PDF的几种方法
 
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: vue全家桶-vuex深入讲解
本文地址: https://pptw.com/jishu/609295.html
