Vue之Vuex的商品列表项目(router/store)

1.功能描述

        商品列表,包含商品名称和商品价格字段,可以编辑和删除。展示的数据必须保存到Vuex,页面跳转使用Vue-router来实现

要求:

(1)商品列表默认是空,点击“添加商品”按钮后会从事先定义好的商品数组里随机添加一些商品信息,每个商品可生成一个id,代表商品唯一,并保存的Vuex。

(2)编辑时会跳转到编辑页面,默认进入编辑页面时展示该商品的信息,商品信息可以修改,修改完并提交完之后会自动跳转到商品的列表页面,这时候刚才编辑的商品信息就会发生变化。

(3)在列表页面点击“删除”按钮则对应的商品信息会被实时删除

2.效果图

3.代码部分

 建立对应包

代码部分

<!--EditStore.vue-->
<template>
  <div>
    <h3>编辑商品</h3>
    <p>商品名称: <input v-model="goodName" type="text"/></p>
    <p>商品价格: <input v-model="goodPrice" type="number"/></p>
    <input type="button" @click="submit" value="提交"/>
  </div>
</template>

<script>

export default {
  props: ['id'],
  computed: {
    goodInfo() {
      return this.$store.state.goodsList.filter(item => item.id === this.id)[0]
    }
  },
  methods: {
    submit() {
      this.$store.commit({
        type: 'updateGood',
        id: this.id,
        name: this.goodName,
        price: this.goodPrice
      })
      this.$router.push('/index')
    }
  },
  data() {
    return {
      goodName: '',
      goodPrice: 0
    }
  },
  mounted() {
    this.goodName = this.goodInfo.name
    this.goodPrice = this.goodInfo.price
  }
}
</script>
<!--IndexStore.vue-->
<template>
  <div>
    <h3 style="margin-left: 200px">商品列表</h3>
    <ul>
      <li>
        <span>商品名称</span>
        <span>价格</span>
        <span>操作</span>
      </li>
      <li v-for="(good, index) in goodsList" :key="index">
        <span>{{ good.name }}</span>
        <span>{{ good.price }}</span>
        <span style="color: red; cursor: pointer;">
          <em @click="delGood(good.id)">删除</em>
          <em @click="editGood(good.id)">编辑</em>
        </span>
      </li>
      <button @click="add">添加商品</button>
    </ul>
  </div>
</template>

<script>
export default {
  name:'IndexStore',
  computed: {
    goodsList() {
      return this.$store.state.goodsList
    }
  },
  data() {
    return {
      goods: [
        { name: '洗衣机', price: 990 },
        { name: '油烟机', price: 2239 },
        { name: '电饭煲', price: 200 },
        { name: '电视机', price: 880 },
        { name: '电冰箱', price: 650 },
        { name: '电脑', price: 4032 },
        { name: '电磁炉', price: 210 }
      ]
    }
  },
  methods: {
    add() {
      const { name, price } = this.randomGood()
      this.$store.commit({ type: 'addGood', name, price })
    },
    randomGood() {
      return this.goods[parseInt(Math.random() * 7)]
    },
    delGood(id) {
      this.$store.commit('delGood', id)
    },
    editGood(id) {
      this.$router.push({ name: 'Edit', params: { id } })
    }
  }
}
</script>

<style>
#app ul li {
  list-style: none;
  width: 400px;
  display: flex;
  justify-content: space-between;
}
</style>
// router.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import EditStore from "@/components/EditStore.vue";
import IndexStore from "@/components/IndexStore.vue";
Vue.use(VueRouter);

const routes = [
    {
        path: '/',
        redirect: '/index'
    },
    {
        path: '/index',
        component: IndexStore,
    },
    {
        path: '/edit/:id',
        component: EditStore,
        name: 'Edit',
        props: true
    }
];

const router = new VueRouter({
    routes
});

export default router;
// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        goodsList: []
    },
    mutations: {
        addGood(state, { name, price }) {
            state.goodsList.push({ id: state.goodsList.length + 1, name, price })
        },
        delGood(state, id) {
            state.goodsList.splice(
                state.goodsList.findIndex(item => item.id === id),
                1
            )
        },
        updateGood(state, { id, name, price }) {
            state.goodsList.forEach(item => {
                if (item.id === id) {
                    item.name = name
                    item.price = price
                }
            })
        }
    }
})
// main.js
import Vue from 'vue'
import Vuex from 'vuex'
import VueRouter from 'vue-router'
import store from './tool/store'
import App from './App.vue'
import router from "@/tool/router";

Vue.use(Vuex)
Vue.use(VueRouter)


new Vue({
    el: '#app',
    router,
    store,
    render: h => h(App)
})

如果有vue报错可以去看:https://blog.csdn.net/zywmac/article/details/134680404?spm=1001.2014.3001.5501​​​​​​​

 App.vue是创建项目的时候就有的,没改变,也没删除。

请同学们先赞后看养成习惯🤩🤩🤩🤩🤩🤩🤩🤩🤩

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是示例代码: 1. 在 src 目录下创建一个名为 data 的文件夹,在该文件夹内创建一个名为 data.json 的文件,用于存放数据。 2. 在 main.js 中引入相关库: ```javascript import Vue from 'vue' import App from './App.vue' import Vuex from 'vuex' import VueRouter from 'vue-router' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import axios from 'axios' Vue.prototype.$axios = axios Vue.config.productionTip = false Vue.use(Vuex) Vue.use(VueRouter) Vue.use(ElementUI) ``` 3. 在 store.js 中定义 Vuex 的状态管理: ```javascript import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ state: { data: [] // 存放数据的数组 }, mutations: { setData(state, data) { state.data = data }, addData(state, newData) { state.data.push(newData) }, deleteData(state, id) { const index = state.data.findIndex(item => item.id === id) state.data.splice(index, 1) }, updateData(state, newData) { const index = state.data.findIndex(item => item.id === newData.id) state.data.splice(index, 1, newData) } }, actions: { async fetchData({ commit }) { const response = await axios.get('/data/data.json') commit('setData', response.data) }, addData({ commit }, newData) { commit('addData', newData) }, deleteData({ commit }, id) { commit('deleteData', id) }, updateData({ commit }, newData) { commit('updateData', newData) } } }) export default store ``` 4. 在 router.js 中定义路由: ```javascript import Vue from 'vue' import VueRouter from 'vue-router' import Home from './views/Home.vue' import Data from './views/Data.vue' import AddData from './views/AddData.vue' import EditData from './views/EditData.vue' Vue.use(VueRouter) const routes = [ { path: '/', name: 'home', component: Home }, { path: '/data', name: 'data', component: Data }, { path: '/data/add', name: 'addData', component: AddData }, { path: '/data/edit/:id', name: 'editData', component: EditData } ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) export default router ``` 5. 在 App.vue 中使用 ElementUI 组件: ```html <template> <div id="app"> <el-header> <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect"> <el-menu-item index="/">首页</el-menu-item> <el-menu-item index="/data">数据</el-menu-item> </el-menu> </el-header> <el-main> <router-view></router-view> </el-main> </div> </template> <script> export default { name: 'app', computed: { activeIndex() { return this.$route.path } }, methods: { handleSelect(index) { this.$router.push(index) } } } </script> ``` 6. 在 Data.vue 中显示数据列表,并实现删除操作: ```html <template> <div> <el-table :data="data" style="width: 100%"> <el-table-column prop="id" label="ID"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column label="操作"> <template slot-scope="scope"> <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button> <el-button type="text" @click="handleDelete(scope.row.id)">删除</el-button> </template> </el-table-column> </el-table> <el-button type="primary" @click="handleAdd">添加</el-button> </div> </template> <script> export default { name: 'data', computed: { data() { return this.$store.state.data } }, methods: { handleEdit(row) { this.$router.push(`/data/edit/${row.id}`) }, handleDelete(id) { this.$confirm('确定删除该数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { this.$store.dispatch('deleteData', id) this.$message({ type: 'success', message: '删除成功!' }) }).catch(() => {}) }, handleAdd() { this.$router.push('/data/add') } }, created() { this.$store.dispatch('fetchData') } } </script> ``` 7. 在 AddData.vue实现添加操作: ```html <template> <div> <el-form :model="formData" label-width="80px"> <el-form-item label="姓名"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-form-item label="年龄"> <el-input v-model.number="formData.age"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handleAdd">添加</el-button> </el-form-item> </el-form> </div> </template> <script> export default { name: 'addData', data() { return { formData: { name: '', age: '' } } }, methods: { handleAdd() { const newData = { ...this.formData, id: Date.now() } this.$store.dispatch('addData', newData) this.$message({ type: 'success', message: '添加成功!' }) this.$router.push('/data') } } } </script> ``` 8. 在 EditData.vue实现编辑操作: ```html <template> <div> <el-form :model="formData" label-width="80px"> <el-form-item label="姓名"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-form-item label="年龄"> <el-input v-model.number="formData.age"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handleUpdate">更新</el-button> </el-form-item> </el-form> </div> </template> <script> export default { name: 'editData', data() { return { formData: { id: '', name: '', age: '' } } }, methods: { handleUpdate() { this.$store.dispatch('updateData', this.formData) this.$message({ type: 'success', message: '更新成功!' }) this.$router.push('/data') } }, created() { const id = this.$route.params.id const data = this.$store.state.data.find(item => item.id === Number(id)) this.formData = data } } </script> ``` 以上就是一个简单的 Vue 前端实现增删改查的示例。需要注意的是,以上代码仅供参考,实际应用中需要根据具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值