【Vue】品牌管理案例

阅读: 评论:0

【Vue】品牌管理案例

【Vue】品牌管理案例

目标: 数据铺设

  • 需求1: 把默认数据显示到表格上
  • 需求2: 注意资产超过100的, 都用红色字体标记出来

细节:
① 先铺设静态页面 — 去.md文档里, 复制数据和标签模板
② 此案例使用bootstrap, 需要下载, 并导入到工程main.js中
③ 用v-for配合默认数据, 把数据默认铺设到表格上显示
④ 直接在标签上, 大于100价格, 动态设置red类名
图示:

1、因为案例使用了bootstrap, 工程化开发, 模块化用npm/yarn下载引入使用

npm install bootstrap@3

2、在main.js - 引入bootstrap

import "bootstrap/dist/css/bootstrap.css" // 默认找文件夹下的index文件(但是这个不是所以需要写路径)

3、模板代码

<template><div id="app"><div class="container"><!-- 顶部框模块 --><div class="form-group"><div class="input-group"><h4>品牌管理</h4></div></div><!-- 数据表格 --><table class="table table-bordered table-hover mt-2"><thead><tr><th>编号</th><th>资产名称</th><th>价格</th><th>创建时间</th><th>操作</th></tr></thead><tbody><tr ><td></td><td></td><!-- 如果价格超过100,就有red这个类 --><td class="red"></td><td></td><td><a href="#" >删除</a></td></tr></tbody><!-- <tfoot ><tr><td colspan="5" style="text-align: center">暂无数据</td></tr></tfoot>--></table><!-- 添加资产 --><form class="form-inline"><div class="form-group"><div class="input-group"><inputtype="text"class="form-control"placeholder="资产名称"/></div></div>&nbsp;&nbsp;&nbsp;&nbsp;<div class="form-group"><div class="input-group"><inputtype="text"class="form-control"placeholder="价格"/></div></div>&nbsp;&nbsp;&nbsp;&nbsp;<!-- 阻止表单提交 --><button class="btn btn-primary">添加资产</button></form></div></div>
</template>
<script>
export default {data() {return {name: "", // 名称price: 0, // 价格list: [{ id: 100, name: "外套", price: 199, time: new Date('2010-08-12')},{ id: 101, name: "裤子", price: 34, time: new Date('2013-09-01') },{ id: 102, name: "鞋", price: 25.4, time: new Date('2018-11-22') },{ id: 103, name: "头发", price: 19900, time: new Date('2020-12-12') }],};},
};
</script>
<style >
.red{color: red;
}
</style>

4、渲染数据

<tbody><tr v-for="obj in list" :key="obj.id"><td>{{ obj.id }}</td><td>{{ obj.name }}</td><!-- 如果价格超过100,就有red这个类 --><td :class="{red: obj.price > 100}">{{ obj.price }}</td><td>{{ obj.time }}</td><td><a href="#" >删除</a></td></tr>
</tbody>
<script>
// 1. 明确需求
// 2. 标签+样式+默认数据
// 3. 下载bootstrap, main.js引入bootstrap.css
// 4. 把list数组 - 铺设表格
// 5. 修改价格颜色
</script>

5、数据新增

  • 需求1: 实现表单数据新增进表格功能
  • 需求2: 判断用户输入是否为空给提示
  • 分析
    ① 添加资产按钮 – 绑定点击事件
    ② 给表单v-model绑定vue变量收集用户输入内容
    ③ 添加数组到数组中
    ④ 判断用户内容是否符合规定
<template>
....
<!-- 添加资产 --><form class="form-inline"><div class="form-group"><div class="input-group"><inputtype="text"class="form-control"placeholder="资产名称"v-model="name"/></div></div>&nbsp;&nbsp;&nbsp;&nbsp;<div class="form-group"><div class="input-group"><inputtype="text"class="form-control"placeholder="价格"v-model.number="price"/></div></div>&nbsp;&nbsp;&nbsp;&nbsp;<!-- 4. 阻止表单提交(刷新网页数据又回去了) --><button class="btn btn-primary" @click.prevent="addFn">添加资产</button></form>
....
</template>
<script>
// 目标: 新增
// 1. 按钮 - 事件
// 2. 给表单v-model绑定vue变量
export default {// ...省略其他methods: {addFn(){// 5. 判断是否为空if (im().length === 0 || this.price === 0) {alert("不能为空")return}// 3. 把值以对象形式-插入listthis.list.push({// 当前数组最后一个对象的id+1作为新对象id值id: this.list[this.list.length - 1].id + 1,name: this.name,price: this.price,time: new Date()})}}
};
</script>

6、数据删除

  • 需求1: 点击删除的a标签, 删除数据
  • 需求2: 删除没数据了要提示暂无数据的tfoot
  • 分析
    ① a标签绑定点击事件
    ② 给事件方法传id
    ③ 通过id, 找到对应数据删除
    ④ 删除光了要让tfoot显示
    ⑤ 删除光了再新增, 有bug(id值问题)需要修复
<td><a href="#" @click="delFn(obj.id)">删除</a></td>       
<script>
// 目标: 删除功能
// 1. 删除a标签-点击事件
// 2. 对应方法名
// 3. 数据id到事件方法中
// 4. 通过id, 找到这条数据在数组中的下标
// 5. splice方法删除原数组里的对应元素
// 6. 设置tfoot, 无数据给出提示
// 7. 无数据再新增, id要判断一下
export default {// ...其他代码methods: {// ...其他代码delFn(id){// 通过id找到这条数据在数组中下标let index = this.list.findIndex(obj => obj.id === id)this.list.splice(index, 1)}}
};
</script>

7、时间格式化
目标: 复制上个案例, 在此基础上, 把表格里的时间用过滤器+moment模块, 格式化成YYYY-MM-DD 格式
(1)下载moment处理日期的第三方工具模块

npm install  moment

(2)定义过滤器, 把时间用moment模块格式化, 返回我们想要的格式

// 目标: 处理时间
// 1. 下载moment模块
import moment from 'moment'
// 2. 定义过滤器, 编写内部代码
filters: { formatDate (val){return moment(val).format('YYYY-MM-DD')}
}<!-- 3. 使用过滤器 -->
<td>{{ obj.time | formatDate }}</td>

8、总价和均价
目标: 基于之前的案例, 完成总价和均价的计算效果

<tr style="background-color: #EEE"><td>统计:</td><td colspan="2">总价钱为: {{ allPrice }}</td><td colspan="2">平均价: {{ svgPrice }}</td>
</tr>
<script>
// 目标: 总价和均价显示
// 1. 末尾补tr - 显示总价和均价
export default {// ...源代码省略// 2. 计算属性computed: {allPrice(){// 3. 求总价return duce((sum, obj) => sum += obj.price, 0)},avgPrice(){// 4. 求均价 - 保留2位小数return (this.allPrice / this.list.length).toFixed(2)}}
}
</script>

总结: 总价来源于所有数据计算而来的结果, 故采用计算属性

8、数据缓存
侦听list变化, 同步到浏览器本地
需求: 把品牌管理的数据实时同步到本地缓存
分析:
① 在watch侦听list变化的时候, 把最新的数组list转成JSON字符串存入到localStorage本地
② data里默认把list变量从本地取值, 如果取不到给个默认的空数组
效果:
新增/删除 – 刷新页面 – 数据还在

<script>
import moment from "moment";
export default {data() {return {name: "", // 名称price: 0, // 价格// 3. 本地取出缓存listlist: JSON.Item('pList')) || [],};},// ...其他代码省略watch: {list: {handler(){// 2. 存入本地localStorage.setItem('pList', JSON.stringify(this.list))},deep: true}}
};
</script>

本文发布于:2024-02-02 23:37:56,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170688827647208.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:品牌管理   案例   Vue
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23