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中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...
随机推荐
- 系列解读 SMC-R (二):融合 TCP 与 RDMA 的 SMC-R 通信 | 龙蜥技术
简介:本篇以 first contact (通信两端建立首个连接) 场景为例,介绍 SMC-R 通信流程. 文/龙蜥社区高性能网络SIG 一.引言 通过上一篇文章 <系列解读SMC-R:透 ...
- 技术揭秘:实时数仓Hologres如何支持超大规模部署与运维
简介:在本次评测中,Hologres是目前通过中国信通院大数据产品分布式分析型数据库大规模性能评测的规模最大的MPP数据仓库产品.通过该评测,证明了阿里云实时数仓Hologres能够作为数据仓库和大 ...
- 一图速览 | DTCC 2021大会,阿里云数据库技术大咖都聊了些什么?
简介: 3天9场干货分享,快来收藏吧! 10月18日~10月20日, 由国内知名IT技术社区主办的数据库技术交流盛会--DTCC 2021 (第十一届中国数据库技术大会)在京圆满落幕.大会以&quo ...
- 实践探讨Python如何进行异常处理与日志记录
本文分享自华为云社区<Python异常处理与日志记录构建稳健可靠的应用>,作者:柠檬味拥抱. 异常处理和日志记录是编写可靠且易于维护的软件应用程序中至关重要的组成部分.Python提供了强 ...
- 4.prometheus监控--监控linux服务器
一.监控linux服务器 1.1 二进制安装 # 客户端操作wget https://github.com/prometheus/node_exporter/releases/download/v1. ...
- vue项目hbuilder打包-微信登录调取手机微信登录权限
这个笔记得做好. 1.vue页面的点击事件 import {login,loginy,wxLog,wxLogin,logout} from '../network/login' wxloginBtn( ...
- EPAI手绘建模APP资源管理和模型编辑器2
g) 矩形 图 26模型编辑器-矩形 i. 修改矩形的中心位置. ii. 修改矩形的长度和宽度. h) 正多边形 图 27模型编辑器-内接正多边形 图 28模型编辑器-外切正多边形 i. 修改正多 ...
- docker安装Mysql挂载数据卷 实现容器配置本地化
目录 一.安装docker 二.docker安装MySQL 安装5.7.31版本的mysql navicat 连接mysql 安装mysql:8 三.设置开机自动启动容器 Docker快速创建MySQ ...
- kube-proxy 流量流转方式
简介 kube-proxy 是 Kubernetes 集群中负责服务发现和负载均衡的组件之一.它是一个网络代理,运行在每个节点上, 用于 service 资源的负载均衡.它有两种模式:iptables ...
- idea推送代码忽略指定文件,文件夹配置
idea推送代码忽略指定文件,文件夹配置 今天碰到一个问题,配置了.gitignore文件后没有生效,整了半天,最后发现一种直接配置的方法,可以指定文件夹,或者指定文件类型 打开设置