Vue-Ajax核心知识整理

在Vue框架中可以有很多方式实现 ajax, 其中有xhr、jQuery、fetch、axios、vue-resource, 其中Vue的作者尤雨溪推荐使用axios,所以在使用Vue框架时,尽量还是使用axios

但是当我们使用ajax时,经常会遇到跨域的问题,比如你本地的端口号是8080, 而服务器的端口号是5050,当你向服务器请求数据时,就会存在跨域的问题。

跨域也有很多的解决方案:

【1】cors方法:不需要前端人员操作,只需要后端人员在写服务器的时候,给你返回响应的时候,会加几个特殊的响应头;

【2】jsonp: 需要后端人员和前端人员都进行相应的操作,不常用  <script src=""></script> 只能解决 GET 请求的跨域问题,其它的请求方式解决不了。

【3】代理 proxy: 在Vue框架中经常使用

因为服务器和服务器之间的数据传输并不是用的ajax,仅仅用的是http,所以不存在跨域的问题,这样本地端口向代理服务器发起请求,而代理服务器目标服务器请求,这样就解决了跨域问题。

1 配置代理服务器

在vue.config.js 中配置

  // 1. 开启代理服务器,解决跨域问题(方式一)devServer: {proxy: 'http://localhost:5000'  // 需要转发的服务器的端口},// 2.开启代理服务器(方式二)devServer: {proxy: {'/api': {   // /api为请求前缀,想要走代理,就在请求的地址前面加上/api,前缀可以根据需要更改target: '<url>',  // <url> 为请求的目标地址,比如:http://localhost:5000pathRewrite: {'^/api': ''  // 去掉请求路径中的/api},ws: true,  // 用于支持websocketchangeOrigin: true   // 用于控制请求头中host值},// 配置多个'/api2': {   // /api为请求前缀,想要走代理,就在请求的地址前面加上/api,前缀可以根据需要更改target: '<url>',  // <url> 为请求的目标地址,比如:http://localhost:5000pathRewrite: {'^/api': ''  // 去掉请求路径中的/api},ws: true,  // 用于支持websocketchangeOrigin: true   // 用于控制请求头中host值}, // 配置多个...// '/foo': {//   target: '<other_url>'// }}}

 

建议使用方式2,可以配置多个代理服务器,还有一个问题就是当请求的资源本地有时,会优先读取本地得信息,不会走代理,这样就不会读取到服务器中真实的信息。所以如果想要指定走代理的话,需要指定请求前缀

2 请求github数据案例

【List组件】

<template><div class="row"><!-- 展示用户列表 --><div class="card" v-show="info.users.length" v-for="user in info.users" :key="user.login"><a :href="user.html_url" target="_blank"><img :src="user.avatar_url" style='width: 100px'/></a><p class="card-text">{{user.login}}</p></div><!-- 展示欢迎词 --><h1 v-show="info.isFirst">欢迎使用Github用户搜索</h1><!-- 展示加载中 --><h1 v-show="info.isLoading">加载中...</h1><!-- 展示错误信息 --><h1 v-show="info.errMsg">{{ info.errMsg }}</h1></div>
</template><script>export default {name: 'List',data() {return {info: {isFirst: true,isLoading: false,errMsg: '',users: []}}},mounted() {this.$bus.$on('updateUsers', (dataObj) => {this.info = {...this.info, ...dataObj}  // 重名的属性以后面的为主,后面没有的就用前面的})},}
</script><style scoped>.album {min-height: 50rem; /* Can be removed; just added for demo purposes */padding-top: 3rem;padding-bottom: 3rem;background-color: #f7f7f7;}.card {float: left;width: 33.333%;padding: .75rem;margin-bottom: 2rem;border: 1px solid #efefef;text-align: center;}.card > img {margin-bottom: .75rem;border-radius: 100px;}.card-text {font-size: 85%;}
</style>

【Search组件】

<template><div><section class="jumbotron"><h3 class="jumbotron-heading">Search Github Users</h3><div><input type="text" v-model="keyWord" placeholder="enter the name you search"/>&nbsp;<button @click="search">Search</button></div></section></div>
</template><script>import axios from 'axios'export default {name: 'Search',data() {return {keyWord: ''}},methods: {search() {/* 请求前更新List数据 */this.$bus.$emit('updateUsers', { isFirst: false, isLoading: true, errMsg: '', users: []})axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then(response => {console.log('请求成功了', response.data.items)/* 请求成功后更新List数据 */this.$bus.$emit('updateUsers', { isLoading: false, errMsg: '', users: response.data.items})},error => {console.log('请求失败了', error.message)/* 请求失败后更新List数据 */this.$bus.$emit('updateUsers', { isLoading: false, errMsg: error.message, users: []})})}},}
</script><style></style>

【App组件】

<template><div class="container"><Search/><List/></div></template><script>import List from './components/List.vue'import Search from './components/Search.vue'export default {name:'App',components:{List,Search},}
</script>

3 插槽

3.1 默认插槽

【App组件】

<template><div class="container"><Category title="美食" :listData="foods"><img src="./assets/imgs/girl6.jpg" alt="" id="pg1"></Category><Category title="游戏" :listData="games"><ul><li v-for="(item,index) in games" :key="index">{{item}}</li></ul></Category><Category title="电影" :listData="films"><img src="./assets/imgs/girl3.jpg" alt="" id="pg1"></Category></div></template><script>import Category from './components/Category.vue'export default {name:'App',components:{Category,},data() {return {foods:['火锅','烧烤','小龙虾','牛排'],games:['红色警戒','穿越火线','劲舞团','超级玛丽'],films:['《教父》','《拆弹专家》','《你好,李焕英》']}},}
</script><style scoped>.container {display: flex;justify-content: space-around;}#pg1 {width: 100%;}</style>

【Category组件】

<template><div class="category"><h1>{{title}}分类</h1><!-- 定义一个插槽 (默认插槽)--><slot></slot></div>
</template><script>export default {name: 'Category',// props: ['listData', 'title']props: ['title']}
</script><style>.category {margin-left: 100px;margin-top: 100px;;width: 200px;height: 300px;background-color: skyblue;border: 1px solid orange;}h1{text-align: center;background-color: pink;}</style>

3.2 具名插槽

【App组件】

<template><div class="container"><Category title="美食" :listData="foods"><img slot="slot1" src="./assets/imgs/girl6.jpg" alt="" id="pg1"><a slot="slot2" href="http://www.baidu.com">百度</a></Category><Category title="游戏" :listData="games"><ul slot="slot1"><li v-for="(item,index) in games" :key="index">{{item}}</li></ul><a slot="slot2" href="http://www.baidu.com">百度</a></Category><Category title="电影" :listData="films"><img slot="slot1" src="./assets/imgs/girl3.jpg" alt="" id="pg1"><!-- <a slot="slot2" href="http://www.baidu.com">百度</a><h4 slot="slot2">欢迎光临</h4> --><!-- 使用 template标签这种写法时,就可以使用另一种写法 v-slot: 指定放入的插槽了 --><template v-slot:slot2><a href="http://www.baidu.com">百度</a><h4>欢迎光临</h4></template></Category></div></template><script>import Category from './components/Category.vue'export default {name:'App',components:{Category,},data() {return {foods:['火锅','烧烤','小龙虾','牛排'],games:['红色警戒','穿越火线','劲舞团','超级玛丽'],films:['《教父》','《拆弹专家》','《你好,李焕英》']}},}
</script><style scoped>.container {display: flex;justify-content: space-around;}#pg1 {width: 100%;}</style>

【Category组件】

<template><div class="category"><h1>{{title}}分类</h1><!-- 定义一个插槽 (具名插槽)--><slot name="slot1">我是插槽1, 没有内容放入时,会显示</slot><slot name="slot2">我是插槽1, 没有内容放入时,会显示</slot></div>
</template><script>export default {name: 'Category',// props: ['listData', 'title']props: ['title']}
</script><style>.category {margin-left: 100px;margin-top: 100px;;width: 200px;height: 300px;background-color: skyblue;border: 1px solid orange;}h1{text-align: center;background-color: pink;}</style>

3.3 作用域插槽

【Category组件】

<template><div class="category"><h1>{{title}}分类</h1><!-- 定义一个插槽 (作用域插槽)--><slot :games="games" :msg="msg">我是插槽1, 没有内容放入时,会显示</slot>  <!-- games传递给插槽的使用者 --></div>
</template><script>export default {name: 'Category',// props: ['listData', 'title']props: ['title'],data() {return {games:['红色警戒','穿越火线','劲舞团','超级玛丽'],msg:'你好啊'}},}
</script><style>.category {margin-left: 100px;margin-top: 100px;;width: 200px;height: 300px;background-color: skyblue;border: 1px solid orange;}h1{text-align: center;background-color: pink;}</style>


【App组件】

<template><div class="container"><Category title="游戏"><template scope="data"><ul><li v-for="(item,index) in data.games" :key="index">{{item}}</li></ul></template></Category><Category title="游戏"><!-- 解构赋值的写法 --><!-- 也可以使用 slot-scope="{games, msg}" --><template scope="{games, msg}"><ol><li v-for="(item,index) in games" :key="index" style="color:red">{{item}}</li></ol><h4>{{msg}}</h4></template></Category><Category title="游戏"><template scope="data"><h3><li v-for="(item,index) in data.games" :key="index">{{item}}</li></h3></template></Category></div></template><script>import Category from './components/Category.vue'export default {name:'App',components:{Category,},  }
</script><style scoped>.container {display: flex;justify-content: space-around;}
</style>

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

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

相关文章

MySQL中的高级查询

通过条件查询可以查询到符合条件的数据&#xff0c;但如同要实现对字段的值进行计算、根据一个或多个字段对查询结果进行分组等操作时&#xff0c;就需要使用更高级的查询&#xff0c;MySQL提供了聚合函数、分组查询、排序查询、限量查询、内置函数以实现更复杂的查询需求。接下…

15.一种坍缩式的简单——组合模式详解

当曾经的孩子们慢慢步入社会才知道&#xff0c;那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来&#xff0c;瞻前顾后&#xff0c;怅然若失。 也允许你在寂静的街道上屏气凝神&#xff0c;倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…

正则表达式的一些高级用法

不允许出现某个单词&#xff0c;使用?! (?!Pattern).\.matches 表示.matches之前的不能是Pattern非贪婪匹配&#xff0c;在匹配项后加? matches\((.*?)\) 这里在.*后加问号&#xff0c;表示尽可能少的匹配。\w表示字母、数字和下划线防范redos攻击&#xff0c;可使用Cyber-…

汽车研发与制造中英文对照

1、技术开发概念和定义 FPDS&#xff08;Ford Product Development System&#xff09;福特产品开发系统 threetype chassis 三类底盘 inter-citybus 长途客车 PassengerVehicle 乘用车 MPV&#xff08;Multi-PurposeVehicle&#xff09;多用途汽车 SUV&#xff08;Sports Uti…

【Flink精讲】Flink内核源码分析:命令执行入口

官方推荐per-job模式&#xff0c;一个job一个集群&#xff0c;提交时yarn才分配集群资源&#xff1b; 主要的进程&#xff1a;JobManager、TaskManager、Client 提交命令&#xff1a;bin/flink run -t yarn-per-job /opt/module/flink-1.12.0/examples/streaming/SocketWind…

Unity—JSON

每日一句&#xff1a;手简素中&#xff0c;感生活恬淡&#xff0c;心有所期&#xff0c;忙而不茫 目录 服务器 常见的服务器语言 Unity的开发语言 JSON 功能&#xff1a; JSON最简单的格式 JSON工具 支持的数据结构&#xff08;C#对于JSON&#xff09; 字符含义 JSON…

单片机stm32智能鱼缸

随着我国经济的快速发展而给人们带来了富足的生活&#xff0c;也有越来越多的人们开始养鱼&#xff0c;通过养各种鱼类来美化居住环境和缓解压力。但是在鱼类饲养过程中&#xff0c;常常由于鱼类对水质、水位及光照强度有着很高的要求&#xff0c;而人们也由于工作的方面而无法…

强化学习入门(Matlab2021b)-创建环境【3】

目录 1 前言2 根据类模板创建自定义环境2.1 创建类模板2.2 Environment properties(环境特性)2.3 Required Functions(需要的环境方法)2.3.1 Constructor function(构造函数)2.3.2 reset function2.3.3 step function2.4 Optional Functions(可选的环境方法)2.5 Environment Vi…

mysql升级到8后关键字变化导致mybatisplus问题解决方案

问题描述 因为mysql8新增了一些关键字,项目中正好用到了mysql8的关键字,导致查询报错 直接上解决方案 最简答的方案 直接在实体类属性上添加注解 示例 TableField(value "remarks") value的值是数据库字段名 ,两边拼接上"" 所有方案 #建议直接用第一…

2023年12月CCF-GESP编程能力等级认证C++编程四级真题解析

一、单选题(共15题,共30分) 第1题 下面有关函数参数的说法,正确的是( )。 A:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。 B:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子…

jvm垃圾收集器-三色标记算法

1.对象已死吗? 在堆里面存放着Java世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“存活”着&#xff0c;哪些已经“死去”&#xff08;即不可能再被任何途径使用的对象). 引计数法 引用计数算法是一…

【快速搞定Webpack5】基本配置及开发模式介绍(二)

在开始使用webpack之前么&#xff0c;我们需要对Webpack的配置有一定的认识。 一、5大核心概念 1. enty&#xff08;入口&#xff09; 指示webpack从哪个文件开始打包 2. output&#xff08;输出&#xff09; 指示webpack打包完的文件输出到哪里去&#xff0c;如何命名等 …

适配器模式:转换接口,无缝对接不同系统

文章目录 **一、技术背景与应用场景****为什么使用适配器模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、适配器模式定义与结构****三、使用步骤举例****四、优缺点分析****总结** 一、技术背景与应用场景 适配器模式在软件设计中扮演着桥梁角色&#xff…

Linux(五)__系统管理

介绍 通常&#xff0c; Windows 中使用"任务管理器"主要有 3 个目的&#xff1a; 利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程&#xff1b;利用"性能"和"用户"标签来判断服务器的健康状态&#xff1…

前端构造树算法优化

背景 开发过程中遇到后台返回的平铺数据&#xff0c;需要自己根据数据的parent_id将其构造成一套树结构&#xff0c;首先采用递归的方式对数据进行组装。 但后续使用中发现&#xff0c;如果遇到数据量较大(40000)后&#xff0c;该方法的处理耗时明显过长&#xff0c;且导致页面…

怎样重置ubuntu mysql8密码

密码很难记住&#xff0c;所以如果您忘记了 MySQL root 密码&#xff0c;幸运的是&#xff0c;有一种方法可以更改它。这篇文章是为您而写的&#xff0c;在这篇文章结束时&#xff0c;您将成功更改 MySQL 的密码。 本博客演示了如何在 Ubuntu 上重置使用包管理器安装的 MySQL …

vue项目调用摄像头实现拍照功能

目录 1.功能需求 2.API 3.完整代码 4.效果 5.遇到问题 1.功能需求 需求:下面需求图 本来应该使用小程序做&#xff0c;但是为了以后复用考虑&#xff0c;决定使用vue嵌入小程序中。 所以需求就是 调用手机摄像头 实现拍照打卡功能&#xff08;电脑通用&#xff09; 2.API …

物联网平台构成与边缘计算

物联网平台 物联网平台系统通常由以下组件构成&#xff1a; 物联网设备&#xff1a; 这些是连接到物联网平台的传感器、设备或物品。它们可以是各种物联网设备&#xff0c;如传感器、执行器、智能设备等。 通信协议&#xff1a; 物联网设备使用各种通信协议与物联网平台进行通…

介绍一下scrapy中items.py,middlerwares.py,pipelines.py,settings.py的作用与简单示例。

在Scrapy框架中&#xff0c;items.py、middlewares.py、pipelines.py和settings.py都是用于实现不同功能的重要模块。以下是它们的作用和一些常见示例&#xff1a; items.py items.py 文件定义了你的项目中需要提取的数据的数据结构。每个爬虫项目都可以定义一个或多个Item类…

React 19即将发布,新增4个Hook函数

近日,React 团队发布消息称,不会载发布 v18.3版本了,而是即将重点放在React v19 版本。新版本将退出四个新的 hook——旨在解决 React 中两个常见的痛点:数据获取和表单处理。虽然这些 hook 目前作为实验性 API 在 React 预览版本中可用,但它们预计将成为 React 19 的稳定…