【发布时间】:2018-02-25 15:49:21
【问题描述】:
我有一个非常奇怪的情况,即子组件的 prop 的更改不会触发重新渲染。
这是我的设置。在我的父母中:
<child :problemProp="proplemPropValue""></child>
在孩子中我定义了道具:
{
name: "Child",
props: {
problemProp: {
type: [File], //yes it is a file
required: true
}
}
然后我尝试渲染它(仍在子组件中)
<template>
<div id="dropzone-preview" class="file-row">
{{problemProp}} <--This should just show the prop as a JSON string-->
</div>
</template>
这最初是正确呈现的。但是problemProp 有一个属性upload.progress,当我在父级中更改它时(我可以确认它确实在父级上更改)它在子级中没有更改。
如果我现在添加第二个道具,dummyProp 给孩子:
{
name: "Child",
props: {
problemProp: {
type: [File], //yes it is a file
required: true
},
dummyProp: {
type: Number
}
}
现在,当dummyProp 发生变化时,propblemProp 也会发生变化。这里发生了什么?为什么dummyProp 的更改会强制重新渲染,而propblemProp 的更改不会?
【问题讨论】:
-
progress是如何添加到proplemPropValue的? -
@Bert 我监听 Dropzonejs 事件并通过 Vuex 商店更新它。
progress并没有真正“添加”到 proplemPropValue。当proplemPropValue被初始化时,它上面就被progress初始化了。这能回答问题吗? -
它是如何更新的?您描述的行为听起来像是代码陷入了更改检测警告(值已更改,但 Vue 不知道它已更改)。
-
所以子组件实际上是由数组上的
v-for生成的众多组件之一。每次数组中的一项更改时,我都会使用arr.splice(indexOfItem,1, newValue)更新数组。这种变化会反映在 Vuex 存储和父级中,但不会反映在子级中。 -
没有代码真的帮不上忙。理想情况下是一个演示问题的工作示例。
标签: javascript vue.js vuejs2 vue-component