RouterLink attrs 是只读的

Posted

技术标签:

【中文标题】RouterLink attrs 是只读的【英文标题】:RouterLink attrs is readonly 【发布时间】:2018-09-30 20:20:39 【问题描述】:

我从 Vue.js 中的 VueRouter 开始,但出现以下错误:

[Vue warn]: $attrs is readonly.

found in

---> <RouterLink>
   <SecondNav> at resources\assets\js\modules\livegame\player\SecondNav.vue
     <Player> at resources\assets\js\modules\livegame\player\Player.vue
       <Root>

[Vue warn]: $listeners is readonly.

found in

---> <RouterLink>
   <SecondNav> at resources\assets\js\modules\livegame\player\SecondNav.vue
     <Player> at resources\assets\js\modules\livegame\player\Player.vue
       <Root>

我已经尽我所能减少了,结果是问题只出在路由器上。我是根据文档做的,我不知道问题出在哪里。这是我的组件:

SecondNav.vue

<template>
<div class="row second-top-nav">
    <div class="col-md-offset-1 col-md-11">
        <ul class="nav">
            <li>
                <router-link to='/public/livegame/player/history'>
                    History
                </router-link>
            </li>
        </ul>
    </div>
</div>
</template>

<script>
    export default 
</script>

播放器.vue

<template>
<div>
    <second-nav></second-nav>
</div>
</template>

<script>
import SecondNav from './SecondNav';

export default 
    components: 
        SecondNav
    ,

</script>

路由器.js

import Vue from 'vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

import History from './history/History';

export default new VueRouter(
   mode: 'history',
   routes: [
    path: '/public/livegame/player/history', component: History, name: 'player_history',
   ],
   linkActiveClass: "active", // active class for non-exact links.
);

起点 player.js

window.Event = new Vue();

import Vue from 'vue';

import router from './router'
import Player from './Player.vue';

let vm = new Vue(
   el: '#player',
   router,
   components: 
      Player    
   ,
);

window.vm = vm;

我不知道问题出在哪里或我做错了什么。应用程序中的所有内容似乎都可以正常工作,但这些通知看起来并不完全正确。我正在使用 Vue.js 2.5.16 版和 VueRouter 3.0.1 版。

【问题讨论】:

【参考方案1】:

拥有多个 Vue 实例会导致这个问题...

修复了这个警告:Vue 警告 $attrs 是只读的。发现在...

通过删除import Vue from 'vue'

同时保持import VueRouter from 'vue-router'

修复的原因:vue 被加载了两次。 Vue 在 VueRouter 的顶部导入。不需要在VueRouter之前导入。

【讨论】:

我解决了类似的问题:在 main.js 中删除 import Vue from 'vue' 并只留下路由器和下面的其他东西(假设您使用的是 vue 路由器)【参考方案2】:

拥有多个 Vue 实例可能会导致此问题。在您的player.js 文件中,您可以这样做

window.Event = new Vue();

然后紧接着:

let vm = new Vue( ... )

尝试删除第一个new Vue,这应该会有所帮助。由于您通过调用Vue.use(VueRouter) 来全局注册路由器,因此您有两个 vue 实例,它们都有自己的路由器。当第二个实例挂载并尝试注册路由器时,由于第一个实例已经这样做了,您会收到 readonly 错误。

import 实例也被提升到文件的顶部,因此尽管您在顶部声明 window.Event = new Vue,但实际上 import 实例发生在任何变量声明和赋值之前。

【讨论】:

以上是关于RouterLink attrs 是只读的的主要内容,如果未能解决你的问题,请参考以下文章

"$attrs 是只读的","$listeners 是只读的","避免直接改变一个 prop"

具有“只读”和“禁用”等属性的敲除 attr 绑定

RouterLink 不会在单击时导航到组件,而是在加载同一模块中的其他组件后导航

在 VueJS 中访问 $route.params

关于 jquery中的 只读两种属性(readonly,disabled),

在Java中的Windows上创建没有只读属性的目录