vuex

作者: 糖醋里脊120625 | 来源:发表于2022-04-01 15:44 被阅读0次

    this.$store.commit("increment")调用的是vuex中mutation中的increment函数,

    this.$store.dispatch("increment")调用的是vuex中actions中的increment函数

    **actions**
    Actions存在的意义是vuex作者假设你在修改state的时候有异步操作,
    //vue文件   获取getters值
    methods: {
       async kefu(){
        console.log('旧值---'+this.$store.state.cart.textchange);
        await this.$store.dispatch('cart/setNum',"123")   //123是参数
        console.log('新值---'+this.$store.state.cart.textchange);
        },
    }
    //vuex文件
    const actions={
        setNum(content,postdata){   //postdata:上面的123,content:vuex里面的方法,
            alert(postdata)
            return new Promise((resolve)=>{ 
              setTimeout(()=>{
                content.commit('newtext')        //commit调用mutations里的newtext方法
                resolve()
              },10)
            })
        }
    }
    const mutations = {
        newtext(state){
            state.textchange = "我已经改变了"
        },
    }
    
    **getters**
    这就是getters存在的意义。我们可以认为,【getters】是store的计算属性,数据处理,过滤计算
    //vue文件   获取getters值
    methods: {
        kefu(){
          console.log(this.$store.getters['cart/saleProducts'])
        },
    }
    //和上面功能一样
    computed:{
        ...mapGetters(['cart/saleProducts'])
      },
    
    
    //vuex文件
    const getters={
        saleProducts(state) {
            let saleProducts = state.products.map( product => {
                return {
                    name: product.name,
                    price: product.price / 2
                }
            })
            return saleProducts;
        },
       
    }
    
    
    
    mapState、mapGetters、mapMutations、mapActions第一个参数是字符串(命名空间名称),第二个参数是数组(不需要重命名)/对象(需要重命名)。
    
    复制代码
    mapXXXs('命名空间名称',['属性名1','属性名2'])
    
    mapXXXs('命名空间名称',{
    
      '组件中的新名称1':'Vuex中的原名称1',
    
      '组件中的新名称2':'Vuex中的原名称2',
    
    })
    复制代码
    
    **state**
    //vue文件   获取state值
    data() {
            return {
                datalist:[],
            }
        },
       created(){
          this.datalist= this.$store.state.cart.collections
       },
    //和上面方法一样
    computed: {
            ...mapState({
                collections: function (state) { // 用普通函数this指向vue实例,要注意\
                    console.log(state.cart.collections[0].bright)
                    return state.cart.collections
                },
            })
        },
    
    
    
    **mutations**
    页面一个事件 
    通过 this.$store.commit的方法这个方法可以传递参数,
    调动 mutations里面的CommodityCollection这个方法 改变state里面的一个值
    //vue文件   改变state值
    当开启 namespaced: true, //开启命名
    当开启 namespaced: false, //应该为 mutations方法
      ...mapMutations({
          addCollection: "cart/CommodityCollection"
        }),
        //和上面一样不同写法
        addCollection(list){
          this.$store.commit('cart/CommodityCollection',list)
          console.log(this.$store.state)
        },
    
     //vuex  模块文件**********************************************
    const state = {
        carts: localStorage.getItem('carts') ? JSON.parse(localStorage.getItem('carts')) : [], //购物车列表
        collections: localStorage.getItem('collections') ? JSON.parse(localStorage.getItem('collections')) : [], //收藏列表
    }
    
    const mutations = {
        //商品收藏
        CommodityCollection(state,data){
            var collectionsId = state.collections.find(list => {
                return data.id == list.id
            });
            if(collectionsId) {
                Toast('已经收藏过了!')
                return false
            }
            state.collections.push(data)
            localStorage.setItem('collections',JSON.stringify(state.collections));
            Toast('收藏成功')
        },
    
    
    }
    
    export default {
        namespaced: true, //开启命名
        state,
        mutations
    }
        
    
    
    
    
    
    

    相关文章

      网友评论

          本文标题:vuex

          本文链接:https://www.haomeiwen.com/subject/ijuajrtx.html