【问题标题】:Property or method "contact" is not defined on the instance but referenced during render Vuejs Laravel属性或方法“contact”未在实例上定义,但在渲染 Vuejs Laravel 期间被引用
【发布时间】:2019-06-25 23:02:33
【问题描述】:

我正在使用 vue.js 在 laravel 上开发聊天应用程序,我是 vue.js 的新手。

但是我遇到了下面提到的错误,请帮我解决这个问题

错误1: [Vue 警告]:属性或方法“contact”未在实例上定义,但在渲染期间被引用。通过初始化属性,确保此属性是反应性的,无论是在数据选项中,还是对于基于类的组件

错误2: [Vue警告]:渲染错误:“TypeError:无法读取未定义的属性'头像'”

/ChatApp.vue 文件/

    <template>
    <div class="chat-app">
    <Conversation :contact="selectedContact" :messages="messages"/>
    <ContactsList :contacts="contacts"/>
    </div>
    </template>

    <script>
    import Conversation from './Conversation.vue';
    import ContactsList from './ContactsList.vue';

    export default {
    props: {
        user: {
            type: Object,
            required: true
        }
    },  
    data(){
        return {
            selectedContact: null,
            messages: [],
            contacts: []
        };
    },        
    mounted(){
        axios.get('/contacts')
        .then((response) => {
            this.contacts = response.data;
        });
    },
    methods: {
        startConversationWith(contact) {
            axios.get(`/conversation/$(contact.id)`)
                .then((response) => {
                    this.messages = response.data;
                    this.selectedContact = contact;
                })
        }
    },
    components: { ContactsList, Conversation }
    };
    </script>

/ContactsList.vue 文件/

    <template>
    <div class="contacts-list">
    <ul v-if="contacts.length > 0">
        <li v-for:"(contact, index) In contacts" :key="contact.id" 
    @click="selectContact(index, contact)" :class="{ 'selected' : index == 
    selected}">
            <div class="avatar">
                <img :src="contact.avatar" :alt="contact.name">
            </div>
            <div class="contact">
                <p class="name">{{ contact.name }}</p>
                <p class="email">{{ contact.email }}</p>
            </div>
        </li>
    </ul>
    </div>
    </template>

    <script>
    export default {
    props: {
    contacts: {
        type: Array,
        default: []
    }
    },
    data() {
     return {
        selected: 0
     };
    },
    methods: {
     selectContact(index, contact) {
         this.selected = index;
         this.$emit('selected', contact);
     }
    }
    };
    </script>

/conversation.vue/

    <template>
    <div class="conversation">
    <h1>{{ contact ? contact.name : 'Select a contact' }}</h1>
    <MessagesFeed :contact="contact" :messages="messages" />
    <MessageComposer @send="sendMessage" />
    </div>
    </template>

    <script>
    import MessagesFeed from './MessagesFeed.vue';
    import MessageComposer from './MessageComposer.vue';

    export default {
     props: {
        contact: {
            type: Object,
            default: null
        },
        messages: {
            type: Array,
            default: []
        }
    },
    methods:{
        sendMessage(text) {
            console.log(text);
        }
    },
    components: {MessagesFeed, MessageComposer}
    };
    </script>

【问题讨论】:

    标签: laravel vue.js laravel-5.7


    【解决方案1】:

    @Akash 你可以这样使用它:

    data() {
        return {
            contactsNotEmpty:false
        }
    },
    // ...
    mounted() {
         axios.get('/contacts')
            .then((response) => {
                this.contacts = response.data;
                this.contactsNotEmpty = true;
            });
    }
    

    <ul v-if="contactsNotEmpty">
        ...
    </ul>
    

    您也可以查看这篇关于正在发生的事情的 vuejs 文章:https://vuejs.org/2016/02/06/common-gotchas/#Why-isn%E2%80%99t-the-DOM-updating

    【讨论】:

      【解决方案2】:

      我猜你可以这样做:

      <ul v-if="contacts.length > 0">
          <li v-for="contact in contacts" :key="contact.id">
              <div class="avatar">
                   <img :src="contact.avatar" :alt="contact.name">
              </div>
              <div class="contact">
                   <p class="name">{{ contact.name }}</p>
                   <p class="email">{{ contact.email }}</p>
              </div>
          </li>
      </ul>
      

      【讨论】:

      • 只是一个建议,如果您在加载完 api 调用后尝试 &lt;ul v-if="contactsNotEmpty" 这个布尔变量切换到 true
      • @ElAlamiAnas 谢谢,但它显示属性或方法“contactsNotEmpty”未在实例上定义,但在渲染期间引用。通过初始化该属性,确保此属性是反应性的,无论是在数据选项中,还是对于基于类的组件。
      【解决方案3】:

      第一个错误是在您的Conversation.vue 中抛出,您正在将数据传递给子组件,您必须确保它被定义为该组件中的道具

      export default{ props: ['contact'] };

      如果它被定义,你的prop type 不期望一个空值。我会将其更改为字符串并在我的ChatApp.vue 中呈现时,我会将selectedContact 设置为 string.Empty||''

      对于第二个错误,您的响应对象中缺少头像键。在访问它之前,您必须先检查它是否存在。请参考上面 El Alami Anas 的回答。

      【讨论】:

      • 为你添加了 conversation.vue 文件。谢谢
      • 您在coveration.vue 中的contact prop 数据需要一个对象,您将一个空值传递给它。在您的ChatApp.vue 中,将selectedContact 更改为{}。在 Conversation.vue 中将 contact 属性的默认类型更改为 {}
      • 仍然参考@El Amani 回答您关于为什么头像未定义的类型错误
      猜你喜欢
      • 2022-01-24
      • 2019-08-08
      • 2018-07-13
      • 2018-09-17
      • 2022-07-14
      • 2021-08-20
      • 2020-07-07
      • 2019-03-30
      • 2019-01-10
      相关资源
      最近更新 更多