Vue js与vuex计算属性与v-for和v-model

时间:2016-12-01 14:42:43

标签: javascript vue.js vuex

我需要使用v-for v-model。我读了docs并且没有关于如何在不使用突变处理程序之外的突变的情况下将其与v-for一起使用的示例。

如何在不改变属性的情况下在v-for中使用v-model?

  <div v-for="product in products">
     <select @change="addItem(product)" v-model="product.quantity">
        <option value="">0</option>
        <option v-for="n in 10">{{n}}</option>
      </select>
  </div>

 // component

  methods : {
    ...mapMutations({
      addToCart: ADD_TO_CART
    })
  },

1 个答案:

答案 0 :(得分:6)

我不确定我完全理解你的要求,但请看下面的内容:

修改

更新为使用Vuex - 但不是通过v-model,因为它不会调用所需的突变或操作

const store = new Vuex.Store({
    state: {
        products: [
        	{
                name: 'foo',
                quantity: 0,
            }, 
            {
                name: 'bar',
                quantity: 0,
        	},
        ],
    },
    getters: {
    	cart (state) {
        	return state.products.filter((product) => {
            	return product.quantity > 0
            })
        },    
    },
    mutations: {
        updateQuantity(state, payload) {
            state.products[payload.index].quantity = payload.val
        },
    }
})

new Vue({
    el: '#app',
    computed: {
        products() {
            return store.state.products
        },
        cart() {
            return store.getters.cart
        },
    },
    methods: {
        addItem (index, val) {
            store.commit('updateQuantity', { index, val })
        },
    }
})
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vuex@next"></script>
<div id="app">
    <div v-for="(product, index) in products">
        <label>{{ product.name }}</label>
        <select @change="addItem(index, $event.target.value)">
            <option value="">0</option>
            <option v-for="n in 10">{{n}}</option>
        </select>
    </div>
    <h1>cart</h1>
    <pre>{{ cart }}</pre>
</div>