vuex学习

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
前言
  • Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。
  • 如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。
  • 如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。
一、安装vuex
  1. npm install vuex --save
  • 卸载
  1. npm uninstall vuex
  • vue2 安装的是vuex3版本,vue3 安装的是vuex4版本
  1. npm install --save vuex@3
二、创建store
  • 在项目src目录下创建store目录,在store目录中创建index.js文件。写入一下内容:
  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. // 挂载Vuex
  4. Vue.use(Vuex)
  5. // 创建Vuex对象
  6. const store = new Vuex.Store({
  7. state:{
  8. // 存放的键值对就是所要管理的状态
  9. // 以key:value为例
  10. key:'value',
  11. marketName:'富民xx'
  12. },
  13. mutations:{
  14. setKey(state,payload){
  15. state.key = payload
  16. }
  17. }
  18. })
  19. // vue2,要使用vuex3才能正常运行,对应vue3要使用vuex4
  20. export default store
三、挂载store
  1. // 挂载store
  2. import store from './store'
  3. /* eslint-disable no-new */
  4. new Vue({
  5. el: '#app',
  6. router,
  7. store: store, //tore:store 和 router一样,将我们创建的Vuex实例挂载到这个vue实例中
  8. components: { App },
  9. template: '<App/>'
  10. })
四、在组件中使用vuex
  • 将需要使用的值写在computed中:
  1. computed:{
  2. key(){
  3. return this.$store.state.key
  4. },
  5. },
  • 如果在组件中使用v-model绑定computed中的值,需要在computed中定义set方法,如下
  1. computed:{
  2. key:{
  3. get(){
  4. return this.$store.state.key;
  5. },
  6. set(val){
  7. this.$store.commit('setKey',val);
  8. }
  9. },
  10. },
五、在Vue组件中监听Vuex
  • 通过computed获取vuex中的状态值。
  • 通过watch监听值的改变。
  1. watch:{
  2. key(val){
  3. console.log('key变了:'+val);
  4. }
  5. },
六、核心概念

(1) state

  • 单一状态树
  • vuex使用单一状态树,用一个对象就包含了全部的应用层级状态
  1. // 创建Vuex对象
  2. const store = new Vuex.Store({
  3. state:{
  4. // 存放的键值对就是所要管理的状态
  5. // 以key:value为例
  6. key:'value',
  7. marketName:'富民xx'
  8. },
  9. })

组件中通过 this.$store.state.xxx 读取状态

  1. computed:{
  2. key(){
  3. return this.$store.state.key
  4. },
  5. },

mapState 辅助函数

  1. import { mapState } from 'vuex'
  2. export default {
  3. // computed:mapState({
  4. // key: state=>state.key,
  5. // marketName: state=>state.marketName
  6. // })
  7. // computed:mapState([
  8. // 'key',
  9. // 'marketName'
  10. // ])
  11. computed:{
  12. ...mapState({
  13. key: state=>state.key,
  14. marketName: state=>state.marketName
  15. })
  16. }
  17. }

(2) Mutation

  • 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。
  • Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。

vuex中

  1. mutations:{
  2. setKey(state,payload){
  3. state.key = payload
  4. },
  5. setMarket(state,val){
  6. state.marketName = val
  7. }
  8. }

组件中

  1. key:{
  2. get(){
  3. return this.$store.state.key;
  4. },
  5. set(val){
  6. this.$store.commit('setKey',val);
  7. }
  8. },
  9. marketName:{
  10. get(){
  11. return this.$store.state.marketName;
  12. },
  13. set(val){
  14. this.$store.commit('setMarket',val);
  15. }
  16. },

(3) Getter

  • 从 store 中的 state 中派生出一些状态
  1. state:{
  2. // 存放的键值对就是所要管理的状态
  3. // 以key:value为例
  4. key:'value',
  5. marketName:'富民xx',
  6. todos: [
  7. { id: 1, text: '...', done: true },
  8. { id: 2, text: '...', done: false }
  9. ]
  10. },
  11. getters:{
  12. doneTodos(state){
  13. return state.todos.filter(todo=>!todo.done)
  14. }
  15. },
  1. arr(){
  2. return this.$store.getters.doneTodos
  3. }

结果:

(4) actions

  • Action 类似于 mutation
  • Action 提交的是 mutation,而不是直接变更状态。

注册一个简单的 action

  1. actions:{
  2. increment({commit},val){
  3. commit('setMarket',val);
  4. }
  5. }

通过 store.dispatch 方法触发:

  1. this.$store.dispatch('increment','菜丁农贸xx');
【文章转自日本多IP服务器 http://www.558idc.com/japzq.html提供,感恩】