ngOnChanges事件不触发,求解

发布于 2022-09-12 13:16:49 字数 756 浏览 19 评论 0

一个子组件接受一个list数组对象进行渲染,

<child [list]="list"></child>

数组对象是父组件通过http接口异步获取,然后在回调函数里面用list一个一个push进去像这样:

temArr.forEach(res => {
    http.getData().then(obj => {
        list.push(obj.data);
    })
})

然后我在子组件的ngOnChanges事件里面打印传过来的list是空的数组对象而且只打印了一次

ngOnChangee(changes: SimpleChanges) {
    for(let prorName in changes) {
        if(propName === 'list') {
            console.log(list) // []
        }
    }
}

后来我换了一种组装list的方法就正常了

temArr.forEach(res => {
    http.getData().then(obj => {
        list = [...list, obj.data];
    })
})

这种方法感觉和push的效果是一样的, 但是在ngOnChange里面的表现不一样,查了下资料好像也没看到很合理的解释,希望哪位大佬能解释一下,感谢!!

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

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

发布评论

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

评论(3

往事风中埋 2022-09-19 13:16:49

对象引用问题吧
下边写法, 相当于重定义了一个变量
引用地址改变了呀

我三岁 2022-09-19 13:16:49

https://angular.cn/guide/life...

把这一小节看完就好。有解释。

日志条目把 power 属性的变化显示为字符串。但请注意,ngOnChanges() 方法不会捕获对 hero.name 更改。这是因为只有当输入属性的值发生变化时,Angular 才会调用该钩子。在这种情况下,hero 是输入属性,hero 属性的值是_对 hero 对象_的_引用_ 。当它自己的 name 属性的值发生变化时,对象引用并没有改变。

给不了的爱 2022-09-19 13:16:49

Angular 的变更检测只会检测对象标识,而不会检测对象内容,像数组在执行 pushpop 等操作时,只会变更数组内容,这也就是为什么你需要使用:

list = [...list, obj.data];

才会生效的原因,因为这种方式会改变对象标识(或叫指针)。同理,当你希望删除时,应该:

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