Vue入门三(表单控制|购物车案例|v-model进阶|与后端交互)

news2024/9/20 18:39:48

文章目录

  • 一、表单控制
  • 二、购物车案例
  • 三、v-model进阶
  • 四、与后端交互
    • 跨域问题解决,三种交互方法
    • 跨域问题详解
      • 1-CORS:后端代码控制,上面案例采用的方式
        • 1) 方式一:后端添加请求头
        • 2) 方式二:编写中间件
        • 3) 方式三:第三方模块django-cors-headers
      • 2-Nginx反向代理 (常用)
      • 3-JSONP:很老不会用了,它只能发get请求
      • 4-搭建Node代理服务器

一、表单控制

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	
	<body>
	
	    <div id="div">
	        <h1>表单控制</h1>
	        <hr>
	        <p>用户名:<input type="text" v-model="username"></p>
	        <p>密码:<input type="password" v-model="password"></p>
	        <p>
	            性别:<br>
	            男:<input type="radio" v-model="gender" value="1">&nbsp;&nbsp;
	            女:<input type="radio" v-model="gender" value="2">
	        </p>
	        <p>记住密码:<input type="checkbox" v-model="set_pwd"></p>
	        <p>
	            爱好:<br>
	            运动:<input type="checkbox" v-model="hobby" value="运动">&nbsp;&nbsp;
	            健身:<input type="checkbox" v-model="hobby" value="健身">&nbsp;&nbsp;
	            旅游:<input type="checkbox" v-model="hobby" value="旅游">
	        </p>
	       <button @click="handleSubmit">提交</button>
	    </div>    
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                username:'',
	                password:'',
	                gender:'',// radio单选,多个radio绑定同一个变量,选中某个,就对应value值
	                set_pwd:false,// checkbox 单选是true或false
	                hobby:[],// checkbox 多选是数组类型,必须一开始定义就是数组,多个checkbox绑定一个变量
	            },
	            methods:{
	                handleSubmit(){
	                    console.log(this.username,this.password,this.gender,this.set_pwd,this.hobby)
	                }
	            }
	
	        })
	
	    </script>
	</body>
	
	</html>

在这里插入图片描述


二、购物车案例

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
	    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
	    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
	    <script src="../js/vue.js"></script>
	    <style>
	        #table{
	            margin-top:50px;
	            margin-bottom:30px;
	        }
	        input[type='checkbox']{
	            cursor:pointer;
	        }
	        .btn{
	            border:1px solid rgb(138, 138, 138);
	        }
	    </style>
	</head>
	<body>
	    <div id="div" class="container">
	        <div class="row">
	            <div class="col-md-10 col-md-offset-1">
	                <h1 class="text-center" id="table">购物车商品结算清单</h1>
	                <table class="table table-hover table-bordered">
	                    <thead>
	                        <tr>
	                            <th class="text-center">商品id</th>
	                            <th class="text-center">商品名</th>
	                            <th class="text-center">商品价格</th>
	                            <th class="text-center">商品数量</th>
	                            <th class="text-center">
	                                全选or全不选&nbsp;&nbsp;<input type="checkbox" v-model="xuan" @change="CheckAll">
	                            </th>
	                            <th class="text-center">删除加购</th>
	                        </tr>
	                    </thead>
	                    <tbody>
	                        <tr v-for="data in shoplist">
	                            <td class="text-center">{{data.id}}</td>
	                            <td class="text-center">{{data.name}}</td>
	                            <td class="text-center">{{data.price}}</td>
	                            <td class="text-center">
	                                <span @click="CheckRemove(data)" class="btn">-</span>
	                                <input type="number" class="form-control-static" @change="number(data)" v-model="data.count">
	                                <span @click="CheckAdd(data)" class="btn">+</span>
	                            </td>
	                            <td class="text-center">
	                                <input type="checkbox" @change="Checkxuan"  v-model="Bymore" :value="data">
	                            </td>
	                            <td class="text-center"><button class="btn btn-danger" @click="CheckDel(data)">删除</button></td>
	                        </tr>
	                    </tbody>
	                </table>
	
	                <h5>当前选中商品:{{Bymore}}</h5>
	
	                <h3>购物车结算金额为:¥{{CountPrice()}}</h3>
	            </div>
	            
	        </div>
	    </div>
	
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                xuan:false,
	                shoplist:[
	                    {id:1,name:'巧克力',price:66,count:5},
	                    {id:2,name:'奶糖',price:3,count:8},
	                    {id:3,name:'辣条',price:6,count:4},
	                    {id:4,name:'果汁',price:9,count:55},
	                    {id:5,name:'薯片',price:12,count:33},
	                ],
	                Bymore:[],
	            },
	            methods:{
	                CountPrice(){
	                    var total = 0
	                    for(var item of this.Bymore){
	                        total += item.price*item.count
	                    }
	                    return total
	                },
	                CheckAll(){
	                    if(this.xuan==true){
	                        this.Bymore=this.shoplist
	                    }else{
	                        this.Bymore=[]
	                    }
	                },
	                number(data){
	                    if(data.count<1){
	                        data.count=1
	                    }
	                },
	                Checkxuan(){
	                    if(this.Bymore.length==this.shoplist.length){
	                        this.xuan=true
	                    }else{this.xuan=false}
	                },
	                CheckAdd(data){
	                   data.count++
	                },
	                CheckRemove(data){
	                    if (data.count>1){
	                        data.count--
	                    }
	                },
	                CheckDel(data){
	                    if(this.shoplist.indexOf(data)>0){
                            console.log(this.shoplist.splice(this.shoplist.indexOf(data),1))
                        }
	                }
	
	            }
	        })
	    </script>
	</body>
	</html>

在这里插入图片描述


三、v-model进阶

v-model双向数据绑定,还可以对输入框数据进行一定的限定。

v-modle释义
lazy等待input框的数据绑定时区焦点之后再变化
number以数字开头并只保留后面的数字,不保留字母;字母开头都保留
trim去除首位的空格
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	<body>
	    <div id="div">
	        <h1>v-model进阶用法</h1><p/>
	        默认v-model----><input type="text" v-model="name">------->{{name}}<p/>
	        lazy----><input type="text" v-model.lazy="name1">------->{{name1}}<p/>
	        number----><input type="text" v-model.number="name2">------->{{name2}}<p/>
	        trim----><input type="text" v-model.trim="name3">------->{{name3}}
	    </div>

	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                name:'',
	                name1:'',
	                name2:'',
	                name3:'',
	            },
	            methods:{
	
	            }
	        })
	    </script>
	</body>
	</html>

在这里插入图片描述


四、与后端交互

跨域问题解决,三种交互方法

与后端交互统一使用json编码格式

与后端交互涉及到跨域问题后,该如何解决跨域问题?

  • 当前端发送请求,后端响应了,但是前端还是报错,这是因为:跨域问题的存在,浏览器检测到前端与后端不是来自同一个,所以认为这是不安全的,最终也就拦截了该资源的传递
  • 想要解决这个问题,就要实现:CORS,也就是跨域资源共享
    • 浏览器的原因,只要不是向地址栏中的【域:地址和端口】发送请求,拿到的数据,浏览器就会拦截
      • 拦截例子:跨域问题
    • 解决:在后端响应头中添加headers={'Access-Control-Allow-Origin':'*'}
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
	    <script src="../js/vue.js"></script>
	    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
	    <title>Document</title>
	</head>
	<body>
	    <div id="div">
	        <h1>jquery的ajax与后端交互</h1><p/> 
	        <!--一般不会在vue中使用jQuery的ajax发送请求,很多功能用不到-->
	        <h4>username: {{username}}</h4>
	        <h4>age:{{age}}</h4>
	        <button @click="clicksubmit1">点击获取数据</button>
	
	        <p/>
	        <hr>
	        <h1>JS的fetch与后端交互</h1>
	        <!--提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分-->
	        <h4>username: {{username}}</h4>
	        <h4>age:{{age}}</h4>
	        <button @click="clicksubmit2">点击获取数据</button>
	
	        <p/>
	        <hr>
	        <h1>axios与后端交互</h1>
	        <!--第三方ajax,只有ajax没有别的功能,很小,底层基于XMLHttprequest-->
	        <h4>username: {{username}}</h4>
	        <h4>age:{{age}}</h4>
	        <button @click="clicksubmit3">点击获取数据</button>
	    </div>
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                username:'',
	                age:'',
	            },
	            methods:{
	                //方式1:jQuery的ajax方式
	                clicksubmit1(){
	                    //向后端发送请求,拿到数据,赋值给username、age
	                    
	                    $.ajax({
	                        url:'http://127.0.0.1:8000/submit/',
	                        method:'get',
	                        success:data=>{
	                            console.log(typeof data)
	                            this.username=data.username
	                            this.age=data.age
	                        }
	                    })
	                },
	
	                //方式2:原生js(fetch)发送请求
	                clicksubmit2(){
	                    //向后端发送请求,拿到数据,赋值给username、age
	                    // fetch('http://127.0.0.1:8000/submit/')
	                    //     .then(function(response){
	                    //         return response.json();
	                    //     })
	                    //     .then(function(data){
	                    //         console.log(data);
	                    //     });
	
	                    //箭头函数
	                    fetch('http://127.0.0.1:8000/submit/')
	                        .then(response=>{
	                            return response.json();
	                        })
	                        .then(data=>{
	                            this.username=data.username
	                            this.age=data.age
	                        });
	                },
	
	                
	                //方式3:axios
	                clicksubmit3(){
	                    //向后端发送请求,拿到数据,赋值给username、age
	                    axios.get('http://127.0.0.1:8000/submit/')
	                        .then(result => {
	                            console.log(result.data);
	                            this.username=result.data.username
	                            this.age=result.data.age
	                        }).catch(error => {
	                            console.log(error);
	                        });
	                }
	
	            }
	
	        })
	    </script>
	</body>
	</html>

在这里插入图片描述


跨域问题详解

前端发送ajax请求,后端会有跨域的拦截,原因是:同源策略。同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

	-请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.
	-发送ajax请求的地址,必须跟浏览器上的url地址处于同域上 域[域名,地址,端口,协议]
	-请求成功,数据库返回,但是浏览器拦截
	
	
	# 补充:浏览器中输入域名,没有加端口
	-www.baidu.com---->dns--->解析成地址  192.168.2.3----》没有加端口,默认是80
    -dns解析,先找本地的host文件
    	-可以修改本地的host做映射

如何解决跨域问题?

1-CORS:后端代码控制,上面案例采用的方式

	# cors:    #xss,csrf---跨站请求伪造
	跨域资源共享:后端技术,就是在响应头中加入 固定的头,就会运行前端访问了
    
	'CORS基本流程'
	1.浏览器发出CORS简单请求
		只需要在头信息之中增加一个Origin字段。
		
	2.浏览器发出CORS非简单请求
		会在正式通信之前,增加一次HTTP查询请求,称为”预检”请求(preflight)。
		浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,
		以及可以使用哪些HTTP动词和头信息字段。
		只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。


	'什么是简单请求,什么是非简单请求'
		# 符合如下条件,就是简单请求1) 请求方法是以下三种方法之一:
	        HEAD
	        GET
	        POST
	    (2)HTTP的头信息不超出以下几种字段:
	        Accept
	        Accept-Language
	        Content-Language
	        Last-Event-ID
	        Content-Type:只限于三个值application/x-www-form-urlencoded、
	        			multipart/form-data、text/plain
	        
	'演示简单和非简单请求'
		-如果是简单,直接发送真正的请求
	    -如果是非简单,先发送options,如果运行,再发真正的
1) 方式一:后端添加请求头
	# 前端发送axios不添加请求头---简单请求
	  created() {
	    this.$axios.get(this.$settings.BASE_URL+ '/home/banner/').then(res=>{
	      console.log(res)
	    })
	  },
    
	 # 允许的前端地址
	 return APIResponse(data=res.data, headers={
	 "Access-Control-Allow-Origin": "http://192.168.1.47:8080"})  # {code:100,msg:成功,data=[{},{}]}
	# 允许所有前端地址
	return APIResponse(data=res.data,headers={'Access-Control-Allow-Origin':'*'})  # {code:100,msg:成功,data=[{},{}]}
2) 方式二:编写中间件

解决跨域问题和请求头携带数据

	# 1.重写process_response方法
	from django.utils.deprecation import MiddlewareMixin
	class CorsMiddleWare(MiddlewareMixin):
	    def process_response(self, request, response):
	        if request.method == 'OPTIONS':  # 解决非简单请求的请求头
	            response["Access-Control-Allow-Headers"] = "*"
	        # 允许前端的地址,所有请求头允许
	        response["Access-Control-Allow-Origin"] = "*"
	        return response
	    
	# 2. 注册中间件
	MIDDLEWARE = [
	    'utils.common_middle.CorsMiddleWare'
	]
3) 方式三:第三方模块django-cors-headers
	# 第一步:安装
	pip install django-cors-headers
	# 第二步:配置app
	    INSTALLED_APPS = [
	        'corsheaders'
	    ]
	
	# 第三步:配置中间件
	    MIDDLEWARE = [
	        'corsheaders.middleware.CorsMiddleware',
	    ]
	# 第四步:在配置文件配置
	# 允许所有域
	CORS_ORIGIN_ALLOW_ALL = True
	# 允许的请求方式
	CORS_ALLOW_METHODS = (
		'DELETE',
		'GET',
		'OPTIONS',
		'PATCH',
		'POST',
		'PUT',
		'VIEW',
	)
	# 允许请求头中加的东西
	CORS_ALLOW_HEADERS = (
		'XMLHttpRequest',
		'X_FILENAME',
		'accept-encoding',
		'authorization',
		'content-type',
		'dnt',
		'origin',
		'user-agent',
		'x-csrftoken',
		'x-requested-with',
		'Pragma',
		'token',
	)

2-Nginx反向代理 (常用)

3-JSONP:很老不会用了,它只能发get请求

4-搭建Node代理服务器


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

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

相关文章

前端下载文件问题之如何获取报错信息

问题&#xff1a;点击下载后。接口会生成并返回文件流。在极端情况下接口数据返回异常&#xff0c;需要抛出错误信息&#xff0c;比如后端拼接错误情况、空文件情况。 难点&#xff1a;responseType设置为Blob后&#xff0c;返回内容为二进制文件流&#xff0c;从而无法获取错误…

抓包神技--DPDK

DPDK&#xff0c;全称Data Plane Development Kit&#xff0c;是一个高性能的数据包处理工具集。估计有不少朋友使用过或者之前了解过&#xff0c;它通过绕过Linux内核协议栈&#xff0c;直接在用户空间进行数据包处理&#xff0c;大大提高了数据包处理的效率和吞吐量。 DPDK主…

软件测试|MySQL ORDER BY详解:排序查询的利器

简介 在数据库中&#xff0c;我们经常需要对查询结果进行排序&#xff0c;以便更好地展示数据或满足特定的业务需求。MySQL提供了ORDER BY子句&#xff0c;使我们能够轻松地对查询结果进行排序。本文将详细介绍MySQL ORDER BY的用法和示例&#xff0c;帮助大家更好地理解和应用…

旋变检测AD2s1205手册学习笔记

旋变故障检测故障表 信号丢失检测 检测原理&#xff1a;任一旋变输入(正弦或余弦)降至指定的LOS正弦/余弦阈值 以下时&#xff0c;器件会检测到信号丢失(LOS)。AD2S1205通过将 监视信号与固定最小值进行比较检测此点 丢失的效果表现&#xff1a;LOS由DOS和LOT引脚均闩锁为逻辑…

Linux系统下gitee使用git提交代码

Linux系统下gitee使用git提交代码 一、安装配置git1.1 在 Linux 中安装 git&#xff0c;并生成授信证书1.2 将SSH key 添加到 ssh-agent1.2 将SSH key 添加到你的gitee账户 二、gitee 的使用2.1 下载项目到本地 三、上传gitee三步走3.1 三板斧第一招&#xff1a;git add3.2 三板…

vivado 导入工程、TCL创建工程命令、

导入外部项目 您可以使用导入在Vivado IDE外部创建的现有RTL级项目文件Synopsys Synplify。Vivado IDE检测项目中的源文件并自动添加文件到新项目。设置&#xff0c;如顶部模块、目标设备和VHDL库 分配是从现有项目导入的。 1.按照创建项目中的步骤进行操作。 2.在“项目类…

MySQL语法及IDEA使用MySQL大全

在项目中我们时常需要写SQL语句&#xff0c;或简单的使用注解直接开发&#xff0c;或使用XML进行动态SQL之类的相对困难的SQL&#xff0c;并在IDEA中操控我们的SQL&#xff0c;但网上大都图方便或者觉得太简单了&#xff0c;完全没一个涵盖两个方面的讲解。 单表&#xff1a; …

对比fwrite、mmap、DirectIO 的内存、性能开销,剖析 Page Cache

背景 如上图所示&#xff1a;应用程序写文件有三种形式。 fwrite : 应用程序 -> fwrite(Buffered IO) -> File System -> Page Cache -> Block IO Layer -> Device & Disk etc.mmap : 应用程序 -> mmap -> Page Cache -> Block IO Layer -> De…

NNDL总结

第四章 前馈神经网络 4.1 神经元 人工神经元&#xff0c;简称神经元&#xff0c;是构成神经网络的基本单元。 当>0时&#xff0c;为1&#xff0c;兴奋&#xff1b; 当<0时&#xff0c;为0&#xff0c;抑制。 激活函数的性质 1、连续可导的非线性函数。 2、激活函数及其导…

Java中的输入输出处理(一)

文件 文件&#xff1a;文件是放在一起的数据的集合。比如1.TXT。 存储地方&#xff1a;文件一般存储在硬盘&#xff0c;CD里比如D盘 如何访问文件属性&#xff1a;我们可以通过java.io.File类对其处理 File类 常用方法&#xff1a; 方法名称说明boolean exists()判断文件或目…

mysql原理--事务

1.事务的起源 对于大部分程序员来说&#xff0c;他们的任务就是把现实世界的业务场景映射到数据库世界。比如银行为了存储人们的账户信息会建立一个 account 表&#xff1a; CREATE TABLE account (id INT NOT NULL AUTO_INCREMENT COMMENT 自增id,name VARCHAR(100) COMMENT …

这些开源自动化测试框架,会用等于白嫖一个w

作者&#xff1a;黑马测试 链接&#xff1a;https://www.zhihu.com/question/19923336/answer/2585952461 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 随着计算机技术人员的大量增加&#xff0c;通过编写代码来…

C#上位机快速开发笔记

1.下载vs2012版本&#xff0c;安装密钥解除 #微信文章教程有详细描述&#xff0c;公众号“软件安装管家目录” 2.新建工程 3.界面模块介绍 3.资源管理器 3.1 图标修改位置 3.2 软件版本信息文件介绍 4.常用工具箱控件 1. Button按钮 #按键函数代码&#xff0c;按下按…

【Python排序算法系列】—— 希尔排序

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 希尔排序 &#xff08;ShellSort&#xff09; 由来和特点 理解 过程演示 Step1&#xff1a;…

GO语言笔记3-指针

指针的概念 先看一段代码的输出 package main import "fmt" func main(){ var age int 18fmt.Println("age的内存地址值是:",&age)//age的内存地址值是: 0xc000012090// 定义一个指针变量// *int 是一个指针类型&#xff0c;可以理解为指向int类型的…

Native组件Widget

demo下载路径 gitgithub.com:haijun-suyan/ReminderWidget.git 注意&#xff1a; 组件开发 SwiftUI 添加链接描述

鼠标随动指定区域高亮显示(Excel聚光灯)

实例需求&#xff1a;工作表中数据表实现跟随鼠标选中高亮效果&#xff0c;需要注意如下几个细节需求 数据表为连续区域&#xff0c;但是不一定从A1单元格开始数据表的前两行&#xff08;标题行&#xff09;不使用高亮效果数据表中已经应用了条件格式&#xff0c;高亮显示取消…

0109作业

1> 思维导图 2> 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin&quo…

静态网页设计——多彩贵州(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1cK411v7R2/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

【漏洞复现】锐捷RG-UAC统一上网行为管理系统信息泄露漏洞

Nx01 产品简介 锐捷网络成立于2000年1月&#xff0c;原名实达网络&#xff0c;2003年更名&#xff0c;自成立以来&#xff0c;一直扎根行业&#xff0c;深入场景进行解决方案设计和创新&#xff0c;并利用云计算、SDN、移动互联、大数据、物联网、AI等新技术为各行业用户提供场…