javascript - 即使父级更新,子级 prop 也不会更新

标签 javascript vue.js vuejs2 vue-component

我遇到了一个非常奇怪的情况,子组件的 prop 的更改不会触发重新渲染。

这是我的设置。在父级中我有:

        <child :problemProp="proplemPropValue""></child>

在 child 中我定义了 Prop :

{
    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,当我在父级中更改它时(我可以确认它确实在父级上更改),它在子级中不会更改。

如果我现在向子级添加第二个 prop,dummyProp:

   {
    name: "Child",
    props: {
    problemProp: {
        type: [File], //yes it is a file 
        required: true
    },
    dummyProp: {
        type: Number
    }
}

现在,当 dummyProp 发生变化时,propblemProp 也会发生变化。这里发生了什么?为什么 dummyProp 中的更改会强制重新渲染,但 propblemProp 中的更改却不会?

最佳答案

问题的根源似乎是,当您将 File 对象添加到数组时,Vue 无法将其转换为观察到的值。这是因为Vue ignores browser API objects :

The object must be plain: native objects such as browser API objects and prototype properties are ignored.

在这种情况下,对该对象的任何更改都不会自动反射(reflect)在 Vue 中(正如您通常期望的那样),因为 Vue 不知道它们发生了更改。这也是为什么它在更新 dummyProp 时似乎可以工作,因为该属性的更改会被观察到并触发重新渲染。

那么,该怎么办呢。通过对 addedFile 方法进行一些小更改,我已经能够让您的 bin 正常工作。

addedfile(file){
  console.log(file);
  self.problemPropValues.push(Object.assign({}, file));
},

首先,您不需要(或不想)使用$data,只需直接引用该属性即可。其次,通过使用 Object.assign 进行复制,Vue 可以正确观察对象,并且更新现在反射(reflect)在子对象中。 可能在某些时候您需要使用深层复制方法而不是Object.assign,具体取决于您的用例,但目前看来正在工作。

Here is the code我最终让 bin 开始工作(转换为 codepen,因为我发现使用 codepen 更容易)。

关于javascript - 即使父级更新,子级 prop 也不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46256736/

相关文章:

vue.js - 如何使用 props 和 slots 的默认值扩展 Vue 组件?

javascript - 将选项传递给全局注册的 vuejs 组件

javascript - Vuex getter 返回 undefined

javascript - Google Apps 脚本电子邮件范围的格式不起作用

javascript - 在 React 组件中测试 fetch() 方法

vue.js - nuxt 在本地域上?

angular - 在 Google Cloud 的存储桶中强制执行 HTTP 到 HTTPS 重定向

javascript - 如何在云中复制 Parse 对象?

javascript - Sinon.stub() 每次调用时返回不同的值

javascript - 如何使用 webpack 2.7 将 Vue.js 置于生产模式?