再来一节v标签综合...

实例:水果购物车

实现功能:

  1. 显示水果列表:展示可供选择的水果列表,包括名称、价格等信息。

  2. 修改水果数量:允许用户在购物车中增加或减少水果的数量。

  3. 删除水果:允许用户从购物车中移除不需要的水果。

  4. 选择水果进行结算:在用户点击或选择水果时,将其添加到购物车中。

  5. 全选或反选水果:提供全选或反选功能。

  6. 处理结算:提供结算功能,允许用户确认选中的商品并进行支付。

  7. 数据持久化:将购物车中的数据保存在本地存储,以便用户下次访问时恢复数据。

思路:

仅介绍下功能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标签综合-进阶版的更多相关文章

  1. vue学习之template标签

    HTML5提供的新标签,具有以下特性: 1.该元素天生display:none,同时模板元素内部内容也是隐藏的 2.位置任意,可以在<head>中,也可以在<body>或者&l ...

  2. python学习之类的装饰器进阶版

    装饰器可以修饰函数,同样,也可以修饰类 装饰器 def deco(func):    print('======>被修饰的')return func 装饰器装饰函数的方式,语法糖 @decode ...

  3. JUnit5学习之八:综合进阶(终篇)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. python学习-- django 2.1.7 ajax 请求 进阶版

    #原来版本 $.get("/add/",{'a':a,'b':b}, function(ret){ $('#result').html(ret)}) #进阶版  $.get(&qu ...

  5. 手机端页面自适应解决方案—rem布局进阶版

    手机端页面自适应解决方案—rem布局进阶版   https://www.jianshu.com/p/985d26b40199 注:本文转载之处:https://www.cnblogs.com/anni ...

  6. 手机端页面自适应解决方案—rem布局(进阶版,附源码示例)

    转自:https://segmentfault.com/a/1190000007350680 一年前笔者写了一篇 <手机端页面自适应解决方案—rem布局>,意外受到很多朋友的关注和喜欢.但 ...

  7. vue学习第一部

    目录 基础操作 vue基础使用 步骤 vue的框架思想(mvvm) 显示数据 vue 常用指令 属性操作 事件绑定 操作样式 条件渲染指令 列表渲染指令 vue对象提供的属性功能 过滤器 计算和侦听属 ...

  8. vue学习笔记(二)——简单的介绍以及安装

    学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...

  9. day 81 Vue学习一之vue初识

      Vue学习一之vue初识   本节目录 一 Vue初识 二 ES6的基本语法 三 Vue的基本用法 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 vue初识 vue称为渐进式js ...

  10. vue学习笔记(九)vue-cli中的组件通信

    前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...

随机推荐

  1. 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章

    背景:今天给大家带来的分享主题是<媒体智能-淘宝直播流媒体互动实践>,内容分为5个部分,首先看看在淘宝直播的直播间里主播可以怎样给用户拜年:然后具体讲如何制作一个手势拜年的特效:接着介绍我 ...

  2. 阿里云CDN操控2.0版本正式发布

    ​简介: 2021年8月,阿里云边缘云CDN完成过去3年来最大的一次版本升级. 2021年8月,阿里云边缘云CDN完成过去3年来最大的一次版本升级.本次升级根据上万企业客户的使用反馈和行业应用特征,从 ...

  3. IDC报告:阿里云领跑中国数据库市场年度份额首超传统厂商

    ​ 简介: IDC报告显示,2020年中国关系型数据库软件市场规模达到121.8亿元,同比增长36.5%.其中,以公有云模式部署的关系型数据库市场占比达到51.5%,首次超过传统线下部署模式市场规模, ...

  4. [Kali] Kali 信息收集

      网络空间测绘. 网络空间测绘是2016年出现的一个概念,主要指用一些技术方法,来探测全球互联网空间上的节点分布情况和网络关系索引,构建全球互联网图谱的一种方法. nmap端口扫描. 子域名爆破. ...

  5. [FAQ] Win10 找到打开 hosts 文件

    1. Win+R 打开运行窗口. 2. 输入命令 C:\Windows\System32\drivers\etc 回车. Refer:windows hosts Link:https://www.cn ...

  6. WPF 简单判断主线程界面是否卡顿的方法

    本文来告诉大家如何使用简单的代码判断当前的软件的 UI 线程或界面是否卡顿 在后台线程调用如下代码即可用来判断是否卡顿 private static async Task<bool> Ch ...

  7. 【python爬虫案例】用python爬豆瓣读书TOP250排行榜!

    目录 一.爬虫对象-豆瓣读书TOP250 二.python爬虫代码讲解 三.讲解视频 四.完整源码 一.爬虫对象-豆瓣读书TOP250 今天我们分享一期python爬虫案例讲解.爬取对象是,豆瓣读书T ...

  8. WEB服务与NGINX(13)-NGINX的日志功能

    1.nginx的日志功能 定义nginx的访问日志显示的格式,即具体记录的客户端信息和格式.日志功能由ngx_http_log_module模块提供. log_format name string . ...

  9. 手机自适应的单位rem,与自适应网页的区别

    一个网站有的会分为pc站和移动站,有的网站只有pc站,而现在更多的是自适应的站点.现在针对自适应的网页设计有很多模板,如bootstrap,它会让你轻松定制一个只适应网站,而现在大多数的网站并不是靠程 ...

  10. python教程6.5-excel处理模块

    第三方开源模块安装  创建文件 打开已有文件 写数据 选择表 保存表 遍历表 按行遍历 按列遍历 遍历指定行列 遍历指定第几列数据 删除表 设置单元格样式 字体 对齐 设置行高列宽