VueJS路由器查看反应道具未定义

Posted

技术标签:

【中文标题】VueJS路由器查看反应道具未定义【英文标题】:VueJS Router View reactive prop not defined 【发布时间】:2019-10-05 14:43:11 【问题描述】:

我正在制作基于 Router-View 的应用程序,并尝试创建填充来自反应属性的数据的表。到目前为止,我收到了一个未定义的错误:

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

这是脚本:

<script>

import axios from 'axios'

export default 
    data () 
        return 
            messages : [],
        
    ,
    mounted() 
        this.getMessages()
    ,
    methods: 
        getMessages() 
            let uri = 'http://localhost:8000/api/messages'
            axios.get(uri).then(response => 
                this.messages = response.data.data
            )
        ,
    

这是模板:

<table class="table">
    <thead>
        <tr>
            <th>Title</th>
            <th>Content</th>
            <th>Options</th>
        </tr>
    </thead>
    <tbody>
        <tr v-for="message in messages">
            <td> message.title </td>
        </tr>
    </tbody>
</table>

我已经阅读了 VueJS 文档,查看了其他一些项目,我确信它是正确的。我有父 App.js,我在其中定义了 Router-View 页面。

【问题讨论】:

如果您在this.messages = response.data.data 上方的行中执行console.log(response.data.data) 会得到什么? 你试过撒谎吗..&lt;tbody v-if="messages"&gt;&lt;tbody v-if="messages.length &gt; 0"&gt; ..? @BenjaminBeganović 我确定长度是 1 嗯,那是&gt; 0,对吧?你使用 Vue devtools 扩展吗? @BenjaminBeganović 是的length &gt; 0 is True。我正在使用 Vue Dev Extensions,它似乎在消息组件中没有任何属性。我正在使用侧边栏组件,它是唯一具有属性的组件。此外,消息组件中的控制台日志不起作用,但它在主组件中起作用 【参考方案1】:

乍一看,有两点很突出:

    this.axios 在我看来是错误的(不知道您的完整组件的外观)。您可以在每个需要使用它的 .vue 文件中导入 axios,也可以全局导入它。.. 您似乎错过了axios 通话结束时的)..

可能的解决方案:

    Import Axios globally

    您的组件应如下所示:

    import axios from  'axios'
    
    export default 
        data() 
            return 
                messages: []
            
        ,
        mounted() 
            this.getMessages()
        ,
        methods: 
            // could also give this a shot...although I doubt this is the issue
            // var self = this;
            getMessages() 
                let uri = 'http://localhost:8000/api/messages';
                axios.get(uri).then(response => 
                    // is anything shown here?
                    console.log(response);
                    return response.data.data;
                    // or..
                    // return response.data;
                ).catch(err => 
                    alert(err);
                ).then(data => 
                    this.messages = data;
                    // or...
                    // self.messages = data;
                );
            
        
    
    

    您也可以尝试在循环内的项目中添加key..

    <tr v-for="(message, index) in messages" :key="index">
        <td> message.title </td>
    </tr>
    

【讨论】:

我发布此内容时正在使用手机,这就是为什么它看起来未完成的原因。我现在更新了线程。请检查,我已经应用了您的解决方案,但没有奏效。另外,当我尝试console.log(response.data.data) 时,我在控制台中没有得到任何东西 如果你做console.log(response.data)怎么办?它不起作用的原因是response.data.data 中没有任何内容可显示。 API 是否正常工作?如果直接/手动查询,是否可以检索数据? 是的 API 正在工作,console.log 没有执行它甚至没有显示空数组或新行或其他任何内容 @GhoSTBG 如果您的日志输出为空,请尝试捕获任何可能的错误:.catch((err) =&gt; console.log(err); ) @GhoSTBG 我还更新了我的答案,你可以尝试一些其他的事情..【参考方案2】:

问题是我忘记关闭文档末尾的标签了。

【讨论】:

以上是关于VueJS路由器查看反应道具未定义的主要内容,如果未能解决你的问题,请参考以下文章

路由器道具和自定义道具与打字稿反应路由器dom用于功能组件

使用 RouteComponentProps 和自定义道具反应路由

VueJS 路由器:$route 未定义

Laravel - 使用惯性访问路由来填充 Vuejs3 中的道具

当路由器在 vuejs2.0 中更改时,vue-route 将不同的道具传递给不同的视图组件?

text 传递道具来反应路由器组件