Vue Axios异步与数据类型转换问题浅析

目录
  • axios 请求中异步与否问题
  • 不使用异步的例子
  • 使用异步的例子
  • 对象与数组转换

axios 请求中异步与否问题

众所周知,axios 请求有些请求需要配合异步函数来实现,我大概总结了两种适配场景:

不使用异步:后端响应值对后续操作无影响,我们仅需要判断这个请求是否成功的情况下

使用异步:我们需要存储后端响应值并使用它进行某些渲染操作

不使用异步的例子

参考我们上一节的最后一块,我们抽离了登录校验的 axios 请求,这是具体代码

可见,我们只需要把本地 token 传递给后端,经过后端 jwt 验证并返回一个成功状态码 200,既然成功了,自然就会执行 then 内的方法,此时我们无需对响应体做出任何判断都可以明确的知道此次登录验证是成功的,所以直接返回一个布尔值 true 即可

这里就不需要使用到异步函数

validateLogin: (url, uname, pwd) => {
    // 使用post请求,请求体data即传入两个必要值
    http
      .post(url, {
        username: uname,
        password: pwd,
      })
      // 在then中处理请求成功的方法
      .then((res) => {
        console.log(res);
        let token = res.data.msg;
        localStorage.setItem("token", token);
        fastMessage.success("成功登录!");
      })
      // 在catch中处理请求失败的方法
      .catch((err) => {
        fastMessage.error("用户名或密码错误!");
        return false;
      });
    // 返回值有无取决于你的项目需求
    return true;
  },

使用异步的例子

一般的,在我们使用 axios 请求后端服务器时必定会有一小段往返时间,假设我们不使用异步函数,那么就会造成还没有取回响应体就直接返回了,那么必然会得到一个空值!

使用 try...catch... 代码块处理响应成功与否,因为 catch 能捕获到任意层次深度的任意错误,故 axios 请求一旦失败则必被捕获!

异步执行请求保证了我们获取的响应体值为后端数据,最后的 return 也能正确的返回带值变量

import http from "./http.js";
let userDatas;
// 异步函数,发送后端查询数据库得到所有用户信息
async function userDataQuery(url) {
  try {
    // 异步请求后端并拿到结构Promise
    let res = await http.get(url);
    // 将获取到的响应体中的值赋予给全局变量
    userDatas = res.data.data;
    console.log(userDatas);
  } catch (err) {
    console.log("这TMD是错的");
  }
  // 返回全局变量
  return userDatas;
}
export default {
  userDataQuery,
};

同志醒醒,这还没完,因为我们使用 async 构造异步函数,无论该函数返回啥,结果都是一个 promise 对象,我们只需要最后一步,对其进行数据提取并存储就完事了!!!

请看模块的 script 部分代码:

这里使用了 pinia 进行数据存储,setUsersList 是 actions 中的一个方法,它是用来设置 state 中的其中一个变量的值的,这一步操作下来即可把我们要的数据存储到 store 里面了!

因为变量 datas 已被 reactive 响应式,故 store 的更新也会带动该变量的更新,同时带动对应渲染的更新

import { onMounted, reactive, ref } from "vue";
import apiQuery from "../../api/api-query.js";
import dbStore from "../../store/db-store.js";
const store = dbStore();
let datas = reactive(store.$state.userLists);
// 执行最后一步的promise处理
apiQuery.userDataQuery("/sdb/allusers").then((res) => {
  // 调用store中的方法直接把数据存储到status域中的变量
  store.setUsersList(res);
  // 随意输出一些内容作为验证
  console.log(res);
});

对象与数组转换

执行异步 axios 请求时,对于 POST 类型的数据存储往往会遇到 formdata 是一个对象,而我们 vue 渲染时需要的偏偏就得是数组类型的

这一步可以在 store 中的 actions 配置的方法里面进行处理

此处简单的使用了 foreach 把对象内容一一压入数组的方式实现,请注意每次执行该方法是变量值的配置!!!

import { defineStore } from "pinia";
import Names from "./names.js";
const dbStore = defineStore(Names.DBSTORE, {
  // 随意配置一个数组变量userLists
  state: () => {
    return {
      userLists: [],
    };
  },
  actions: {
    // 设置变量的值,形参data即传来的对象object
    setUsersList(data) {
      // 转换前务必清空变量值,否则会造成值重复添加现象
      this.userLists = [];
      // foreach将对象中的值一个个取出来添加到数组里面
      for (let i in data) {
        console.log(data[i]);
        this.userLists.push(data[i]);
      }
    },
  },
  getters: {},
});
export default dbStore;

到此这篇关于Vue Axios异步与数据类型转换问题浅析的文章就介绍到这了,更多相关Vue Axios异步内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue异步axios获取的数据渲染到页面的方法

    我们在vue,数据很多事异步获取来的,如果在template直接使用,会报错,undefined. 因为先渲染后得到的数据,那如何才能不报错呢? computed!!! 举个例子 index.vue 忽略坑人的传参方式... created(){ this.init() this.axios.post('/wanwei/appserver/eqInfo/eqBaseInfo?reqjson={"eq_code":"BJTE1W03011SF001SBQDGPXTGYKG001

  • 在vue中通过axios异步使用echarts的方法

    现实的工作中, 数据不可能是像之前的demo演示的那样把数据写死的. 所有的数据都应该通过发送请求进行获取, 所以, 这篇文章, 我将在Vue项目中使用Echarts: 在Vue中引入Echarts中的数据提取出来, 放入到static/data.json文件中,请求该文件获取数据. 一. 实现异步加载数据 (一)引入vue-resource 通过npm下载axios //命令行中输入 npm install axios --save 在main.js中引入axios并注册 // main.js

  • Vue之Axios异步通信详解

    1.首先我们创建一个.json文件,作为交互使用,我们列举json数据格式模拟传递到前端来帮助小伙伴们理解. { "name": "咸鱼_翻身", "url": "https://blog.csdn.net/aaa123_456aaa", "page": 1, "address": { "street": "湘桥区", "city&quo

  • 解决vue跨域axios异步通信问题

    在项目中,常常需要从后端获取数据内容.特别是在前后端分离的时候,前端进行了工程化部署,跨域请求成了一个前端必备的技能点.好在解决方案很多. 在vue中,在开发中,当前使用较多的是axios进行跨域请求数据,但不少人遇到如下问题: •异步通信,无法同步执行 •无法集中管理 •不便阅读 •还未请求成功就调转了 •then里面的逻辑越来越繁杂 以往的网络请求的写法如下: // main.js // 引入axios import axios from 'axios' Vue.prototype.$axi

  • vuejs使用axios异步访问时用get和post的实例讲解

    script中. let data={....}; let url=xx; 方法各异: GET: this.$ajax.get(url,{ params:data }) .then(function (res) { console.log(res.data) }) .catch(function (error) { console.log(error) }) POST: 方法一:1. //请求后台数据之前转换入参 let url = xx; let data = { uname:this.una

  • Vue之Axios的异步请求问题详解

    目录 遇到的问题 总结 遇到的问题 在目前一个需求中,我需要等待axios请求完成后,判断请求是否出现异常,然后来判断是否关闭弹窗 修改后大概代码如下: async submitForm() { let flag = false //表单验证,默认通过 let formValidation = true this.$refs['vForm'].validate(valid => { if (!valid){ formValidation = false } //TODO: 提交表单 }) if

  • 如何在 Vue 中使用 Axios 异步请求API

    目录 设置基本 HTTP 请求 Axios 配合 async/await Axios 的错误处理 发送POST请求 用 Axios 编写可复用的 API 调用 最终代码 设置基本 HTTP 请求 首先在终端中执行下面的命令把 Axios 安装到项目中: install axiosnpm install axios 然后,在 Vue 组件中像这样导入axios. //App.vie - importing axios <script> import axios from 'axios' expo

  • Vue之Axios的异步通信详解

    目录 1.什么是Axios 2.为什么要使用Axios 3.第一个Axios应用程序 4.Vue的生命周期 总结 1.什么是Axios Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架, 她的主要作用就是实现AJAX异步通信,其功能特点如下: 从浏览器中创建XMLHttpRequests 从node.js创建http请求 支持Promise API[JS中链式编程] 拦截请求和响应 转换请求数据和响应数据 取消请求 自动转换JSON数据 客户端支持防御XSRF(跨站请求伪造)

  • 详解vue beforeRouteEnter 异步获取数据给实例问题

    场景: vue-router 路由钩子 beforeRouteEnter 可以用来在初始进入页面前,http 异步获取数据 mockData ,预先判断是进入 A 页.还是 B 页,还是留在本页:而如果留在本页的话,还需要在 mounted 根据 mockData 来判断显示哪种状态(可以在本页面实例创建后,重新发起 http 请求获取 mockData ,但是没有必要,造成代码冗余): 执行顺序: async beforeRouteEnter(to, from, next) { let res

  • vue中promise的使用及异步请求数据的方法

    下面给大家介绍vue中promise的使用 promise是处理异步的利器,在之前的文章<ES6之promise>中,我详细介绍了promise的使用, 在文章<js动画实现&&回调地狱&&promise>中也提到了promise的then的链式调用, 这篇文章主要是介绍在实际项目中关于异步我遇到的一些问题以及解决方法,由此来加深对promise的进一步理解. 背景 进入商品页,商品页的左侧是分类,右侧是具体的商品,一旦进入商品页,就把所有分类的商品

  • vue利用axios来完成数据的交互

    axios基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 现在Vue官方推荐的网络通信库不再是vue-resource了,推荐使用axios.所以学习了下,总结如下. 一.功能特性 1.在浏览器中发送 XMLHttpRequests 请求 2.在 node.js 中发送 http请求 3.支持 Promise API 4.拦截请求和响应 5.转换请求和响应数据 6.自动转换 JSON 数据 7.客户端支持保护安全免受 XSRF 攻击 二.axios的安装

  • Vue axios 将传递的json数据转为form data的例子

    修改main.js文件中axios的配置: 在发送请求前将数据用qs模块转化 修改请求头的Content-Type='application/x-www-form-urlencoded' 具体配置如下: import axios from 'axios' import qs from 'qs' // 添加请求拦截器 axios.interceptors.request.use(function (config) { if(config.method!='get'){ config.data=qs

  • vue axios数据请求get、post方法及实例详解

    我们常用的有get方法以及post方法,下面简单的介绍一下这两种请求方法 vue中使用axios方法我们先安装axios这个方法 npm install --save axios 安装之后采用按需引入的方法,哪个页面需要请求数据就在哪个页面里引入一下. import axios from 'axios' 引入之后我们就可以进行数据请求了,在methods中创建一个方法 methods:{ getInfo(){ let url = "url" axios.get(url).then((r

  • 解决Vue axios post请求,后台获取不到数据的问题方法

    最近做项目,需要用到vue,后台是php,第一次使用axios进行请求,本以为同ajax一样,会很简单,但是结果往往不让人满意啊,get请求很简单,这里就不说了,主要说下 post请求方式. 使用axios进行post请求,后台居然接收不到数据,这就纳闷了,于是网上一顿搜索,现在将所用的解决办法给大家说下: 1.new URLSearchParams方式 起初使用params.append("属性名":属性值)的方式,对于简单的数据传递这样是没有问题的,后台可以正常接收数据,但我发现一

  • vue异步更新dom的实现浅析

    目录 Vue异步更新DOM的原理 1 什么时候能获取到真正的DOM元素? 2 为什么Vue需要通过nextTick方法才能获取最新的DOM? 3 为什么this.$nextTick 能够获取更新后的DOM? 总结:vue异步更新的原理 Data对象:vue中的data方法中返回的对象: Dep对象:每一个Data属性都会创建一个Dep,用来搜集所有使用到这个Data的Watcher对象: Watcher对象:主要用于渲染DOM Vue异步更新DOM的原理 Vue中的数据更新是异步的,意味着我们在

  • vue中异步数据获取方式(确保数据被获取)

    目录 vue中异步数据获取 1.获取异步数据,通过async/await限制 2.将一个方法的返回值 vue处理数据(同步,异步)问题简单记录 情况介绍 最终解决方法:new Promise() vue中异步数据获取 1.获取异步数据,通过async/await限制 import { fetchList } from '@/api/article' //在created中即开始获取 created() {     this.getList() } methods:{     async getL

随机推荐