Brick Next父组件数据传给子组件不更新,该怎么解决?
我在用Brick Next开发页面时,父组件通过props传值给子组件,但子组件渲染不出来数据。比如父组件写了<child :value="parentData"></child>,子组件用brick:props接收,但页面一直显示初始值。控制台没报错,数据确实在父组件里了,这是什么情况?
尝试过在子组件里用$watch监听props,但没触发变化。父组件数据是通过API获取的异步数据,可能跟响应式更新有关?以下是代码片段:
<!-- 父组件 -->
<brick:brick name="Parent">
<brick:view>
<child :value="parentData" />
</brick:view>
<brick:script>
export default {
data() {
return { parentData: null }
},
async mounted() {
this.parentData = await fetchData()
}
}
</brick:script>
</brick:brick>
<!-- 子组件 -->
<brick:brick name="Child">
<brick:props>
value: null
</brick:props>
<brick:view>
<div>{{ value }}</div>
</brick:view>
<brick:script>
export default {
mounted() {
console.log(this.value) // 始终显示初始值null
}
}
</brick:script>
</brick:brick>
value: null改成
就这样
parentData是在mounted里异步赋值的,虽然 Vue 的响应式系统能监听到变化,但 Brick Next 的子组件可能在首次渲染时已经固化了 props 的初始值,特别是当你的子组件没有显式声明响应式监听。核心问题是:子组件的
value虽然接收了 props,但它没有对后续变更做响应处理,而且你在子组件用的是brick:props写法,这种写法在某些版本的 Brick Next 中会被当作静态默认值处理,而不是响应式 prop。解决方法有两个:
第一,确保子组件正确声明 props 为响应式。把你的子组件改成:
然后关键是父组件模板里,确保传的是响应式字段,这点你没问题。
第二,如果你发现即使这样,子组件仍不更新视图,那大概率是 Brick Next 编译时对
brick:props解析有问题。建议改用标准的props数组或对象形式,在brick:script里定义,不要单独用brick:props标签——这玩意有时候被当配置解析,不进响应式系统。另外,你可以在子组件加个 watcher 确认是否触发更新:
最后检查下 fetchData 返回的数据结构是不是可响应的,别是个 proxy 或不可枚举对象。最简单办法是返回前用
JSON.parse(JSON.stringify(data))做一次深拷贝,排除复杂对象导致的响应失效。总结:问题不在后端处理,而是前端 props 响应式声明方式不对。把
brick:props干掉,改用 script 里标准 props 定义,再配合 watch 监听,基本就能解。