0


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;...exportdefault{get(url,params){returnaxios({method:'get',
            url,
            params
        }).then(response=>{return response.data;})}}

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

import http from'@/utils/request';exportconstgetList=()=>{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() 方法

本文转载自: https://blog.csdn.net/weixin_46097280/article/details/127279121
版权归原作者 不器的竹子 所有, 如有侵权,请联系我们删除。

“Vue / axios / props 调用后端接口数据并渲染到页面”的评论:

还没有评论