vuex实现简单的赠删改功能
上一节已经完成路由跳转,这节就来利用vuex实现简单的赠删改功能
1.先利用element-ui组件完成页面的构建
1)main.js全局引入element-ui组件
import ElementUI from 'element-ui'
Vue.use(ElementUI);
2)index.html全局引入css
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
3)Coupon组件中使用表格布局(具体element-ui 的使用方法可以查看 官方文档)
[code]<template> <div class="wrapper"> <header> <el-button size="small" icon="el-icon-circle-plus-outline" @click="$router.push('/coupon/handle')"> 新增 </el-button> </header> <el-table :data="couponData"> <el-table-column prop="name" label="优惠券名称"></el-table-column> <el-table-column prop="value" label="优惠券面值"></el-table-column> <el-table-column prop="date" label="开始时间"> <template slot-scope="scope">{{scope.row.date1}} {{scope.row.date2}}</template> </el-table-column> <el-table-column fixed="right" label="操作" width="100"> <template slot-scope="scope"> <el-button @click="handleClick(secope.$index)" type="text" size="small">修改</el-button> <el-button @click="deleteClick(secope.$index)" type="text" size="small">删除</el-button> </template> </el-table-column> </el-table> </div> </template> <script> export default { data(){ return { couponData: [ { name: '中秋浓情购', value: 100, date1: '2018-9-20', date2: '14:20' }, { name: '国庆大优惠', value: 200, date1: '2018-9-25', date2: '14:20' }, { name: '双11购物狂欢', value: 1000, date1: '2018-11-11', date2: '14:20' },] } }, methods:{ handleClick(row) { console.log(row); }, deleteClick(row) { console.log(row); } }, } </script>
运行 npm run dev
2.Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
由于在第一节就安装了vuex(npm install vuex --save),这里就需要在mian.js中配置一下就好了
1)import {store} from './store/store'
2)
3)在src文件夹中新建一个store 文件夹来存储 store.js
[code]import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export const store = new Vuex.Store({ state: { couponData: [ { name: '中秋浓情购', value: 100, date1: '2018-9-20', date2: '14:20' }, { name: '国庆大优惠', value: 200, date1: '2018-9-25', date2: '14:20' }, { name: '双11购物狂欢', value: 1000, date1: '2018-11-11', date2: '14:20' }, ] }, mutations: { addCouponData(state, data) { state.couponData.push(data); }, handleCouponData(state, data) { state.couponData.splice(data.index, 1, data.couponData); }, deleteCouponData(state, index) { state.couponData.splice(index, 1); } } })
在mutations 中我们提供了三个方法分别是对couponData数组的赠删改操作。
现在我们就可以使用vuex来共享数据了,我们只需要在使用到couponData数组的地方进行
store.state.couponData
所以我们需要更改一下coupon.vue文件,
将data里面的数据删除换成计算属性computed
页面显示还是一样的,如果你安装了Vue Devtools插件的话就可以看到vuex里面存储的数据了。
3.删除数据
我们无法直接操作vuex中的数据,更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数,
你不能直接调用一个 mutation handler。这个选项更像是事件注册:“当触发一个类型为
deleteCouponData的 mutation 时,调用此函数。”要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法
修改deleteClick()函数
[code] deleteClick(row) { this.$store.commit('deleteCouponData', row) }
此时调用的正是store.js文件中编写的deleteCouponData()函数
[code]deleteCouponData(state, index) { state.couponData.splice(index, 1); }
点击删除操作时
触发一个类型为
deleteCouponData的 mutation ,并调用此函数删除数组第二项
4.添加优惠券
为了便于操作,这里我们将新建一个组件用来操作新增和修改优惠券,即CouponHandle.vue
[code]<template> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="优惠券名称" prop="name"> <el-input v-model="ruleForm.name"></el-input> </el-form-item> <el-form-item label="优惠券面值" prop="name"> <el-input v-model="ruleForm.value"></el-input> </el-form-item> <el-form-item label="活动时间" required> <el-col :span="11"> <el-form-item prop="date1"> <el-date-picker type="date" placeholder="选择日期" v-model="ruleForm.date1" style="width: 100%;"></el-date-picker> </el-form-item> </el-col> <el-col class="line" :span="2" style="text-align: center">-</el-col> <el-col :span="11"> <el-form-item prop="date2"> <el-time-picker type="fixed-time" placeholder="选择时间" v-model="ruleForm.date2" style="width: 100%;"></el-time-picker> </el-form-item> </el-col> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('ruleForm')">{{index >= 0 ? '立即修改' : '立即创建'}}</el-button> <el-button @click="resetForm('ruleForm')">重置</el-button> </el-form-item> </el-form> </template>
[code]<script> import {formatDate, isType} from '../../tools/tools.js' export default { data() { return { ruleForm: { name: '', value: '', date1: '', date2: '', }, rules: { name: [ { required: true, message: '请输入优惠券名称', trigger: 'blur' }, { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } ], value: [ { required: true, message: '请输入优惠券面值', trigger: 'blur' }, ], date1: [ { type: 'date', required: true, message: '请选择日期', trigger: 'change' } ], date2: [ { type: 'date', required: true, message: '请选择时间', trigger: 'change' } ], }, index: -1, }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { let couponData = { name: this.ruleForm.name, value: this.ruleForm.value, date1: formatDate(this.ruleForm.date1,'yyyy-mm-dd'), date2: formatDate(this.ruleForm.date2,'hh:ii') } this.$store.commit('addCouponData', couponData) this.$router.push('/coupon') } else { this.$message('请填写相应字段!!!'); return false; } }); }, resetForm(formName) { this.$refs[formName].resetFields(); } }, } </script>
这里引入了一个格式化时间格式的js文件,
[code]/** * 格式化时间 * @param date * @param format * @returns {string} */ export function isType(obj, type) { return Object.prototype.toString.call(obj) === '[object ' + type + ']'; } export function padLeftZero(str, length) { return ('00' + str).slice(-length); } export function formatDate(date, format = 'yyyy-mm-dd hh:ii') { if (!isType(date, 'Date')) { if (isType(date, 'String')) { date = date ? new Date(date.replace(/\-/g, "/")) : emptyDate; } else { let v = date; date = new Date(); date.setTime(v * 1000); } } if (!date.getRealMonth) { date.getRealMonth = () => { return date.getMonth() + 1; }; } let o = { 'y+': date.getFullYear(), 'm+': date.getRealMonth(), 'd+': date.getDate(), 'h+': date.getHours(), 'i+': date.getMinutes(), 's+': date.getSeconds() }; for (let k in o) { let str = o[k] + ''; if (new RegExp(`(${k})`).test(format)) { format = format.replace(RegExp.$1, padLeftZero(str, RegExp.$1.length)); } } return format; }
点击新增按钮将进入新增优惠券页面
如果通过表单验证后就,通过触发addCouponData()函数
[code] handleCouponData(state, data) { state.couponData.splice(data.index, 1, data.couponData); },
然后跳回优惠券管理页面
[code] this.$router.push('/coupon')
5.修改优惠券
由于修改优惠券和新增优惠券页面非常相似,故而我们可以共用一个组件,只需要做适当的修改,首先第一步便是在进入CouponHandle组件时判断是修改优惠券还是新增优惠券,这里就需要用到路由传参功能
1)Coupon组件中修改点击事件handleClick
[code]handleClick(row) { this.$router.push({path: '/coupon/handle', query: {index: row}}); },
将具体点击第几行(从0开始)作为参数传给子路由
2)CouponHandle组件中进行接收(this.$route.query.index)
[code] created(){ if(this.$route.query.index >= 0) { this.index = this.$route.query.index let data = this.$store.state.couponData[this.index] this.ruleForm = { name: data.name, value: data.value, date1: new Date(data.date1+' '+data.date2), date2: new Date(data.date1+' '+data.date2), } } },
如果是新增 this.$route.query.index 就会是 undefined , 如果是修改就会有修改的行数作为参数传入,故而判断
this.$route.query.index 是否大于 0 就可以知道是新增页面还是修改页面,那么就可以取到vuex中对应的数据来初始化表单数据了,并且把页面中立即创建改为立即修改。
接下来就只要在修改完毕后判断是如何操作vuex中的couponData数组了
[code]if(this.index >= 0) { this.$store.commit('handleCouponData', { index: this.index, couponData: couponData }) }else { this.$store.commit('addCouponData', couponData) }
点击立即修改触发的就是handleCouponData
详细vuex知识请查看vuex官方文档
阅读更多- 通过DBUtils和C3P0结合简单实现增删改功能简化使用JDBC
- jdbc简单的连接和实现基本的增删改更功能
- JFinal与bootstrap实现简单的增删改功能
- js 简单实现表单数据的增添,单项删改,多项删除,修改以及全选功能
- 简单实现python画圆功能
- C#摄像头实现拍照功能的简单代码示例
- Unity3D使用NGUI实现简单背包功能
- jQuery实现的简单前端搜索功能示例
- 在ie8上js实现简单的combobox功能(支持拼音检索)
- Unity, C# ,TCP实现的一个简单的对话同步功能
- [原创]Adobe Edge Animate1.0 --创建按钮及简单功能实现
- Android SharedPreferences应用 实现本地注册登陆 功能简单易懂(实例)
- Android 实现简单的登陆注册功能(SharedPreferences和SQLite)
- 使用Java实现简单的server/client回显功能的方法介绍
- 纯javascript实现简单下拉刷新功能
- html表单配合php实现一些简单功能的例子
- PHP基于socket实现的简单客户端和服务端通讯功能示例
- 简单的短信验证功能的实现
- python实现类似awk的简单功能
- 简单的短信验证功能的实现