问答

Vue中一个计算属性依赖了一个异步请求的数据,数据请求完成数据

作者:admin 2021-04-19 我要评论

RecordModel.ts //数据模块 import axios from 'axios'type recordModel = { RecordList: RecordItem[] getRecord: () = {}}const RecordModel:recordModel = { ...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

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>
###

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

###

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

可以看下 Promise 的执行顺序

###

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

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器