首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue警告$listeners和$attrs是只读的

Vue警告$listeners和$attrs是只读的
EN

Stack Overflow用户
提问于 2018-11-08 10:44:10
回答 4查看 8.8K关注 0票数 4

我收到了很多Vue警告,说$listeners是只读的,或者$attrs是只读的,并且与不同的引导项相关。

例如:

代码语言:javascript
复制
[Vue warn]: $attrs is readonly.

found in

---> <BDropdown>
       <Display>
         <App>
           <Root>

我非常肯定它与加载Vue实例两次有关,但我不知道如何以其他方式来实现它,这样路由仍然有效。

在我的main.js中,代码如下:

代码语言:javascript
复制
import Vue from 'vue'
import App from './App'
import router from './router'
import firebase from 'firebase';
import './components/firebaseInit';
import store from './store';
import { i18n } from './plugins/i18n.js'
import BootstrapVue from 'bootstrap-vue'
import VueCarousel from 'vue-carousel';

import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

Vue.use(BootstrapVue);
Vue.use(VueCarousel);

let app;
firebase.auth().onAuthStateChanged(user => {
  if(!app) {
    app = new Vue({
      el: '#app',
      router,
      store,
      i18n,
      components: { App },
      template: '<App/>'
    })
  }
})

我的路由器/index.js代码如下所示:

代码语言:javascript
复制
import Vue from 'vue'
import Router from 'vue-router'
import firebaseApp from '@/components/firebaseInit'

Vue.use(Router)

let router = new Router({
  routes: [
    {
      path: '/',
      name: 'display',
      component: Display
    },
  ...
  ]
})

// Nav Guards
router.beforeEach((to, from, next) => {
  // check for requiredAuth
  if(to.matched.some(record => record.meta.requiresAuth)) {
    // check if NOT logged in
    ...
    } else {
      // proceed to route
      next();
    }
  } else {
    next();
  }
})

export default router;

由于示例错误来自Display.vue,下面是该代码的摘录:

代码语言:javascript
复制
<template>
  <div>
    <b-row>
      <b-input-group prepend="Category">
        <b-dropdown v-bind:text="currentCategory">
          <b-dropdown-item @click="categroyChanged('All')">All</b-dropdown-item>
          <b-dropdown-item v-for="c in categories" v-bind:key="c" @click="categoryChanged(c)">{{c}}</b-dropdown-item>
        </b-dropdown>
      </b-input-group>
    </b-row>
    <div class="row" v-for="i in Math.ceil(products.length / 3)" v-bind:key="i">
      <div v-for="product in products.slice((i - 1) * 3, i * 3)" v-bind:key="product.id" class="col-md-4 col-6 my-1">
        <b-card 
          v-bind:img-src="product.thumbUrl"
          img-fluid
          img-alt="image"
          overlay>
          <div slot="footer">
            <small class="text-muted">{{product.name}}<br />{{product.price}} VND</small>   
          </div>
            <router-link v-bind:to="{name: 'view-product', params: {product_id: product.product_id}}" class="secondary-content">
              <i class="fa fa-eye"></i>
            </router-link>
            <router-link v-if="isEmployee" v-bind:to="{name: 'edit-product', params: {product_id: product.product_id}}" class="secondary-content">
              <i class="fa fa-pencil"></i>
            </router-link>
            <button @click='addToCart(product)' class='button is-info'><i class="fa fa-cart-arrow-down"></i></button>
        </b-card>
      </div>
    </div>
  </div>
</template>

<script>        
import firebaseApp from './firebaseInit'
import { mapActions } from 'vuex'

export default {
  name: 'display',
  data () {
    return {
      txtSearch: null,
      isLoggedIn: false,
      currentUser: false,
      isEmployee: false,
      products: []
    }
  },
  beforeMount () {
    var db = firebaseApp.firestore();
      db.collection('products').get().then(querySnapshot => {
        querySnapshot.forEach(doc => {
          const data = {
              'product_id': doc.id,
              'article_number': doc.data().article_number,
              'barcode': doc.data().barcode,
              'category': doc.data().category,
              'colour': doc.data().colour,
              'description': doc.data().description,
              'name': doc.data().name,
              'name_ger': doc.data().name_ger,
              'price': doc.data().price,
              'size': doc.data().size,
              'thumbUrl': doc.data().thumbUrl,
          }
          this.products.push(data)
        })
      }) 
    }
  },
  methods: {
    ...mapActions(['addToCart']),

    ... many methods ...

  }
}
</script>

我怎样才能摆脱这些错误呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-12-10 10:31:56

造成这种情况的原因有两个:

多Vue位置

这可能是由于您在不同的文件中导入Vue的位置相互矛盾,就像其他人说的那样。例如,您的代码中可能同时有import Vue from 'vue'import Vue from 'vue.runtime.esm'

但是这可以是导致Vue的多个实例,这将导致这些错误。

在这种情况下,解决方案是在代码中的任何地方使用import Vue from 'vue',然后在打包系统中别名它(webpack、Parcel、汇总等等)。在webpack.config.jswebpack.renderer.config.js中使用电子的例子如下:

代码语言:javascript
复制
module.exports = {
  // ...
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js' // 'vue/dist/vue.common.js' for webpack 1
    }
  }
  // ...
}

Vue文档中的更多示例

白名单

这也可能是因为需要将Vue白名单为而不是,例如webpack的externals之一。

值得注意的是,Bootstrap Vue中从2.0到更晚版本的更改(肯定是2.15 (可能更早))导致了同样的问题发生。

代码语言:javascript
复制
module.exports = {
  // ...
  externals: [
    'fast-glob',
    'jquery',
    'bunyan',
    'yaml',
    'vue',              // Remove this
    'bootstrap-vue',    // Remove this
  // ...
}
票数 6
EN

Stack Overflow用户

发布于 2019-05-25 05:25:11

在追逐了一个小时之后,我意识到我拥有imported的一个组件也在访问Vue。该文件的顶部是import Vue from 'vue/dist/vue.esm'。所有其他文件都只是执行import Vue from 'vue',这是我的双导入的来源。

不同的javascript打包器有不同的方法解析重复。对于WebPack,在依赖项导入不同Vue实例的情况下,解析配置可能会有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2020-06-08 12:43:59

这是我的案例(https://stackoverflow.com/a/62262296/4202997),但为了节省时间,我将在这里重复一遍:我从CDN导入vue。我只是删除了脚本,问题就解决了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53206078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档