【问题标题】:Vue.js not updating props in child when parent component is changing the property当父组件更改属性时,Vue.js 不会更新子组件中的道具
【发布时间】:2018-07-02 04:32:28
【问题描述】:

我正在尝试在具有类似结构的组件之间进行通信

<div id=chat-box>
<div class="wrapper">
  <div>
    <chat-header></chat-header>
    <message-container :chat="chat"></message-container>
    <chat-compose @clicked="onClickChild"></chat-compose>
  </div>
</div>

父母

methods: {
onClickChild (value) {
  console.log('in top parent');
  this.chat = value;
},

孩子 1

methods: {
  startChat: function(event) {
    this.$emit('clicked', new chat({
     type: 'user',
     message: this.input_value,
     button: 'user',
     metaInfo: 'user',
     isBot: false,
   }))
  },
},

孩子 2

导出默认{ 名称:'消息容器', 道具:['聊天'],

data: function() {
  return {
    chatSession: [],
  }
},

method : {
  updateData : function() {
    console.log('called updatedata');

  }
},

created: function () {
  console.log(this.chat) 
},
mounted: function () {
 console.log(this.chat) 
},

updated: function() {
  console.log(this.chat)
}

}

这里的 clickChild 方法正在发出父方法,它正在更新聊天对象,但消息容器组件没有获得更新的值,它显示默认的初始化值,甚至在我尝试创建、安装和更新的方法的数据更改上也没有再次呈现为了获得更新的值,这些方法在应用程序初始化时只调用一次,永远不会在数据更改时再次调用

基本上这里有三个组件,一个是父级,另外两个是子级,因此一个子级正在更新聊天对象并发送给父级和父级,将相同的更新后的子级传递给另一个子级,但另一个子级没有重新渲染或获取更新价值 所以请帮助我做错了还是有其他方法可以实现它。

【问题讨论】:

  • 您是否将chat 定义为父组件上的数据属性?
  • @是我定义的

标签: javascript security vue.js


【解决方案1】:

这可能是由于 Vue 缓存了 &lt;message-container&gt; 组件。

尝试添加一个 :key 来强制它重新渲染。

 <message-container :chat="chat" :key="count"></message-container>

为您的 onClickChild 方法添加一个计数器

onClickChild(value){
   this.chat = value;
   this.count = this.count + 1;
}

【讨论】:

  • 聊天是一个对象,所以它的给定避免使用非原始值作为键,错误
  • 我修改了答案以添加不同的键。请务必将 count 变量添加到您的 data 数组中。
  • 谢谢,对我有很大帮助
【解决方案2】:

您添加了一个名为“clicked”的事件。您应该改用“点击”。

<chat-compose @click="onClickChild"></chat-compose>

如果你想创建“点击”事件,你需要在你的 chat-c​​ompose 组件中指定它。

基本上,您将收到一个自定义组件事件并发出响应/某事。

对于自定义组件事件:

https://vuejs.org/v2/guide/components.html#Custom-Events https://vuejs.org/v2/guide/components.html#Non-Parent-Child-Communication


如果你想给家长发送消息,你可以使用:

this.$parent.chat = ...

创建一个全局事件总线,将所有事件保存在一个位置(取决于您的应用程序的大小/复杂性,这可能是一个很好的解决方案)。你可以在这里阅读:https://alligator.io/vuejs/global-event-bus/

【讨论】:

  • 它不是事件“点击”它的回调方法名称,当孩子发出事件时它会调用它并按预期工作。我的问题是一个孩子正在更新聊天对象并发送给父母,父母将相同的对象作为道具传递给另一个孩子,但第二个孩子没有重新渲染或获得更新的值,所以应该使用什么确切的方法来监听更新的孩子from 方法创建挂载或更新,但是当从第一个孩子调用父对象并且对象被更新并且同样传递给第二个孩子时,没有一个方法被调用
  • @Eduardo Stuart:我投了反对票,因为他在他的“聊天撰写”组件中发出了“点击”事件。 (@DeepakPatidar:您应该在句子中使用一些标点符号,以使它们更具可读性。)
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
相关资源
最近更新 更多