VUEX

201 阅读1分钟

vuex初始化 {安装,导入,创建}

1,安装依赖包

npm install vuex --save

2, 导入vuex包

import Vuex from 'vuex' Vue.use(Vuex)

3, 创建 store 对象

export default new Vuex.Store({
  state: {
    nums:666
  },
  mutations: {
不能处理异步任务,否则会导致VUE浏览器插件不工作,如定时器
  },
  actions: {
专门处理异步任务,
  },
  modules: {
  }

})

直接访问

组件访问State数据的第一种方式

this.$store.state.数据名 在template中界面可省略this.

导入函数方式访问

mapState是固定写法

  • 可以理解为:mapState是state数据映射的函数,通过mapState可以获取state中的数据
  • mapState(['state数据1','state数据2']),将想要获取的state数据,作为参数传递给mapState
  • 例如:mapState(['count']),获取到的就是count数据对应的一个对象{count:f}

代码

<h1>增加数值:{{ nums }}</h1>
import { mapState } from "vuex";
//写data下面
 computed: {
    ...mapState(["nums"]),
  },


mutation的基本使用

修改数据必须使用 mutation

您不能直接修改数据,这样不利于监控数据变化,后期维护

代码

引入使用
  methods: {
  //add是 点击事件,
    add() {
      this.$store.commit("addnums");
    },
  },
  
  
//共享数据,state就是数据对象,它里面的nums是数值
//不知道写在哪看上面的实例化
  mutations: {
    addnums(state) {
      state.nums += 1
    },
  },


您还可以携带参数

代码

使用数据
  methods: {
    add2() {
      this.$store.commit("addnums2", 5);
    },
  },
 
 修改数据
  state是数据对象 state.nums 是共享数据
    mutations: {
    addnums2(state,val) {
      state.nums += val
    },
  },
  

映射函数触发 mutation

触发mutation的第二种方式

  • 这里的mapMutations也是固定的名字
  • mapMutations用于映射mutations方法
  • 与mapState类似,都是一个映射函数,用法也一致
  • 只不过mutations既然是一个函数,那么就在methods中映射

** - 最终效果相当于:**


methods: {
             add(state) {
                 state.count++
             },
             addN(state, step) {
                  state.count += step
             },
         }

代码

引入使用
import { mapState, mapMutations } from "vuex";

  methods: {
    ...mapMutations(["subnums"]),
    sub() {
      this.subnums();
    },
  },
  
  共享数据修改
    mutations: {
    subnums(state) {
      state.nums -= 1
    }
  },

携带参数

代码

组件引入使用 (不传值,传值)
 methods: {
    ...mapMutations(["subnums", "subnums2"]),
    sub() {
      this.subnums();
    },
    sub2() {
      this.subnums2(5);
    },
  },
  修改数据
    mutations: {
    subnums(state) {
      state.nums -= 1
    },
    subnums2(state,val) {
      state.nums -= val
    }
  },
  

Action

专门用来处理异步任务的,

  • 异步操作都定义到actions中
    • actions中要操作数据,必须通过commit触发方法来修改
    • actions中不能直接修改store的数据,数据只能在mutations中修改
    • 异步方法必须有一个参数,context,代表当前store实例对象
      • 因为为了方便通过commit触发mutations方法
  • 触发action
    • 通过store实例中的方法dispatch来调用
    • dispatch:分发的意思,异步的任务都是通过分发的方式调用的

触发action代码

引入使用
    addNN() {
      this.$store.dispatch("addN");
    },

处理异步任务:
  mutations: {
    addnums(state) {
      state.nums += 1
    },
   },

    content代表当前store实例对象 注意不是数据对象
  actions: {
      注意content不是数据对象,是实例对象new Vuex.Store本身
    addN(content) {
      setTimeout(() => {
      //调用mutations 里面的执行体
        content.commit('addnums')
      },1000)
    }
  },

触发action的时候携带参数

  • 定义异步方法,第二个参数就是要给addN方法传递的参数
  • 调用异步方法,第一个参数是调用的方法名,第二个参数是给addNAsync方法传递的参数

代码

引入使用
    addNN() {
      this.$store.dispatch("addN",5);
    },

处理异步任务:
  mutations: {
    addnums(state,val) {
      state.nums += val
    },
   },

    content代表当前store实例对象 注意不是数据对象
  actions: {
      注意content不是数据对象,是实例对象new Vuex.Store本身
    addN(content,val) {
      setTimeout(() => {
      //调用mutations 里面的执行体
        content.commit('addnums',val)
      },1000)
    }
  },

Action另一种方式

引入使用
  methods: {
    ...mapActions(["subN3"]),
    sub3() {
      this.subN3();
    },
  },
  执行体
    mutations: {
    addnums(state) {
      state.nums += 1
    },
  },
  异步处理调用mutations
  actions: {
    subN3(content) {
      setTimeout(() => {
        content.commit('subnums')
      },1000)
    }, 
  }
  

getter进行传递前加工处理

H1里面就是 : 星星星星星星

<h1>{{ $store.state.numx }}</h1>

  state: {
    nums: 666,
    numx:'哈哈哈'
  },

  getters: {
    showNum(state) {
      return state.numx = '星星星星星星'
  }