案例-品牌管理(数据缓存)
目标: 侦听list变化, 同步到浏览器本地
- 需求: 把品牌管理的数据实时同步到本地缓存
分析:
① 在watch侦听list变化的时候, 把最新的数组list转成JSON字符串存入到localStorage本地
② data里默认把list变量从本地取值, 如果取不到给个默认的空数组
效果:
新增/删除 – 刷新页面 – 数据还在
在之前的案例代码基础上接着写
// 定义过滤器结构
filters: {
shijian:(val) => {
return moment(val).format('YYYY-MM-DD')
}
},
// watch 侦听器结构
watch:{
list (){
console.log('list发生了变化')
// setItem(存进去)
// setItem("件名称",值),值:先要把对象转成字符串 JSON.stringify
localStorage.setItem('plist',JSON.stringify(this.list))
}
// list (newVal){
// localStorage.setItem('plist',JSON.stringify(newVal))
// }
}
页面刷新,存储进去的内容并不会展示到页面中,只是在本地存储着,所以还要获取出来
data() {
return {
name: "", // 名称
price: 0, // 价格
// || :短路运算
// 有本地存储读取本地存储,没有初始化数组
list: JSON.parse(localStorage.getItem('plist')) || [
{ 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') }
],
};
},
mine
<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 v-for="item in list " :key="item.id">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<!-- 如果价格超过100,就有red这个类 -->
<td :class="{red:item.price>100}">{{item.price}}</td>
<td>{{item.time}}</td>
<td><a href="#" @click.prevent="removeBtn(item.id)">删除</a></td>
</tr>
<!-- 新增价格栏 -->
<tr v-if="list.length !== 0" style="background-color:#EEE">
<td>统计:</td>
<td colspan="2">总价钱为:{{allPrice}}</td>
<td colspan="2">平均价:{{avgPrice}}</td>
</tr>
</tbody>
<!-- 如果数组长度为0,就创建 tfoot 结构到页面中 -->
<tfoot v-if="list.length === 0">
<tr>
<td colspan="5" style="text-align: center">暂无数据</td>
</tr>
</tfoot>
</table>
<!-- 添加资产 -->
<form class="form-inline">
<div class="form-group">
<div class="input-group">
<input
type="text"
class="form-control"
placeholder="资产名称"
v-model.trim="name"
/>
</div>
</div>
<div class="form-group">
<div class="input-group">
<input
type="text"
class="form-control"
placeholder="价格"
v-model.number="price"
/>
</div>
</div>
<!-- 阻止表单提交 -->
<button @click.prevent="addbtn" class="btn btn-primary">添加资产</button>
</form>
</div>
</div>
</template>
<script>
import 'bootstrap/dist/css/bootstrap.css'
import moment from "moment"
export default {
data() {
return {
name: "", // 名称
price: 0, // 价格
// || :短路运算
// 有本地存储读取本地存储,没有初始化数组
list: JSON.parse(localStorage.getItem('plist')) || [
{ 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') }
],
};
},
// 计算属性
computed: {
// 总价:
allPrice(){
// let sum = 0
// this.list.forEach(item => {
// sum +=item.price
// })
// return sum
// reduce 数组方法
return this.list.reduce((sum,item) =>sum+=item.price,0)
},
// 平均价
avgPrice(){
// allPrice:依赖项
return (this.allPrice / this.list.length).toFixed(2) //.toFixed(2):保留两位小数
}
},
methods: {
// 添加按钮
addbtn(){
// console.log(1111,this.name,this.price);
if(this.name === ''){
return alert('请输入合法名称')
}
// 💥修复 id 的bug
const id = this.list.length ? this.list[this.list.length - 1].id + 1 : 200
// push 影响原来的数组,页面的会自动更新
this.list.push( {
id: id ,
name: this.name,
price:this.price,
time: new Date()
})
// 添加成功后清空两个输入框
this.name = ""
this.price = 0
},
// 删除按钮
removeBtn(id){
console.log(id);
// 过滤掉 不要某一项 但是 filter 不改变原数组
this.list = this.list.filter(v => v.id != id)
}
},
// 定义过滤器结构
filters: {
shijian:(val) => {
return moment(val).format('YYYY-MM-DD')
}
},
// watch 侦听器结构
watch:{
list (){
console.log('list发生了变化')
// setItem(存进去)
// setItem("件名称",值),值:先要把对象转成字符串 JSON.stringify
localStorage.setItem('plist',JSON.stringify(this.list))
}
// list (newVal){
// localStorage.setItem('plist',JSON.stringify(newVal))
// }
}
};
</script>
<style >
.red{
color: red;
}
</style>