Vue学习:10.v标签综合-进阶版
再来一节v标签综合...
实例:水果购物车
实现功能:
显示水果列表:展示可供选择的水果列表,包括名称、价格等信息。
修改水果数量:允许用户在购物车中增加或减少水果的数量。
删除水果:允许用户从购物车中移除不需要的水果。
选择水果进行结算:在用户点击或选择水果时,将其添加到购物车中。
全选或反选水果:提供全选或反选功能。
处理结算:提供结算功能,允许用户确认选中的商品并进行支付。
数据持久化:将购物车中的数据保存在本地存储,以便用户下次访问时恢复数据。
思路:
仅介绍下功能5、6、7的思路。
功能5:首先“全选”功能选择使用复选框标签,并且复选框的状态不是由自己决定的,而是取决于水果列表中每一项的选中状态。所以可以使用v-model绑定复选框的checked,然后使用计算属性动态修改其值。
既然该功能将复选框与水果列表中每一项的选中状态进行的双向绑定,因此既要根据list中每一项的状态来决定checkAll的状态:
get(){
return this.list.every(item => item.isCheacked)
}
又要将checkAll的状态传递给list中的每一项:
set(value){
this.list.forEach(item => item.isCheacked = value);
}
功能6:这个功能不同于之前的统计所有水果而是仅统计选中水果的信息,因此要在统计方法中先判断是否被选中,如果选中则计算;否则不计算。
totalPrice(){
return this.list.reduce((sum,item) => {
if(item.isCheacked){
return sum + item.price*item.numb
}else{
return sum
}
}, 0)
功能7:要实现数据的保存,首先要监听数据的变化,因此使用watch。并且要深度监听嵌套对象的变化。然后使用handler回调函数里的localStorage.setItem() 方法将 list 中的新数据转换为 JSON 字符串并保存到本地存储中,以便在页面刷新或重新加载后仍然保持数据。
watch:{
// 监视数据动态变化,并且保存到当地
list:{
deep:true,
handler(newValue){
localStorage.setItem('list',JSON.stringify(newValue))
}
}
}
同时,vue实例中的数据中的lsit也要与本地存储数据相关联,并且设置本地数组为空时的默认数据。
data: {
// 将list与本地存储数据相关联,并且设置本地数组为空时的默认数据
list: JSON.parse(localStorage.getItem('list')) || defaltList,
}
代码:
html:
<div id="app">
<h3>水果购物车</h3>
<table v-if="list.length > 0">
<header>
<tr>
<th>选中</th>
<th>水果</th>
<th>单价</th>
<th>个数</th>
<th>小计</th>
<th>操作</th>
</tr>
</header>
<tbody>
<tr v-for="(item, index) in list" :key="item.id" :class="{active:item.isCheacked}">
<td><input v-model="item.isCheacked" type="checkbox"></td>
<td>{{ item.name }}</td>
<td>{{ item.price }}</td>
<td>
<button :disabled="item.numb <= 1" @click="sub(item.id)">-</button>
<span>{{ item.numb }}</span>
<button @click="add(item.id)">+</button>
</td>
<td>{{ item.price*item.numb }}</td>
<td>
<button @click="del(item.id)" style="width: 60px;background-color: red;">删除</button>
</td>
</tr>
</tbody>
<footer>
<tr>
<td colspan="4" style="text-align: left;">
<input v-model="checkAll" type="checkbox">全选
</td>
<td colspan="2">
总价:¥{{ totalPrice }}
<span style="width: 80px; border: 1px solid black; background-color: #abc;">结算({{ totalNumb }})</span>
</td>
</tr>
</footer>
</table>
<div v-else class="empty">空空如也</div>
</div>
js:
<script>
// 设置默认数组,当清空缓存后依旧有值(默认情况应为空)
const defaltList = [
{id:1, isCheacked:true, name:'apple', price:2, numb:1},
{id:2, isCheacked:false, name:'banana', price:2.5, numb:1},
{id:3, isCheacked:false, name:'origan', price:3, numb:10},
]
const app = new Vue({
el: '#app',
data: {
// 将list与本地存储数据相关联,并且设置本地数组为空时的默认数据
list: JSON.parse(localStorage.getItem('list')) || defaltList,
},
computed:{
// 动态修改其值,并且要与list中的响应,故采用完整写法
checkAll: {
//根据list中每一项的状态来决定checkAll的状态
get(){
return this.list.every(item => item.isCheacked)
},
// 将checkAll的状态传递给list中的每一项
set(value){
this.list.forEach(item => item.isCheacked = value);
}
},
totalPrice(){
return this.list.reduce((sum,item) => {
if(item.isCheacked){
return sum + item.price*item.numb
}else{
return sum
}
}, 0)
},
totalNumb(){
return this.list.reduce((sum,item) => {
if(item.isCheacked){
return sum + item.numb
}else{
return sum
}
}, 0)
},
},
methods:{
add(id){
let fruit = this.list.find(item => item.id === id)
fruit.numb++
},
sub(id){
let fruit = this.list.find(item => item.id === id)
fruit.numb--
},
del(id){
this.list = this.list.filter(item => item.id != id)
},
},
watch:{
// 监视数据动态变化,并且保存到当地
list:{
deep:true,
handler(newValue){
localStorage.setItem('list',JSON.stringify(newValue))
}
}
}
})
</script>
css:
<style>
*{
box-sizing: border-box;
}
table{
height: 400px;
width: 600px;
border-collapse: collapse;
}
th,td{
text-align: center;
border: 1px solid black;
}
button{
width: 30px;
height: 30px;
}
span{
width: 30px;
height: 30px;
text-align: center;
line-height: 30px;
}
.empty{
width: 600px;
height: 200px;
margin-top: 5px;
text-align: center;
vertical-align: bottom;
border: 1px solid rgb(41, 41, 41);
}
.active{
background-color: #dad7d7;
}
</style>
Vue学习:10.v标签综合-进阶版的更多相关文章
- vue学习之template标签
HTML5提供的新标签,具有以下特性: 1.该元素天生display:none,同时模板元素内部内容也是隐藏的 2.位置任意,可以在<head>中,也可以在<body>或者&l ...
- python学习之类的装饰器进阶版
装饰器可以修饰函数,同样,也可以修饰类 装饰器 def deco(func): print('======>被修饰的')return func 装饰器装饰函数的方式,语法糖 @decode ...
- JUnit5学习之八:综合进阶(终篇)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- python学习-- django 2.1.7 ajax 请求 进阶版
#原来版本 $.get("/add/",{'a':a,'b':b}, function(ret){ $('#result').html(ret)}) #进阶版 $.get(&qu ...
- 手机端页面自适应解决方案—rem布局进阶版
手机端页面自适应解决方案—rem布局进阶版 https://www.jianshu.com/p/985d26b40199 注:本文转载之处:https://www.cnblogs.com/anni ...
- 手机端页面自适应解决方案—rem布局(进阶版,附源码示例)
转自:https://segmentfault.com/a/1190000007350680 一年前笔者写了一篇 <手机端页面自适应解决方案—rem布局>,意外受到很多朋友的关注和喜欢.但 ...
- vue学习第一部
目录 基础操作 vue基础使用 步骤 vue的框架思想(mvvm) 显示数据 vue 常用指令 属性操作 事件绑定 操作样式 条件渲染指令 列表渲染指令 vue对象提供的属性功能 过滤器 计算和侦听属 ...
- vue学习笔记(二)——简单的介绍以及安装
学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...
- day 81 Vue学习一之vue初识
Vue学习一之vue初识 本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js ...
- vue学习笔记(九)vue-cli中的组件通信
前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...
随机推荐
- 开源微服务编排框架:Netflix Conductor
简介:本文主要介绍netflix conductor的基本概念和主要运行机制. 作者 | 夜阳 来源 | 阿里技术公众号 本文主要介绍netflix conductor的基本概念和主要运行机制. ...
- AI让边缘更智能 边缘让AI无处不在
简介: 城市管理和城市服务逐步走向智能化,智慧化.到2019底,全国100%的副省级城市,95%以上的地级市,以及50%以上的县级市均提出建设新型智慧城市,并已经有32个主要城市成立了专门的大数据管 ...
- WPF 已知问题 RadioButton 指定 GroupName 后关闭窗口可能导致无法选中
本文记录一个 WPF 已知问题,当 WPF 的 RadioButton 指定 GroupName 且将 IsChecked 状态绑定到 ViewModel 上,将包含以上控件的代码的窗口显示两个,接着 ...
- Nginx 简单应用(Windows os)
实际问题如下: 我的电脑上有vm虚拟机,我有两个网络,一个叫137,一个叫102 ,我现在vm的网络是102的网络(137不允许被vm使用),但是别人都是137的网络,如何让137的局域网访问我的vm ...
- STM32F1和STM32F4系列DMA的不同之处——对STM32的DMA的工作机制的一些理解
喜欢用STM32的DMA功能.一方面STM32的DMA和MPU的DMA一样,可以提高数据传输效率.另一方面,作为一种MCU上的DMA,它可以提高针对外设(peripheral)的数据传输的实时性,改变 ...
- 模型评测-书生浦语大模型实战营学习笔记7&大语言模型12
大语言模型学习-12.模型评测 书生浦语大模型实战营学习笔记7 视频教程特别像广告,所以这篇博客参考了很多其他内容给大家参考,主要是下面几个页面: https://zhuanlan.zhihu.com ...
- 80x86汇编—80x86架构
文章目录 计算机如何工作 存储器 逻辑地址到物理地址 寄存器 数据寄存器使用细节 其他知识点细节 堆栈Stack 标志寄存器 中断 汇编入门简单,深入难 使用8086架构进行学习,本章节如果没有学过计 ...
- C#应用的欢迎界面窗体方案 - 开源研究系列文章
这次整理以前的代码,然后想到了应用的欢迎界面窗体的问题.这个例子是在应用中启动一个线程来进行显示欢迎窗体的,对于应用的启动无影响,与其他人的源码不相同,欢迎读者进行复用此类库. 以前有编写过欢迎界面窗 ...
- C 语言编程 — 堆栈与内存管理
目录 文章目录 目录 前文列表 栈(Stack)和堆(Heap) 栈 堆 内存管理 动态分配内存 重新调整内存的大小和释放内存 前文列表 <程序编译流程与 GCC 编译器> <C 语 ...
- docker/k8s常见错误处理
启动docker失败,报错了 启动docker失败,报错了.Failed to load environment files: No such file or directory [root@mcwk ...