vuex的使用

vuex是vue中的状态管理模式
vuex是sre文件下store文件中,
首先引入vuex 和vue(前提安装了vuex)
store下的index.js

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

const store = new Vuex.Store({
   state: { 
        //这里面写入数据
    },
    getters:{ 
        // 在这里面写个方法,对state中的数据怎加或者减少
    },
    mutations:{ 
        // mutations 类似methods
        // 写方法对数据做出更改,里面不能写异步操作,只能写同步操作
    },
    actions:{
        // 写方法对数据做出更改,不过是更改mutations中的,可以写异步操作
    }
 
})
export default store

state:

在vue中拿取到state值有3种方法

  1. 直接使用this.$store.state.name获取
  2. 使用计算属性
  3. 使用mapState(其中这里面包含四种写法)
    (1):扩展运算符,解构赋值   ...mapState(['name','sex'])
    (2):扩展运算符,自定名字  ...mapState({ aliasName: 'name',sexName:'sex' })
    (3):使用函数...mapState({ddkk:state => state.name})
    (4):直接在计算属性下 写mapState(['name'])

store下的index.js文件如下

import Vuex from 'vuex'
import Vue from 'vue'

Vue.use(Vuex)

const store = new Vuex.Store({
    state: {
        name: 'jk',
        sex: 'sex'
    },
})
export default store;

HelloWorld代码如下

<template>
  <div class="hello">
    <div>直接获取  {{$store.state.name}}</div>
    <div>使用计算属性获取  {{getName}}</div>
    <div>这是1  {{name}}</div>
    <div>这是2  {{twoName}} {{twoSex}}</div>
    <div>这是3  {{threName}} </div>
    <div>这是4 {{name}} {{sex}}</div>
  </div>
</template>

<script>
import { mapState } from "vuex";
export default {
  name: "HelloWorld",
  components: {},
  mounted() {
    console.log(this.$store.state.name);
  },
  // 也可以使用计算属性
  computed:{
    getName(){
      return this.$store.state.name  //使用计算属性获取
    },
    // ...mapState(['name','sex'])   // 这是1
     //   twoName 是重新起的名字
    ...mapState({ twoName: 'name',twoSex:'sex' }), //这是2
    // ...mapState({threeName:state => state.name})  // 这是3
  },
  // computed: mapState(["name", "sex"]), //这是4  这个是单个的,不能多个
  methods: {
    // 辅助函数mapState的原理
    // mapState(arr) {
    //   let obj = {};
    //   arr.forEach((key) => {
    //     obj[key] = function () {
    //       console.log(this);
    //       return this.$store.state[key];
    //     };
    //   });
    //   return obj;
    // },
  },
};
</script>

<style scoped lang='scss'>
.hello {
  height: 200px;
  width: 100px;
  border: 1px solid red;
  &-nide {
    color: red;
  }
}
</style>

getters:
store下的index.js

   // getter不是修改state本身是修饰state中的数据
    getters:{
        // 获取修饰后的name,第一个参数state为必要参数,必须写在形参上
        xiuName:state=> `hello${state.name}`,
        xiuSex:state=> state.sex,
        // 等价于
        // xiuName(state){
        //     return`hello${state.name}`
        // }
    }

拿取getters中的值在组件中可以使用this.$store.getter.xiuName也可以使用mapGetters

export default {
    mounted() {
        console.log(this.xiuName);
        console.log(this.$store.getter.xiuName);
    },
    computed: {
        ...mapGetters(['xiuName']),
        //...mapGetters({ xiuSex: 'xiuSex' }),  
        // 赋别名的话,这里接收对象,而不是数组
    },
}

Mutation

mutation是用来修改state中的值的,我们通常修改数据都是直接修改赋值的,但是使用vuex的话不可以直接修改,需要在mutation修改,Mutations里面的函数必须是同步操作!!!
store下的 index.js

 
    state: {
        name: 'jk',
        sex: 'sex',
        number:6,
        obj:{
            persion:'张三'
        }
    },


mutations: { // 增加nutations属性
        setNumber(state) {  //state是必须默认参数,修改state中的number的值,第一个参数是必须传的
            state.number = 5;  //修改number中的值为5
        },
        setPersion:(state,payload)=>{  //  增加一个带参数的mutations方法,并且官方建议payload为一个对象
            state.obj.persion = payload.persion
        }
    },

vue中的写的

 mounted() {
    console.log("未修改的值", this.$store.state.number);
    console.log("未修改的值", this.$store.state.obj.persion);
    this.$store.commit("setPersion", { persion: "李四" }); // 调用的时候也需要传递一个对象
    this.$store.commit("setNumber"); // 调用的时候也需要传递一个对象
    console.log("修改的值1", this.$store.state.number);
    console.log("修改的值1", this.$store.state.obj.persion);
  },


action
actions存在的意义是假设你在修改state的时候有异步操作的时候,不能mutations中添加异步操作,
 

    state: {
        name: 'jk',
        sex: 'sex',
        number: 6,
        obj: {
            persion: '张三'
        },
    },

actions: {
        setNum(content) { // 增加setNum方法,默认第一个参数是content,其值是复制的一份store
            return new Promise(resolve => {  // 我们模拟一个异步操作,1秒后修改number为888
                setTimeout(() => {
                    content.commit('setPersion',{persion:'张五'});
                    resolve();
                }, 1000);
            });
        }
    }

vue中写法

  mounted() {
    console.log('未修改的',this.$store.state.obj.persion)
    this.$store.dispatch('setNum')
    console.log('修改过的',this.$store.state.obj.persion)
  },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值