Vue 怎么等待数据处理完后再渲染 DOM 节点 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
liceal

Vue 怎么等待数据处理完后再渲染 DOM 节点

 
  •   liceal Jul 4, 2019 11412 views
    This topic created in 2491 days ago, the information mentioned may be changed or developed.

    之前没出现过这个问题,过了几天就出现了问题,很迷,代码都没改过,目前个人得到的结论:数据还在处理但是没处理完,默认为空数组,但是页面已经渲染了。。但是按道理数据改变了应该渲染啊。。。

    html 代码 这里页面渲染完是显示是空数组

    <span v-for="(value,key) in item['expert']" :key="key"> <a>{{experts}}</a> </span> 

    这里处理完 console 打印出来的数据是有的

    apiAllExperts() .then(RespOnse=> { if (Response['msg'] == 'success') { let result = Response['data'] result.forEach(element => { //这里在处理数据 this.experts[element['id']] = element }) console.log(123123, this.experts) //处理完数据后打印出来显示有的 } else { console.log('请求出错' + Response) } }) .catch(e => { console.log('数据请求失败') console.log(e) }) 
    24 replies    2019-07-05 14:15:05 +08:00
    chenstack
        1
    chenstack  
       Jul 4, 2019
    Caballarii
        2
    Caballarii  
       Jul 4, 2019
    forceUpdate
    renmu
        3
    renmu  
       Jul 4, 2019 via Android
    nexttick
    a4854857
        4
    a4854857  
       Jul 4, 2019   1
    你 console 打印出来是值是不是当时的值. 查看到的永远都是最新的.
    应该在打印的时候 JSON.strintify() 这样才是当时的值.
    hubqin
        5
    hubqin  
       Jul 4, 2019 via Android
    $nexttick
    liceal
        6
    liceal  
    OP
       Jul 4, 2019
    @chenstack $set 可以显示最新数据了,谢谢。但是,去得到最新数据里面的某个键的值还是报错 undefined,可能是第一次是空的,第二次有值,用$set 的方式,可以让节点重新渲染
    forgcode
        7
    forgcode  
       Jul 4, 2019
    Biwood
        8
    Biwood  
       Jul 4, 2019   1
    楼上一堆回复 API 的,拜托看看楼主代码本身好吧,代码逻辑本身写的有问题,试图用 API 去弥补只会让程序运行效率更低。

    result.forEach(element => { //这里在处理数据
    this.experts[element['id']] = element
    })

    这种写法确定没问题吗?
    seki
        9
    seki  
       Jul 4, 2019
    建议仔细读一遍文档
    xzh654321
        10
    xzh654321  
       Jul 4, 2019
    你的 experts 里面声明的时候一定没有 element['id']这个属性
    doommm
        11
    doommm  
       Jul 4, 2019
    建议每一次直接生成一个新对象去替换掉 this.experts
    xg4
        12
    xg4  
       Jul 5, 2019   1
    你在 data 中的 experts 肯定是一个空对象,没有给出内部具体的 key,Vue 无法帮你进行双向绑定,所以 this.experts[key] = 123 的值变化,不会自动更新视图。但是 experts 被监听了,可以直接替换整个对象,this.experts = {},这样视图会被更新。

    这个问题的根源是 Object.defineProperty,弄懂这个 API 就知道 Vue 的正确使用方式
    V2exUser
        13
    V2exUser  
       Jul 5, 2019 via Android
    定义一个变量,然后循环里用这个变量接收,循环外再赋值给 exports
    ericgui
        14
    ericgui  
       Jul 5, 2019 via Android
    你代码有问题

    搞清楚异步的思维方式
    hyy1995
        15
    hyy1995  
       Jul 5, 2019
    1 楼就是正解,刚准备想发,就看到 1 楼已经回复了。这个坑当时也困扰过我
    LongMaoz
        16
    LongMaoz  
       Jul 5, 2019
    result.forEach(element => { //这里在处理数据
    this.experts[element['id']] = element
    })
    你这里是个啥?
    this.experts 是个数组? ID 是 Number? 遍历替换 this.experts 数据为 element ?
    liceal
        17
    liceal  
    OP
       Jul 5, 2019
    @Biwood 数据可以成功打印。这里的主要问题,比如:
    a=[]
    a={'name':'张三'}
    console.log(a.name) => undefined..
    liceal
        18
    liceal  
    OP
       Jul 5, 2019
    @xzh654321 这个我在控制台 console 输出过了 存在的,但是页面渲染同样的输出数据是 undefined
    liceal
        19
    liceal  
    OP
       Jul 5, 2019
    @xg4 这个 key 肯定是存在的,渲染没问题
    liceal
        20
    liceal  
    OP
       Jul 5, 2019
    @LongMaoz 这是一个对象,把 id 作为键
    liceal
        21
    liceal  
    OP
       Jul 5, 2019
    @hyy1995 set 完会重新渲染 DOM,但是这次的 DOM 可能是第二次渲染,那第一次的时候数据是空的,就会报错。。。
    chenstack
        22
    chenstack  
       Jul 5, 2019
    @liceal 建议定义数据时给一个默认值,或者给用户数据正在加载的提示。
    xg4
        23
    xg4  
       Jul 5, 2019
    @liceal 不是 key 存不存在的问题,比如:

    data() {
    return {
    experts: {
    foo: 'hello'
    }
    }
    }

    this.experts.foo = '123' 可以触发更新视图

    this.experts.bar = '123123' 就不行,这里就需要用 set 函数操作才能更新视图

    bar 是后面加入的数据,Vue 在初始化的时候不知道有 bar 这个属性,并没有对 bar 进行监听

    你写在 data 中的数据,Vue 在初始化的时候会帮你处理成 Object.defineProperty 双向绑定,这样才能在值改变的时候,更新视图
    深入响应式原理 - https://cn.vuejs.org/v2/guide/reactivity.html
    liceal
        24
    liceal  
    OP
       Jul 5, 2019   1
    @xg4 set 是会重新渲染 DOM 但可能在此之前,DOM 已经渲染一次了,那一次就错了。。。问题已经找到了,数据少了一条,导致找不到,我已经拿刀去找后端了。。
    About     Help     Advertise     Blog     API     FAQ     Solana     5402 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 82ms UTC 07:23 PVG 15:23 LAX 00:23 JFK 03:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86