Vue中一个计算属性依赖了一个异步请求的数据,数据请求完成数据更新了但是视图没更新。

发布于 2022-09-12 22:54:52 字数 1252 浏览 24 评论 0

RecordModel.ts //数据模块

import axios from 'axios'

type recordModel = {
    RecordList: RecordItem[]
    getRecord: () => {}
}

const RecordModel:recordModel = {
    RecordList:[],
    async getRecord(){
        await axios.get('http://xxxx').then((response)=>{
            this.RecordList = response.data.vuedata
        })
    }
}

async function getRecordModel(){
    await RecordModel.getRecord()
    return RecordModel
}

export {getRecordModel}

showRecord.vue //视图

<template>
<div>{{recordList}}</div>
</template>
<script lang="ts">
export default class ShowRecord extends Vue {
    //计算属性 ts 写法 
    get recordList(){
        const hash:{[key:string]:RecordItem[]} = {}
        getRecordModel().then((result:any)=>{
            result.RecordList.forEach((record:RecordItem[])=>{
                const key = record.date
                if(!(key in hash)){
                    this.$set(hash,key,[])
                }
                hash[key].push(record)
            })
        })
        console.log(hash) //空对象
        setTimeout(()=>{
            console.log(hash) //有数据 但是视图没有更新
        },1000)
        return hash
    }
}

</script>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

仙女山的月亮 2022-09-19 22:54:52

不明白你这个为什么要用计算属性呢,计算属性的话应该会时常读取这个属性,那就会多次执行这个异步函数。读取的时候由于hash是异步获取的,所以hash返回的还是初始值{}

浮生未歇 2022-09-19 22:54:52

为什么要在计算属性里边写异步?Promise的.then会在最后执行,会先 return 出来空集合。

可以看下 Promise 的执行顺序

胡渣熟男 2022-09-19 22:54:52

Vue官方文档中提到, 由于 JavaScript 的限制, 当你利用索引直接设置一个项,或者直接改变数组的长度时,Vue将不会检测到数据的变化。watcher没有监测到,从而不能引发视图的重新渲染。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文