Axios 请求示例 res.data.data

以下是 this.users = res.data.data完整可运行示例 (基于 Vue 3 + Axios,Vue 2 写法仅需微调),包含「后端接口模拟」+「前端请求代码」+「数据解析」全流程,帮你直观理解两个 data 的作用:

一、模拟后端接口返回格式

先明确后端接口(比如 /api/users)返回的 JSON 结构(这是 HTTP 响应体的内容):

json

javascript 复制代码
// 后端接口 /api/users 返回的完整 JSON(HTTP 响应体)
{
  "code": 200,        // 业务状态码(后端自定义)
  "message": "查询用户列表成功", // 业务提示信息
  "data": [           // 后端自定义的「业务数据包」(真正的用户数据)
    { "id": 1, "name": "张三", "age": 25, "email": "zhangsan@test.com" },
    { "id": 2, "name": "李四", "age": 28, "email": "lisi@test.com" },
    { "id": 3, "name": "王五", "age": 30, "email": "wangwu@test.com" }
  ]
}

二、前端完整代码示例(Vue 3 组件)

vue

javascript 复制代码
<template>
  <div class="user-list">
    <h3>用户列表</h3>
    <ul>
      <!-- 渲染 users 数据 -->
      <li v-for="user in users" :key="user.id">
        {{ user.name }}({{ user.age }}岁)- {{ user.email }}
      </li>
    </ul>
  </div>
</template>

<script setup>
// 1. 引入 axios(需先安装:npm install axios)
import axios from 'axios';
import { ref, onMounted } from 'vue';

// 2. 定义响应式数据 users(最终要赋值的变量)
const users = ref([]);

// 3. 定义请求用户列表的函数
const getUserList = async () => {
  try {
    // 发送 GET 请求到后端接口
    const res = await axios.get('/api/users');

    // 核心代码:解析两层 data 并赋值
    // 第一个 res.data:Axios 封装的「响应体容器」(装着后端返回的完整 JSON)
    // 第二个 .data:后端 JSON 里的「业务数据包」(用户列表)
    users.value = res.data.data;

    // 【可选】打印调试,直观看到数据结构
    console.log('Axios 封装的完整响应对象 res:', res);
    console.log('Axios 的响应体容器 res.data:', res.data);
    console.log('后端的业务数据包 res.data.data:', res.data.data);
  } catch (error) {
    // 错误处理(比如接口请求失败)
    console.error('请求用户列表失败:', error);
    console.error('错误状态码:', error.response?.status);
    console.error('错误信息:', error.response?.data);
  }
};

// 4. 组件挂载后执行请求
onMounted(() => {
  getUserList();
});
</script>

三、关键日志输出(帮你理解数据结构)

运行代码后,控制台会打印出以下内容(对应注释里的调试打印):

1. console.log('Axios 封装的完整响应对象 res:', res)

javascript

javascript 复制代码
{
  data: { // 第一个 data(Axios 的响应体容器)
    code: 200,
    message: "查询用户列表成功",
    data: [ // 第二个 data(后端的业务数据包)
      { id: 1, name: "张三", age: 25, email: "zhangsan@test.com" },
      { id: 2, name: "李四", age: 28, email: "lisi@test.com" },
      { id: 3, name: "王五", age: 30, email: "wangwu@test.com" }
    ]
  },
  status: 200, // HTTP 状态码
  statusText: "OK",
  headers: { "content-type": "application/json; charset=utf-8" },
  config: { url: "/api/users", method: "get", ... },
  request: XMLHttpRequest { ... }
}
2. console.log('Axios 的响应体容器 res.data:', res.data)

javascript

javascript 复制代码
{
  code: 200,
  message: "查询用户列表成功",
  data: [
    { id: 1, name: "张三", age: 25, email: "zhangsan@test.com" },
    { id: 2, name: "李四", age: 28, email: "lisi@test.com" },
    { id: 3, name: "王五", age: 30, email: "wangwu@test.com" }
  ]
}
3. console.log('后端的业务数据包 res.data.data:', res.data.data)

javascript

javascript 复制代码
[
  { id: 1, name: "张三", age: 25, email: "zhangsan@test.com" },
  { id: 2, name: "李四", age: 28, email: "lisi@test.com" },
  { id: 3, name: "王五", age: 30, email: "wangwu@test.com" }
]

四、Vue 2 版本适配(如果用 Vue 2)

仅需调整组件写法,核心的 res.data.data 逻辑完全不变:

vue

javascript 复制代码
<template>
  <!-- 模板部分和 Vue 3 一致 -->
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      users: [] // 定义 users 数据
    };
  },
  mounted() {
    this.getUserList();
  },
  methods: {
    async getUserList() {
      try {
        const res = await axios.get('/api/users');
        // 核心赋值逻辑完全一样
        this.users = res.data.data;
      } catch (error) {
        console.error('请求失败:', error);
      }
    }
  }
};
</script>

五、关键说明

  1. 接口模拟 :如果没有真实后端接口,可先用 axios-mock-adapter 模拟:

    javascript

    javascript 复制代码
    import axios from 'axios';
    import MockAdapter from 'axios-mock-adapter';
    
    // 创建 mock 实例
    const mock = new MockAdapter(axios);
    // 模拟 /api/users 接口返回
    mock.onGet('/api/users').reply(200, {
      code: 200,
      message: "查询用户列表成功",
      data: [
        { id: 1, name: "张三", age: 25, email: "zhangsan@test.com" },
        { id: 2, name: "李四", age: 28, email: "lisi@test.com" }
      ]
    });
  2. 核心不变 :无论 Vue 2/3,也无论接口是 GET/POST,res.data(Axios 容器)和 res.data.data(后端业务数据)的逻辑始终一致;

  3. 字段变化适配 :如果后端把业务数据字段从 data 改成 list,只需把 res.data.data 改成 res.data.list 即可。

这个示例覆盖了「请求→响应→解析→渲染」全流程,你可以直接复制运行(记得安装 axios),通过控制台日志就能清晰看到两个 data 的具体内容和作用~

六、安装vue axios

npm install --save axios vue-axios

相关推荐
2022.11.7始学前端1 小时前
n8n第四节 表单触发器:让问卷提交自动触发企微消息推送
java·前端·数据库·n8n
程序员小寒1 小时前
超详细的 EventLoop 解读及模拟实现
前端·javascript
冴羽1 小时前
太好看了!3 个动漫变真人 Nano Banana Pro 提示词
前端·人工智能·aigc
zReadonly1 小时前
关于vxeTable转换树状表格以及问题思考
前端
锈儿海老师1 小时前
深入探究 React 史上最大安全漏洞
前端·react.js·next.js
韩立学长1 小时前
【开题答辩实录分享】以《基于Vue Node.js的露营场地管理系统的设计与实现》为例进行选题答辩实录分享
数据库·vue.js·node.js
q_19132846951 小时前
基于SpringBoot2+Vue2+uniapp的考研社区论坛网站及小程序
java·vue.js·spring boot·后端·小程序·uni-app·毕业设计
一壶纱1 小时前
uni-app 使用 uview-plus
前端
敲敲了个代码1 小时前
从零实现一个「就地编辑」组件:深入理解 OOP 封装与复用的艺术
前端·javascript·学习·面试·前端框架