「vue 组件通信二」vuex状态管理

前面一篇章介绍了组件的基本的通信,但是对于负责的项目来说还是略显单薄,所以今天再来介绍vue通信的另外一个重要角色 --- vuex
vuex 的存在主要是来解决非父子组件,兄弟组件所存在的缺陷。vuex主要的内容分为,state, mutations,actions, getters, modules

import Vue from 'vue';
import Vuex from 'vuex';
import mutations from './mutations'
import actions from './actions'
import getters from './getters'

Vue.use(Vuex);  //需要在这里注册然后才可以使用
const state = {
  count: 0,
  message: 'this is vuex'
}

export default new Vuex.Store({
  state,
  mutations,
  actions,
  getters
})

state

这个属性主要的作用就是用来存储vuex管理的实例

const state = {
  count: 0,
  message: 'this is vuex'
}

mutaitions

要知道状态管理的属性(state)只能用来读取,而不能进行进修修改,只能通过mutatiosns来对它进行操作
mutaitions 就是对状态管理的属性进行一些修改操作(变更状态)

  • 官方不建议把异步放这里 ( 如果异步操作了数据,组件在commit后,数据不能立即更新,而且不知道什么时候更新)
const mutations = {
  increment (state) {
    state.count++;
  }
}

export default mutations;

在vue中使用它

template:
      {{count}}
      <button @click = "increment"> 点我 +</button>
 computed: {
    count: function () {
      return this.$store.state.count
    }
  },
  methods: {
    increment () {
      this.$store.commit('increment') // 通过this.$store.commit方法来执行mutations
    }
  }

actions

actions和mutations很相似,不同在于action中可以提交mutations;
actions函数接收一个与store实例具有相同方法和属性的context对象; 因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

  • 官方建议把异步放在这里进行处理 (个人感觉并没有特别的地方😆)
const actions = {
  incrementAction (context) {
    context.commit('increment');
  },

  asyncIncrement (context) {
    return new Promise(resolve => {
      setTimeout(() => {
        context.commit('increment');
        resolve();
      }, 1000);
    })
  }
}

export default actions;

如何去使用这个东西呢?

 incrementAction () {
      this.$store.dispatch('incrementAction')
    },
    asyncIncrementAction () {
      this.$store.dispatch('asyncIncrement').then(() => {
        console.log(this.$store.state.count);
      })
    }

getter

getters 和 vue 中的 computed 类似 , 都是用来计算 state 然后生成新的数据 ( 状态 ) 的。

export default {
 count (state, getters) { // 参数说明: arg1: state实例  arg2: 也可以是getters自身
   return state.count > 5 ? '傻瓜' : '很棒哦'
 }
}
countGetter: function () {
      return this.$store.getters.count
    }

modules

这个其实项目用得相对比较少,它是用来把store分割到不同的模块。但项目大的时候当个的store可能并不能满足业务需求,就有可能造成store过于庞大,所以就需要进行拆分,而modules正好可以派上用场。

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> `moduleA`'s state
store.state.b // -> `moduleB`'s state
  • 最后
    对于vuex之前一直存在一个疑问,就是刷新之后的数据就不存在了,当然有解决办法
    就是配置本地存储一起使用eg: locationStorage/sessionStorage,但是本地存储了之后,为什么还要
    绕到vuex中去写?这根本就没必要啊,反而复杂了
    结论:
    vuex的作用,vuex主要用在父子组件通信或者子子组件间通信,如果不用vuex通信就得通过复杂的事件触发完成。
    只是用于这些组件通信使用。
    vuex 主要是负责通信的,而不是全局存储
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,963评论 0 7
  • ### store 1. Vue 组件中获得 Vuex 状态 ```js //方式一 全局引入单例类 // 创建一...
    芸豆_6a86阅读 739评论 0 3
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,035评论 4 111
  • VUE Vue :数据驱动的M V Vm框架 m :model(后台提供数据),v :view(页面),vM(模板...
    wudongyu阅读 5,424评论 0 11
  • 今天最后一天实习啦,马上就可以放!暑!假!回家啦hhhh~ 其实还是学到了很多东西, 朝九晚五(每天也就挤两个小时...
    Sheeryu阅读 162评论 0 0