返回
Vuex 加深印象——亲身体验 Vuex 方法
前端
2024-01-26 10:06:31
前言
为了加深对 Vuex 的印象,以及对 Vuex 中各种方法的调用方式有更深入的了解,我决定通过一个实际案例来体验一把。案例如下:
案例
我们创建一个简单的购物清单应用,用户可以在其中添加、删除和修改商品。
1. 新建项目
vue create shop
2. 安装 Vuex
npm install vuex
3. 在 Vuex 中定义状态
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
// 购物清单
shoppingList: []
}
const mutations = {
// 添加商品
ADD_ITEM(state, item) {
state.shoppingList.push(item)
},
// 删除商品
REMOVE_ITEM(state, item) {
state.shoppingList.splice(state.shoppingList.indexOf(item), 1)
},
// 修改商品
EDIT_ITEM(state, payload) {
const item = state.shoppingList.find(item => item.id === payload.id)
item.name = payload.name
item.price = payload.price
}
}
const actions = {
// 添加商品
addItem({ commit }, item) {
commit('ADD_ITEM', item)
},
// 删除商品
removeItem({ commit }, item) {
commit('REMOVE_ITEM', item)
},
// 修改商品
editItem({ commit }, payload) {
commit('EDIT_ITEM', payload)
}
}
const getters = {
// 获取购物清单总价
totalPrice(state) {
return state.shoppingList.reduce((total, item) => total + item.price, 0)
},
// 获取购物清单中商品数量
totalItems(state) {
return state.shoppingList.length
}
}
export default new Vuex.Store({
state,
mutations,
actions,
getters
})
4. 在组件中使用 Vuex
// components/Shop.vue
<template>
<div>
<ul>
<li v-for="item in shoppingList" :key="item.id">
{{ item.name }} - {{ item.price }}
<button @click="removeItem(item)">X</button>
<button @click="editItem(item)">编辑</button>
</li>
</ul>
<p>总价:{{ totalPrice }}</p>
<p>商品数量:{{ totalItems }}</p>
<form @submit.prevent="addItem">
<input type="text" v-model="newItemName" placeholder="商品名称">
<input type="number" v-model="newItemPrice" placeholder="商品价格">
<button type="submit">添加</button>
</form>
</div>
</template>
<script>
import { mapState, mapActions, mapGetters } from 'vuex'
export default {
computed: {
...mapState(['shoppingList', 'totalPrice', 'totalItems']),
...mapGetters(['totalPrice', 'totalItems'])
},
methods: {
...mapActions(['addItem', 'removeItem', 'editItem']),
// 添加商品
addItem(e) {
this.addItem({
name: this.newItemName,
price: this.newItemPrice
})
this.newItemName = ''
this.newItemPrice = ''
},
// 删除商品
removeItem(item) {
this.removeItem(item)
},
// 修改商品
editItem(item) {
const newName = prompt('请输入新的商品名称:')
const newPrice = prompt('请输入新的商品价格:')
if (newName && newPrice) {
this.editItem({
id: item.id,
name: newName,
price: newPrice
})
}
}
}
}
</script>
5. 运行项目
npm run serve
总结
通过这个案例,我们加深了对 Vuex 的印象,并理解了 Vuex 中各种方法(mutations、actions、getters)的调用方式。Vuex 是一种非常强大的状态管理工具,可以帮助我们轻松管理大型应用中的状态。
希望这篇博文对您有所帮助。如果您有任何问题,请随时留言。