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.hqwc.cn/news/333767.html

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

相关文章

【Scala】——函数式编程

1 面向对象编程和函数式编程 1.1 面向对象编程 解决问题&#xff0c;分解对象&#xff0c;行为&#xff0c;属性&#xff0c;然后通过对象的关系以及行为的调用来解决问题。 • 对象&#xff1a;用户 • 行为&#xff1a;登录、连接 JDBC、读取数据库 • 属性&#xff1a;用户…

Linux学习记录——삽심칠 传输层TCP协议(2)

文章目录 1、滑动窗口2、拥塞控制3、延迟应答4、捎带应答5、总结TCP可靠性和性能提高6、面向字节流7、粘包问题8、异常情况9、全连接、半连接 上一篇是传输层TCP协议&#xff08;1&#xff09;。本篇默认读者已经清楚TCP报头各个部分、可靠性和握手挥手的含义。 有时候会把客户…

AI大语言模型会带来了新一波人工智能浪潮?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

eclipse正则表达式替换 Find/Replace

Find/Replace 对话框中使用正则表达式 CTRLF 打开 Find/Replace 对话框勾选 Regular expressions ​ 匹配注释 下图中的Find&#xff1a;/.*/ ​ 匹配换行符 换行符&#xff1a;\R 下图中的Find表达式&#xff1a;\R.*Excel.* ​ 新增空行 /** 替换为 \R\t/** ​ 选…

FreeRTOS学习总结(二)FreeRTOS任务创建和删除API函数

实现动态创建任务流程 任务控制块结构体成员介绍 typedef struct tskTaskControlBlock {volatile StackType_t * pxTopOfStack; /* 任务栈栈顶&#xff0c;必须为TCB第一个成员 */ListItem_t xStateListItem; /* 任务状态列表项 */ Li…

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程&#xff0c;旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要&#xff0c;因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…

abp vnext 下载指定版本的项目

开发环境 Win11 vs2022 abp vnext 下载地址&#xff1a;Get Started | ABP.IO 下载abp框架之前&#xff0c;需要先安装CLI&#xff0c;打开命令提示符&#xff0c;执行以下命令即可&#xff0c;这个也可以指定版本下载&#xff0c;这里就不做介绍了&#xff0c;以及删除命令…

110.线程(创建、终止)

一、线程概述 ◼ 与进程&#xff08;process&#xff09;类似&#xff0c;线程&#xff08;thread&#xff09;是允许应用程序并发执行多个任务的一种机 制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序&#xff0c;且共 享同一份全局内存区域&…

低抖动可编程SPXO SG-8200CG, SG-8201CG -高稳定性和低抖动特性

描述 SG-8200CG和SG-8201CG (sg -8201系列)利用爱普生新的低噪声分n锁相环技术&#xff0c;与上一代爱普生可编程晶体振荡器相比&#xff0c;稳定性提高了约2x&#xff0c;相位抖动降低了<1/25。sg -8201系列可编程为1.2MHz至170MHz的任何频率&#xff0c;工作温度范围可达…

C#,背包问题(Knapsack Problem)贪心算法的源代码

背包问题&#xff08;KnapSack Problem&#xff09;的相关算法是常用的规划算法。 一、什么是背包问题&#xff1f; 背包的问题是&#xff0c;你有一个“袋子”&#xff0c;可以装有限数量的物品&#xff0c;鉴于你有一组物品可以从每个物品中选择&#xff0c;每个物品都有各自…

Spring基于注解的AOP控制事务

首先在.xml中开启sprong对注解事务的支持 applicationContext.xml <tx:annotation-driven transaction-manager"transactionManager"/> 然后再Service中加上注解 service Service Transactional(readOnlytrue,propagation Propagation.SUPPORTS) public cl…

MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 当谈论MySQL高可用性解决方案时&#xff0c;从…