vue购物车案例、v-model进阶、与后端交互

一 购物车案例

- 结算

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>购物车结算</title><script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script><style>table, td {border: 1px solid black;text-align: center;}</style>
</head>
<body>
<div id="box"><table><tr><td>商品名称</td><td>价格</td><td>数量</td><td>选择</td></tr><tr v-for="item in dataList"><td>{{item.name}}</td><td>{{item.price}}</td><td>{{item.number}}</td><td><input type="checkbox" :value="item" v-model="checkGroup"></td></tr></table><br>已选商品:{{checkGroup}}<br>总价:{{getPrice()}}
</div>
</body>
<script>var vm = new Vue({el: '#box',data: {dataList: [{name: '今瓶没', price: 99, number: 2},{name: '西柚记', price: 59, number: 1},{name: '水壶转', price: 89, number: 5},],checkGroup: [],},methods: {getPrice() {let sum_price = 0for (i in this.checkGroup) {    // 这里的 i 是索引sum_price += this.checkGroup[i]['number'] * this.checkGroup[i]['price']}return sum_price}}})
</script>
</html>

img

- 全选/全不选

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>全选/全不选</title><script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script><style>table, td {border: 1px solid black;text-align: center;}</style>
</head>
<body>
<div id="box"><table><tr><td>商品名称</td><td>价格</td><td>数量</td><td>全选/全不选<input type="checkbox" v-model="allChecked" @change="checkAll"></td></tr><tr v-for="item in dataList"><td>{{item.name}}</td><td>{{item.price}}</td><td>{{item.number}}</td><td><input type="checkbox" :value="item" v-model="checkGroup" @change="checkOne"></td></tr></table><br>已选商品:{{checkGroup}}<br>总价:{{getPrice()}}
</div>
</body>
<script>var vm = new Vue({el: '#box',data: {dataList: [{name: '今瓶没', price: 99, number: 2},{name: '西柚记', price: 59, number: 1},{name: '水壶转', price: 89, number: 5},],checkGroup: [],allChecked: false,},methods: {getPrice() {let sum_price = 0for (i in this.checkGroup) {    // 这里的 i 是索引sum_price += this.checkGroup[i]['number'] * this.checkGroup[i]['price']}return sum_price},checkAll() {if (this.checkGroup.length > 0) {this.checkGroup = []} else {this.checkGroup = this.dataList}},checkOne() {// if (this.checkGroup.length === this.dataList.length) {//     this.allChecked = true// } else {//     this.allChecked = false// }this.allChecked = this.checkGroup.length === this.dataList.length;}}})
</script>
</html>

img

- 数量加减

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>控制加减</title><script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="row"><div id="box" class="col-md-4 offset-md-1 text-center mt-5 "><table class="table table-bordered"><thead><tr><th scope="col">商品名称</th><th scope="col">单价</th><th scope="col">数量</th><th scope="col">全选/全不选 <input type="checkbox" v-model="allChecked" @change="checkAll"></th></tr></thead><tbody><tr v-for="item in dataList"><td>{{item.name}}</td><td>{{item.price}}</td><td><button class="btn link btn-sm" @click="reduceNum(item)">-</button>{{item.number}}<button class="btn link btn-sm" @click="item.number++">+</button></td><td><input type="checkbox" :value="item" v-model="checkGroup" @change="checkOne"></td></tr><tr class="text-left"><td colspan="4">总价:{{getPrice()}}</tr></tbody></table></div>
</div>
</body>
<script>var vm = new Vue({el: '#box',data: {dataList: [{name: '今瓶没', price: 99, number: 1},{name: '西柚记', price: 59, number: 1},{name: '水壶转', price: 89, number: 1},],checkGroup: [],allChecked: false,},methods: {getPrice() {let sum_price = 0for (i in this.checkGroup) {sum_price += this.checkGroup[i]['number'] * this.checkGroup[i]['price']}return sum_price},checkAll() {if (this.checkGroup.length > 0) {this.checkGroup = []} else {this.checkGroup = this.dataList}},checkOne() {// if (this.checkGroup.length === this.dataList.length) {//     this.allChecked = true// } else {//     this.allChecked = false// }this.allChecked = this.checkGroup.length === this.dataList.length;},reduceNum(item) {if (item.number === 1) {item.number = 1} else {item.number--}}}})
</script>
</html>

img

二:v-model进阶

v-model 之 lazy、number、trim

  • lazy:等待input框的数据绑定时区焦点之后再变化
  • number:数字开头,只保留数字,后面的字母不保留;字母开头,都保留
  • trim:去除首位的空格
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>v-model 之 lazy、number、trim</title><script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
</head>
<body>
<div id="box"><input type="text" v-model="myText1" placeholder="normal"> {{myText1}}<br><input type="text" v-model.lazy="myText2" placeholder="lazy"> {{myText2}}<br><input type="text" v-model.number="myText3" placeholder="number"> {{myText3}}<br><input type="text" v-model.trim="myText4" placeholder="trim"> {{myText4}}
</div>
</body>
<script>var vm = new Vue({el: '#box',data: {myText1: '',myText2: '',myText3: '',myText4: '',},})
</script>
</html>

img

 

三 与后端交互 - ajax

版本1 - 出现了跨域问题

前端:index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue与后端交互 - 出现了跨域问题</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
</head>
<body>
<div id="box"><button @click="handleClick">加载数据</button>
</div>
</body>
<script>let vm = new Vue({el: '#box',data: {},methods: {handleClick() {$.ajax({url: 'http://127.0.0.1:5000/',    // 发送请求的url,本地的5000端口,是flask的默认端口method: 'get',success: (data) => {console.log(data)}})}}})
</script>
</html>
后端:main.py
from flask import Flask    # 这里用轻量级的Flask框架来测试app = Flask(__name__)@app.route('/')
def index():print('请求来了')return 'Hello World'if __name__ == '__main__':app.run()

img

这里可以看出:前端向后端成功发送了请求,后端也成功响应了,但是前端却报错了

这是因为:跨域问题的存在,浏览器检测到前端和后端不是来自同一个,所以认为这是不安全的,所以就拦截了该资源的传递

想要解决这个问题,就要实现:CORS,也就是 跨域资源共享

版本2 - 解决了跨域问题

前端:index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue与后端交互 - 解决了跨域问题</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
</head>
<body>
<div id="box"><button @click="handleClick">加载数据</button><p>加载的数据:{{myText}}</p>
</div>
</body>
<script>let vm = new Vue({el: '#box',data: {myText: ''},methods: {handleClick() {$.ajax({url: 'http://127.0.0.1:5000/',method: 'get',success: (data) => {console.log(data)this.myText = data}})}}})
</script>
</html>
后端:main.py
from flask import Flask, make_responseapp = Flask(__name__)@app.route('/')
def index():print('请求来了')res = make_response('Hello World')res.headers['Access-Control-Allow-Origin'] = '*'    # 访问控制允许的源 设置为全部return resif __name__ == '__main__':app.run()

img

版本3 - 后端读取json文件传到前端

json文件:file.json
{"name": "Darker","age": "18","gender": "male"
}
前端:index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue与后端交互 - json</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
</head>
<body>
<div id="box"><button @click="handleClick">加载数据</button><p>加载的数据:{{myText}}</p>
</div>
</body>
<script>let vm = new Vue({el: '#box',data: {myText: ''},methods: {handleClick() {$.ajax({url: 'http://127.0.0.1:5000/',method: 'get',success: (data) => {console.log(data)this.myText = data}})}}})
</script>
</html>
后端:main.py
import jsonfrom flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')
def index():print('请求来了')with open('file.json', mode='rt', encoding='utf-8') as f:dic = json.load(f)res = jsonify(dic)res.headers['Access-Control-Allow-Origin'] = '*'return resif __name__ == '__main__':app.run()

img

fetch

1.简介

① fetch介绍

提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应

它还提供了一个全局 fetch() 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源

② fetch基本格式
fetch('http://example.com/movies.json').then(function(response) {return response.json();}).then(function(myJson) {console.log(myJson);});

2.实例

json文件:file.json
{"name": "Darker","age": "18","gender": "male"
}
后端:main.py
import jsonfrom flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')
def index():print('请求来了')with open('file.json', mode='rt', encoding='utf-8') as f:dic = json.load(f)res = jsonify(dic)res.headers['Access-Control-Allow-Origin'] = '*'return resif __name__ == '__main__':app.run()
前端:index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue与后端交互 - fetch</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
</head>
<body>
<div id="box"><button @click="handleClick">加载数据</button><p>加载的数据:</p><ul><li >姓名:{{name}}</li><li >年龄:{{age}}</li><li >性别:{{gender}}</li></ul>
</div>
</body>
<script>let vm = new Vue({el: '#box',data: {name:'',age: '',gender: ''},methods: {handleClick() {fetch('http://127.0.0.1:5000/').then(response => {return response.json()}).then(json => {console.log('从后端获取的json数据', json)   // success 获取的数据this.name = json.namethis.age = json.agethis.gender = json.gender}).catch(ex => {console.log('出现了异常', ex)    // 抛出异常})}}})
</script>
</html>

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/609841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark与Elasticsearch的集成与全文搜索

Apache Spark和Elasticsearch是在大数据处理和全文搜索领域中非常流行的工具。在本文中&#xff0c;将深入探讨如何在Spark中集成Elasticsearch&#xff0c;并演示如何进行全文搜索和数据分析。将提供丰富的示例代码&#xff0c;以便更好地理解这一集成过程。 Spark与Elastics…

视频监控系统EasyCVR如何通过调用API接口查询和下载设备录像?

智慧安防平台EasyCVR是基于各种IP流媒体协议传输的视频汇聚和融合管理平台。视频流媒体服务器EasyCVR采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联…

Zookeeper系列(一)集群搭建(非容器)

系列文章 Zookeeper系列&#xff08;一&#xff09;集群搭建&#xff08;非容器&#xff09; 目录 前言 下载 搭建 Data目录 Conf目录 集群复制和修改 启动 配置示例 测试 总结 前言 Zookeeper是一个开源的分布式协调服务&#xff0c;其设计目标是将那些复杂的且容易出错的分…

vue+springboot+mybatis实现项目管理系统

项目前端&#xff1a;https://gitee.com/anxin-personal-project/project-management-front 项目后端&#xff1a;https://gitee.com/anxin-personal-project/project-management-behind 项目均可运行&#xff01;&#xff01;&#xff01;有问题留言&#xff0c;如果看到了会…

华为mux vlan+DHCP+单臂路由用法配置案例

最终效果&#xff1a; vlan 2模拟局域网服务器&#xff0c;手动配置地址&#xff0c;也能上公网 vlan 3、4用dhcp分配地址 vlan 4的用户之间不能互通&#xff0c;但可以和其它vlan通&#xff0c;也能上公网 vlan 3的用户不受任何限制可以和任何vlan通&#xff0c;也能上公网 交…

伺服系统刚性模型的建立

一.系统工作原理 为了实现对运动控制系统精准的位置控制&#xff0c;首先要对伺服进给系统进行准确建模和模型辨识。人们对于运动控制系统的研究中已经提出了多种多样的系统建模和辨识方法。 图1 伺服电机滚珠丝杠传动系统刚性模型 下面对整个系统的工作原理进行解释&#xff…

日志系统一(elasticsearch+filebeat+logstash+kibana)

目录 一、es集群部署 安装java环境 部署es集群 安装IK分词器插件 二、filebeat安装&#xff08;docker方式&#xff09; 三、logstash部署 四、kibana部署 背景&#xff1a;因业务需求需要将nginx、java、ingress日志进行收集。 架构&#xff1a;filebeatlogstasheskib…

2024最新AI系统ChatGPT商业运营网站源码,支持Midjourney绘画AI绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

关于java的冒泡排序

关于java的冒泡排序 我们前面的文章中了解到了数组的方法类Arrays&#xff0c;我们本篇文章来了解一下最出名的排序算法之一&#xff0c;冒泡排序&#xff01;&#x1f600; 冒泡排序的代码还是非常简单的&#xff0c;两层循环&#xff0c;外层冒泡轮数&#xff0c;里层依次比…

TSP(Python):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

【操作系统】复习汇总(各章节知识图谱)

第1章&#xff1a; 第2章&#xff1a; 第3章&#xff1a; 第4章&#xff1a; 第5章&#xff1a; 第6章&#xff1a; 第7章&#xff1a; 第8章&#xff1a; 第9章&#xff1a;

系统性介绍MoE模型架构,以及在如今大模型方向的发展现状

知乎&#xff1a;Verlocksss编辑&#xff1a;马景锐链接&#xff1a;https://zhuanlan.zhihu.com/p/675216281 1 学习动机 第一次了解到MoE&#xff08;Mixture of experts&#xff09;&#xff0c;是在GPT-4模型架构泄漏事件&#xff0c;听说GPT-4的架构是8个GPT-3级别大小的模…

2707. 字符串中的额外字符

牛客网&#xff1a;https://leetcode.cn/problems/extra-characters-in-a-string/description/?envTypedaily-question&envId2024-01-09 官方解题思路为动态规划或字典数优化&#xff1b; 这里引入Up主的解题思路&#xff08;递归&#xff09; 哔哩哔哩&#xff1a;https…

【计算机网络】TCP原理 | 可靠性机制分析(二)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; T…

Python异步编程|PySimpleGUI界面读取PDF转换Excel

目录 实例要求 原始pdf文件格式 输出xls文件格式 运行界面 完整代码 代码分析 遍历表格 布局界面 控件简介 写入表格 表格排序 事件循环 异步编程 实例要求 使用PySimpleGUI做一个把单位考勤系统导出的pdf文件合并输出Excel的应用&#xff0c;故事出自&#xff1…

CDN的介绍以及加速内容传输原理

目前在公司的开发过程中&#xff0c;发现很多存储在oss的静态资源&#xff08;图片&#xff0c;安装包&#xff09;的链接中域名都使用了cdn域名&#xff0c;后面了解到这个cdn域名的主要作用是加速资源的访问&#xff0c;于是抽空了解了一下CDN加速原理。 目前使用得比较多的是…

Python多线程同步

同步条件(Event) 在Python中&#xff0c;多线程同步可以通过threading模块中的Event对象来实现。Event对象允许一个或多个线程等待某个事件的发生&#xff0c;当事件发生时&#xff0c;等待的线程将被唤醒。 event.isSet()&#xff1a;返回event的状态值 event.wait()&#x…

PyQt5-小总结

之前学习PyQt5&#xff0c;然后那段时间想做一个桌面小程序&#xff0c;后来由于学习内容较多就做了一小部分&#xff0c;但是可以进行页面跳转。大家如果是初学者对Python感兴趣而且刚学数据库时可以看看代码&#xff0c;可能会有点启发。 效果&#xff1a; 登录进来是这&…

FreeRTOS学习——任务通知

一、什么是任务通知 FreeRTOS 从版本 V8.2.0 开始提供任务通知这个功能&#xff0c;每个任务都有一个 32 位的通知值。按照 FreeRTOS 官方的说法&#xff0c;使用消息通知比通过二进制信号量方式解除阻塞任务快 45%&#xff0c; 并且更加省内存&#xff08;无需创建队 列&#…

解析游戏开发中的ECS设计模式:实体、组件、系统的完美协同

ECS&#xff08;Entity-Component-System&#xff09;是一种设计模式&#xff0c;通常用于构建和管理具有大量实体和复杂交互的系统&#xff0c;尤其在游戏开发中得到广泛应用。这个模式的核心思想是将系统中的组件、实体和系统进行分离&#xff0c;以提高代码的可维护性、可扩…