首页 > 其他分享 >Vue 中的Ajax

Vue 中的Ajax

时间:2024-07-01 19:20:19浏览次数:14  
标签:slot Vue 请求 插槽 代理服务器 Ajax 组件 localhost

Vue 中的Ajax

配置代理

发送ajax请求的方式:

1.xhr new XMLHttpRequest()

  • xhr.open() 配置请求信息

  • xhr.send() 发送请求

  • 虽是鼻祖,但很麻烦,一般对其进行二次封装

2.jQuery

  • $.get

  • $.post

  • jQuery的核心是 DOM操作,在vue等框架中不常使用

3.axios

  • 与jQuery相比的优势是 promise风格

  • 支持请求拦截器和响应拦截器

  • 体积小

4.fetch

  • jQuery和axios 都是对xhr的封装,fetch是与xhr平级

  • 是 promise风格

  • 会包两层 promise

  • 兼容性较差

 

下面解决 ajax 请求跨域问题

<template>
  <div>
    <button @click="sendRequest">点击发送请求</button>
  </div>
</template>
​
<script>
import axios from "axios";
export default {
    name:'App',
    methods:{
      sendRequest(){
        axios.get('http://localhost:5000/students').then(
            response =>{
              console.log("请求成功,", response.data)
            },
            error =>{
              console.log("请求失败",error.message)
            }
        )
      }
    }
}
</script>

上面是没有解决跨域问题

image-20240627184009190

结果是请求失败

所谓跨域就是违背了同源策略

同源策略规定 协议名、主机名、端口号必须一致

目前的情况是 http://localhost:8080http://localhost:5002 发送请求,所以跨域了

请求也发了,服务器也回应了,但是浏览器发现跨域后,没有把数据返回

如何解决?

  1. 用 cors,服务器返回的时候携带了一些特殊的响应头,所以能收到发来的数据

  2. 用 jsonp,借助了script标签里面的src 属性在引入外部资源时不受同源限制 来解决的,只能解决get请求

  3. 配置一台代理服务器,代理服务器和主机所处的端口相同,主机想要访问数据时,直接向代理服务器发送请求,代理服务器再向服务器请求

    代理服务器和服务器打交道不用ajax请求

开启代理服务器的方法

  • nginx

  • vue-cli

在vue.config.js 文件中配置

//   开启代理服务器
devServer:{
    proxy:'http://localhost:5002'
}

在请求时 请求8080端口

axios.get('http://localhost:8080/students').then(
    response =>{
      console.log("请求成功,", response.data)
    },
    error =>{
      console.log("请求失败",error.message)
    }
)

这时就可以请求到数据了

当你请求的资源本身就有,就不会转发给5002服务器了

用这种方式不能配置多个代理,并且不能灵活控制是否向服务器发送请求

还有第二种方式配置代理服务器,能够解决配置多个服务器,并且可以控制是否发送请求

//     方式二
  devServer:{
    proxy:{
      '/api':{
        target:'http://localhost:5002',
        pathRewrite:{'^/api' : ''},
        ws:true,     //用于支持websocket
        changeOrigin:true   //用于控制请求中的host值
      },
      '/api1':{
        target:'http://localhost:5001',
        pathRewrite:{'^/api' : ''},
        ws:true,     //用于支持websocket
        changeOrigin:true   //用于控制请求中的host值
      }
    }
  }

./api 代表的是除了 协议名主机名端口号之外的前缀,只要你的请求中带有这个前缀那么就走代理服务器,向服务器发送请求,请求的服务器地址是 target

这里有个问题,你的请求中是带有 ./api前缀的,那么请求到服务器也会有这个前缀,所以会报找不到资源

这时用 pathRewrite 将前缀替换成 空字符串即可

changeOrigin 如果是 true,那么服务器收到的请求的host 就是服务器的host,否则就是8080,默认值是true

axios.get('http://localhost:8080/api/students').then(
    response =>{
      console.log("请求成功,", response.data)
    },
    error =>{
      console.log("请求失败",error.message)
    }
)

请求时的路径要带前缀 /api

 

插槽

默认插槽

插槽可以动态地将不同的模板插入到指定的位置

下面用一个分类案例引入插槽

一开始是三个分类,分类中是 一个列表,展示每个分类的具体内容

<template>
  <div class="container">
    <Category title="美食" :listData="food"/>
    <Category title="游戏" :listData="game"/>
    <Category title="影视" :listData="movie"/>
  </div>
</template>

在App组件中引入定义的 Category 组件,传入数据

<template>
  <div class="category">
    <h3>{{title}}分类</h3>
    <ul>
      <li v-for="(item,index) in listData" :key="index">{{item}}</li>
    </ul>
  </div>
</template>

在 Category 组件的模板中,定义有一个标题和列表,效果如图

image-20240630114933801

现在的需求改变了,想让 美食分类中只展示一张图片,影视分类展示一段视频,游戏分类不变,这时就用到插槽

首先在Category 组件中,把原先的列表删除,取而代之的是 <slot> 标签,标签里面是默认内容

<template>
  <div class="category">
    <h3>{{title}}分类</h3>
    <slot>默认内容,什么都不传就会展示</slot>
  </div>
</template>

然后在引入 Category 的地方,在 Category 组件标签里添加标签体内容,内容就是想要展示的内容

<template>
  <div class="container">
    <Category title="美食" :listData="food">
      <img src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg">
    </Category>
    <Category title="游戏" :listData="game">
      <ul>
        <li v-for="(item,index) in game" :key="index">{{item}}</li>
      </ul>
    </Category>
    <Category title="影视" :listData="movie">
      <video controls src="https://haokan.baidu.com/v?vid=18035948914920602112&tab=recommend"></video>
    </Category>
  </div>
</template>

slot 标签就是在Category 标签中占个位,等待去填充

image-20240630120703302

具名插槽

具名插槽就是拥有名字的插槽,可以指定什么内容往哪个插槽里放

如果想要在内容下面再追加一些内容的话,可以再定义一个插槽,这时存在的两个插槽就要给他们定义名字,否则就会把模板往这两个插槽中放两份

<template>
  <div class="category">
    <h3>{{title}}分类</h3>
    <slot name="center">1默认内容,什么都不传就会展示</slot>
    <slot name="footer">2默认内容,什么都不传就会展示</slot>
  </div>
</template>

用name属性去定义 slot的名字

在使用组件的地方使用 slot 属性指定往哪个插槽中插入

<Category title="美食" :listData="food">
  <img slot="center" src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg">
  <a slot="footer" src="www.baidu.com">跳转到百度</a>
</Category>

指定slot 的时候 还有另外一种写法

就是 用 v-slot:center 用 v-slot 直接绑定某个插槽的名字

这种写法只能使用于 template 标签

 

作用域插槽

当数据在组件定义的地方,而组件的结构是由组件使用者来决定的,那么组件的使用者在使用组件时就获取不到组件中的数据,这时可以用作用域插槽

在组件定义的地方,也就是用 slot标签占位的地方,把数据给组件使用者传递过去

<template>
  <div class="category">
    <h3>{{title}}分类</h3>
    <slot :games="game">1默认内容,什么都不传就会展示</slot>
  </div>
</template>

在使用组件的地方,用scope 或 slot-scope 接收,这里需要注意 必须在template 标签中写这两个属性

属性值可以随意起,它接收到的是一个对象,里面就有组件传递过来的数据

<template>
  <div class="container">
    <Category title="游戏">
      <template scope="appGame">
        <ul>
          <li v-for="(item,index) in appGame.games" :key="index">{{item}}</li>
        </ul>
      </template>
    </Category>
    <Category title="游戏" >
      <template scope="appGame">
        <ol>
          <li v-for="(item,index) in appGame.games" :key="index">{{item}}</li>
        </ol>
      </template>
    </Category>
    <Category title="游戏">
      <template scope="appGame">
        <h4>
          <li v-for="(item,index) in appGame.games" :key="index">{{item}}</li>
        </h4>
      </template>
    </Category>
  </div>
</template>

 

总结

作用:让父组件可以向子组件指定位置插入html结构,也是组件间通信的方式

标签:slot,Vue,请求,插槽,代理服务器,Ajax,组件,localhost
From: https://www.cnblogs.com/wztblogs/p/18278672

相关文章

  • Vue Ant Design中a-tree组件支持点击父节点名称(title\label)所有子节点选中
    核心代码<a-treeref="treeRef"class="draggable-tree"v-if="treeData.length":tree-data="treeData"......
  • 记一次vue脚手架打包生成的js里面变量逻辑错误的解决
    问题背景开发环境调用threejs,实现3d功能组件,开发环境测试正常,打包部署到现场后异常。浏览器控制台,报变量i和r,没有定义下图是点击报错地方打开的控制台截图。可以看到有ir变量。解决思路开发调试没有问题,那肯定是打包之后命名的变量存在不正确的逻辑了。肯定不能修改dis......
  • 自定义vue3 hooks
    文章目录hooks目录结构demohooks当页面内有很多的功能,js代码太多,不好维护,可以每个功能都有写一个js或者ts,这样的话,代码易读,并且容易维护,组合式setup写法与此结合......
  • 一个项目学习Vue3---Vue模板方法
     内容资源下载:关注公众号(资小库),下载相关资源分析下面一段代码,学习模板方法的可能的知识<template><div><div>将下面的msg属性放到上面来:{{msg}}</div><divv-html="htmlMsg"></div><divv-bind="id">这个地方绑定了一个ID{{id}}</div>......
  • 使用Vue 3和Axios从第三方API获取异步数据并展示
    在前端开发中,从第三方API获取数据并动态展示是非常常见且重要的需求之一。今天我们将深入探讨如何使用Vue3和Axios从第三方API获取异步数据并将其展示在页面上。通过这个例子,你将了解如何在Vue3中集成Axios,如何进行异步请求,以及如何动态地将数据绑定到模板以实......
  • Vue整合echarts
    npm安装echartsnpminstallecharts-S安装好之后在<script>引入echartsimport*asechartsfrom'echarts'在template标签中引用<divid="main"style="width:100%;height:400px;">/div>在exportdefault中创建mounted页面元素渲染之后再触发完整V......
  • vue-element-admin搭建步骤
    克隆项目gitclonehttps://github.com/PanJiaChen/vue-admin-template.git进入项目目录cdvue-admin-template安装依赖npminstall--registry=https://registry.npm.taobao.org启动服务npmrundev浏览器访问 http://localhost:9528发布构建测试环境npmrun......
  • springboot+vue前后端分离项目-vue项目搭建6-文件上传下载
    1.新增com/example/demo/controller/FileController.javapackagecom.example.demo.controller;importcn.hutool.core.io.FileUtil;importcn.hutool.core.util.IdUtil;importcn.hutool.core.util.StrUtil;importcom.example.demo.common.Result;importjakarta.ser......
  • 若依RuoYi-Vue分离版—PageHelper分页的坑
    若依RuoYi-Vue分离版—PageHelper分页的坑(一)读取分页属性(pageNum、pageSize)只支持Parameter对象(二)PageHelper分页本身的使用方式的坑(一)读取分页属性(pageNum、pageSize)只支持Parameter对象若依中的PageHelper的分页读取只支持get请求的Parameter对象例如:http://local......
  • uni-app编译错误:“hasInjectionContext“ is not exported by “node_modules/.pnpm/p
    1.问题背景当我们接手一个新的uni-app项目(最头疼了x_x),可能会想到删掉node_modules和pnpm-lock.yaml后,执行npminstall或npminstall重新安装依赖包,然后执行pnpmdev:mp-weixin编译,但可能会遇到如下错误:"hasInjectionContext"isnotexportedby"node_modul......