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中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...
随机推荐
- 性能提升 57% ,SMC-R 透明加速 TCP 实战解析 | 龙蜥技术
简介:SMC-R 是如何加速 TCP 应用? 编者按:TCP 协议作为当前使用最为广泛的网络协议,场景遍布移动通信.数据中心等.对于数据中心场景,通过弹性 RDMA 实现高性能网络协议 SMC-R, ...
- 5月25日,阿里云开源 PolarDB-X 将迎来重磅升级发布
简介:2022年5月25日,阿里云开源 PolarDB-X 将升级发布新版本!PolarDB-X 从 2009 年开始服务于阿里巴巴电商核心系统, 2015 年开始对外提供商业化服务,并于 2021 ...
- What's new in dubbo-go v1.5.6
简介: dubbogo 社区近期发布了 dubbogo v1.5.6.该版本和 dubbo 2.7.8 对齐,提供了命令行工具,并提供了多种加载配置的方式. 作者 | 铁城 dubbo-go 社区 ...
- [Mobi] frida Hook 略知一二: frida-CLI, frida-server
Frida 是一款基于 python + javascript 的 hook 框架,主流平台都支持,由于是基于脚本的交互,因此相比 xposed 和 substrace cydia 更加便捷. 使用时 ...
- [BlockChain] 三方互惠是公共区块链得以发展的基石, dApp数字通证的运转需要可持续性玩法
------------------------------- 公链 旷工 开发者/用户 ------------------------------- -------------------- ...
- WPF 简单判断主线程界面是否卡顿的方法
本文来告诉大家如何使用简单的代码判断当前的软件的 UI 线程或界面是否卡顿 在后台线程调用如下代码即可用来判断是否卡顿 private static async Task<bool> Ch ...
- 2019-8-31-dotnet-动态代理魔法书
title author date CreateTime categories dotnet 动态代理魔法书 lindexi 2019-08-31 16:55:58 +0800 2019-06-02 ...
- STM32F10X 部分引脚不能使用的问题
一.概述 说来惭愧,我到现在都没有完整的学习过STM32.接触 STM32 还是突然的一个项目,需要用到 STM32,紧急需求,只能边学边完成.不过好在 ST 的资料还是比较多的,相对也比较简单,基本 ...
- Gradle8.4构建SpringBoot多模块项目
Gradle8.4构建SpringBoot多模块项目 一.基本 1.版本 这个版本是Jdk8最后一个SpringBoot版本 软件 版本 Gradle 8.4 SpringBoot 2.7.15 JD ...
- 利用python爬取某壳的房产数据
以无锡的某壳为例进行数据爬取,现在房子的价格起伏很快,买房是人生一个大事,了解本地的房价走势来判断是否应该入手. (建议是近2年不买,本人在21年高位抛了一套房,基本是通过贝壳数据判断房价已经到顶,希 ...