Vue js 子组件中未定义的道具。但仅在其脚本中

Posted

技术标签:

【中文标题】Vue js 子组件中未定义的道具。但仅在其脚本中【英文标题】:Undefined props in Vue js child component. But only in its script 【发布时间】:2017-12-03 11:32:08 【问题描述】:

我刚开始使用 Vue,遇到了一些意想不到的行为。在将道具从父组件传递到子组件时,我能够访问子模板中的道具,但不能访问子脚本。但是,当我在父模板(主 div)中使用 v-if 指令时,我能够访问子脚本和子模板中的道具。我会很感激这里的一些解释,有没有更好的结构代码?请参见下面的代码。谢谢。

父组件:

<template>
<div v-if="message">
<p>
 message.body 
</p> 
<answers :message="message" ></answers>
</div>
</template>

<script>
  import Answers from './Answers';
  export default 
    components: 
      answers: Answers
    ,
    data()
      return 
        message:""
      
    ,
    created() 
      axios.get('/message/'+this.$route.params.id)
        .then(response => this.message = response.data.message);
    
  
</script>

子组件

<template>
  <div class="">
  <h1> message.id </h1> // works in both cases
  <ul>
    <li v-for="answer in answers" :key="answer.id">
      <span> answer.body </span>      
    </li>
  </ul> 
  </div>
</template>

<script>
  export default
    props:['message'],    
    data()
      return 
        answers:[]
      
    ,    
    created()
      axios.get('/answers/'+this.message.id) //only worls with v-if in parent template wrapper
        .then(response => this.answers = response.data.answers);
    
  
</script>

【问题讨论】:

【参考方案1】:

this.message.id 仅适用于 v-if,因为有时 message 不是对象。

您在父组件中进行的用于检索消息对象的调用是异步的。这意味着在您的子组件加载之前调用尚未完成。因此,当您的子组件加载时,message=""。这不是具有id 属性的对象。当message="" 并且您尝试执行this.message.id 时会出现错误,因为字符串没有id 属性。

您可以继续使用v-if,这可能是最好的,或者在将message 不是对象时阻止执行子组件中的ajax 调用,同时将其移动到updated

【讨论】:

啊,我明白了。谢谢你的解释,伯特把事情搞清楚了。非常感激。将在您的建议中坚持使用 v-if 指令。

以上是关于Vue js 子组件中未定义的道具。但仅在其脚本中的主要内容,如果未能解决你的问题,请参考以下文章

VueJS 道具在组件中未定义

VUE2js:如何在其道具更改后重新渲染组件?

Vue.js。子组件中的变异道具不会触发警告。想知道为啥

Vue.js 道具未定义

vue:在其定义中转换一个道具

为啥 this.$refs 在 Vue 子组件中未定义?