那些年 vue 踩过的坑

535 阅读2分钟

Vue 中 prop 值异步获取数据导致的报错

知识仓库1:父子组件的生命周期

p-beforeCreate
p-created
p-beforeMount
c-beforeCreate
c-created
c-beforeMount
c-mounted
p-mounted

知识仓库2:父组件通过 prop 给子组件传值,父组件改变 prop 的值,生命周期

p-beforeUpdate
c-beforeUpdate
c-updated
p-updated

情形一:

父组件通过 prop 给子组件传值,只要父组件改变 prop 的值,子组件就会即时响应父组件的改变,无论是否异步,前提:传的是非 mounted 周期函数改变的数据

子组件始终能响应父组件的改变

情形二:

如果子组件将父组件通过 prop 传的值,赋值到了子组件 data 数据对象的属性上(这一操作通常是在mounted中执行的),如果父组件更改 prop 的值,子组件视图不响应,只能显示初始值,无论是否异步,前提:传的是非 mounted 周期函数改变的数据

表象:子组件能够响应父组件的改变,只是视图不会改变

原因:父组件改变 prop,子组件不会再执行 mounted 周期函数

解决:watch prop

情形三:

如果父组件 data 对象中的一个属性,是在 mounted 进行初始化的,并将这个属性作为 prop 传给了子组件

如果这个对象是个空对象,并且采用了 this.对象.属性= 属性值,这样的方式得到的新对象是不具有响应式的,在看 devtool 时,可以看到父子组件都有了新对象,但都不是响应式的(全都是泡沫)

打印父子组件的生命周期,发现只输出了父组件的 updated 和 beforeUpdate

原因:对象是非响应式的

解决:通过 vue 的 set 方法对对象添加新属性

后记

在网上查资料的过程中,看到很多标题都是异步获取数据导致 props 失效,我想在这里为异步正个名,以上情况都不是异步的问题,异步:这个锅我不背