Vue / axios / props 调用后端接口数据并渲染到页面

情景介绍

给了一个可视化大屏的代码,代码上写的是假数据。现在要调用后端接口获取数据,并将其渲染到页面上。

分析问题

给的代码是一个 vue 组件嵌套一个子组件,要把数据渲染到子组件上。

  1. 要调用后端接口,写 axios 调用接口。
  2. 接口数据要渲染到一个子组件上,父子组件传值要用到 props
  3. 子组件中需要的数据是数组,接口得到的数据是数组包含很多个对象,需要处理。

1.axios调用接口

@/utils/requests.js // 在 utils 中存放通用工具函数 request.js

import axios from axios

axios.defaults.baseURL = 'http://www.test.com';
axios.defaults.headers.post['Content-Type'] = 'application/json';
axios.defaults.headers.post['X-Requested-With'] = 'XMLHttpRequest';
axios.defaults.timeout = 30000;

...

export default {
	get(url,params) {
        return axios({
            method: 'get',
            url,
            params
        }).then(response => {
            return response.data;
        })
    }
}

@/api/page/test.js // 写业务场景下调用接口函数

import http from '@/utils/request';

export const getList = () => {
    return http.get('/api/List');
}

@/views/father.vue // 在父组件页面调用接口获取数据

<template>
	<div>
        <!-- data是Son组件的props自定义属性 -->
        <Son :data="list"></Son>
    </div>
</template>

<script>
import Son from '@/components/Son';
import { getList } from '@/api/page/test';
    
export default {
    data () {
        return {
            list:[],	// 存储获取到的数据
        }
    },
    components: {
        Son
    },
    mounted: {
        getListData()
    },
    methods: {
        getListData() {
            // 这里getList获取到的res是接口返回的所有内容(包含code、msg、data等),里面只有data是业务数据
            getList().then(res => {
                this.list = res.data;
            })
        }
    }
}
</script>

2.props组件间数据共享

@/components/Son.vue // 子组件里写props获取父组件里的数据

<script>
export defalut {
    props: {
        // 子组件中用于接收父组件数据的自定义属性
        data: {
            type: Array,
            default: () => [
                ['1234','zhangsan','2022-10-12','content'],
                // ...
                ['1234','zhangsan','2022-10-12','content']
            ]
        }
    }
}
</script>

3.处理数据

可以发现子组件中需要的数据格式是

[
	[...],
	[...]
]

而现在获取到的数据格式是

[
	{...},
	{...}
]

我的思路是循环拿出数据中的每一个 Object,然后将 Object 转成数组。修改 father.vue里的

<script>
export default {
    data () {
        return {
            list:[],	// 存储获取到的数据
        }
    },
    //...
    methods: {
        getListData: {
            	// 这里的res是接口返回的所有内容
            getList().then(res => {
            	for(let i in res.data) {
        			let arr = Object.values(res.data[i]);
    				this.list.push(arr);
    			}
        	})
        }
    }
}
</script>

优化

处理数据这边我只思考了如何把 Object 转成数组,放到 list[] 里传给子组件。但是这样做对接口数据的处理还是比较粗糙的,如果子组件只想拿部分接口数据就有问题了。

请教前辈的代码写法:

<script>
export default {
    data () {
        return {
            list:[],	// 存储获取到的数据
        }
    },
    //...
    methods: {
        getListData: {
            	// 这里的res是接口返回的所有内容
            getList().then(res => {
            	if(res.data && res.data.length > 0) {
        			res.data.forEach(item => {
        				this.list.push([item.Number, item.Name, item.Date, item.Content]);
    				});
    			}
        	});
        }
    }
}
</script>

解读

forEach() 可以调用数组每个元素,并将元素传递给回调函数。

注意:forEach() 对于空数组是不会执行回调函数的。

现在不是拿到数组包对象形式的数据吗,用 forEach() 调用数组中每一个 Object ,然后 Object 传递给回调函数参数 item,通过 item 拿到指定的数据放到数组中,最后将数组 push 进 list[] 。

总结

其实 forEach() 思想也是循环,但是关键点在调用到每个 Object 后,用 Object. 的形式拿到对象里指定的数据这一步我没考虑到,而且 forEach() 的写法简洁美观。

这次尝试学习到的3点:

  • axios 请求接口数据
  • props 组件间数据共享
  • forEach() 方法
  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中使用axios进行二次封装的步骤如下所示: 第一步,在项目的`apis`文件夹下创建一个`http.js`文件,用于封装axios的请求方法。在该文件中,通过`export`将方法暴露出去,方便在所需页面进行调用。例如,可以创建一个获取用户列表信息的方法`get_users`: ```javascript import http from './index.js' export const get_users = (params) => { return http({ method: "GET", url: "users", params: params }) } ``` 第二步,设置基地址和拦截器。可以使用axios的`create`方法创建一个自定义的axios实例,并在其中设置基地址和拦截器。例如: ```javascript import axios from 'axios' const request = axios.create({ baseURL: '基地址1', timeout: 5000 }) request.interceptors.request.use(function (config) { // 在发送请求之前做些什么 return config }, function (error) { // 对请求错误做些什么 return Promise.reject(error) }) request.interceptors.response.use(function (response) { // 对响应数据做点什么 return response.data }, function (error) { // 对响应错误做点什么 return Promise.reject(error) }) ``` 第三步,在页面中引入`http.js`文件,并调用自己所配置好的请求方法。可以使用`import`语句引入`http.js`中暴露的方法,然后在页面的方法中使用`async`和`await`对请求方法进行异步请求,最终可以直接获取到请求的数据信息。例如: ```javascript import { get_users } from '../apis/http.js' export default { props: {}, data() { return {} }, created() { // 在钩子函数中调用自定义的getUserList方法 this.getUserList() }, methods: { // 自定义方法中调用get_users方法,通过async和await进行异步请求 async getUserList() { // 调用get_users方法并获取请求数据 let { data: res } = await get_users(params) // 在页面渲染数据 // console.log(res) } }, components: {} } ``` 这样,在Vue中就可以使用axios进行二次封装,并通过引入和调用自定义的请求方法来获取数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vueaxios的二次封装](https://blog.csdn.net/m0_63905956/article/details/125589282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vueaxios的二次封装](https://blog.csdn.net/qq_20623665/article/details/128243379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值