vuex

127 阅读1分钟
const store = new Vuex.Store({

state: {
    products: [
        { name: '鼠标', price: 20 },
    ]

    state的值在组件内部调用

    方式一:
    computed:{
        products:()=>{return this.$store.products}
    }

    方式二:
    import {mapState} from 'vuex'
    computed:{
        ...mapState(['products'])
    }
    
    在页面可以直接调用{{products}},在js要用this.products
},


getters: {
    saleProducts: (state) => {
        //对state处理加工后返回
        let saleProducts = state.products.map(product => {
            return {
                name: product.name,
                price: product.price / 2
            }
        })
        return saleProducts;
    }

    getters的值在组件内部调用
    
    方式一:
    computed:{
        saleProducts:()=>{return this.$store.getters.saleProducts}
    }

    方式二:
    import {mapGetters} from 'vuex'
    computed:{
        ...mapGetters(['saleProducts'])
    }

    在页面可以直接调用{{saleProducts}},在js要用this.saleProducts
},


mutations:{ 
    第一个参数是state, 第二参数是payload, 也就会自定义的参数.
    minusPrice (state, payload ) {
      let newPrice = state.products.forEach( product => {
        product.price -= payload
      })
    }
  }

  mutations的方法在组件内部调用
  方式一:
  methods: {
    minusPrice() {
        this.$store.commit('minusPrice', 2); //提交`minusPrice,payload为2
    }
}
  方式二:
  import {mapMutations} from 'vuex'
  methods:{
      ...mapMutations(['minusPrice'])
  }

  js使用this.minusPrice()调用

  actions:{ 
    第一个参数是context, 是一个与store实例具有相同属性和方法的对象,就理解为store
    
    minusPriceAsync( context, payload ) {
      setTimeout( () => {
        context.commit( 'minusPrice', payload ); //context提交
      }, 2000)
    }
  }

  actions方法在组件内部调用
  方式一:
  methods: {
    minusPriceAsync() {
        this.$store.dispatch('minusPriceAsync', 5); //分发actions中的minusPriceAsync这个异步函数
    }
}
  方式二:
  import {mapActions} from 'vuex'
  methods:{
      ...mapActions(['minusPriceAsync'])
  }

  js使用this.minusPrice()调用

})

vuex模块化 https://juejin.cn/post/6844903928149065742