[Vue 警告]:属性或方法未在实例上定义但在渲染期间被引用

IT技术 javascript vue.js vuejs2 vue-component
2021-01-17 06:45:43
var MainTable = Vue.extend({
  template: "<ul>" +
    "<li v-for='(set,index) in settings'>" +
    "{{index}}) " +
    "{{set.title}}" +
    "<button @click='changeSetting(index)'> Info </button>" +
    "</li>" +
    "</ul>",
  data: function() {
    return data;
  }
});

Vue.component("main-table", MainTable);

data.settingsSelected = {};
var app = new Vue({
  el: "#settings",
  data: data,
  methods: {
    changeSetting: function(index) {
      data.settingsSelected = data.settings[index];
    }
  }
});

使用上面的代码,单击按钮时会出现以下错误。

[Vue 警告]:属性或方法“changeSetting”未在实例上定义,但在渲染期间被引用。确保在数据选项中声明react数据属性。(在 中找到<MainTable>

6个回答

问题

[Vue warn]: Property or method "changeSetting" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option. (found in <MainTable>)

发生错误是因为在此处changeSettingMainTable组件中引用了该方法

    "<button @click='changeSetting(index)'> Info </button>" +

但是该changeSetting方法并未在MainTable组件中定义它在此处的根组件中定义:

var app = new Vue({
  el: "#settings",
  data: data,
  methods: {
    changeSetting: function(index) {
      data.settingsSelected = data.settings[index];
    }
  }
});

需要记住的是,属性和方法只能在定义的范围内被引用。

父模板中的所有内容都在父范围内编译;子模板中的所有内容都在子范围内编译。

您可以在 Vue 的文档 中阅读有关组件编译范围的更多信息

我该怎么办?

到目前为止,已经有很多关于在正确范围内定义事物的讨论,所以修复只是将changeSetting定义移到MainTable组件中?

看起来很简单,但这是我推荐的。

您可能希望您的MainTable组件成为一个愚蠢的/展示性组件。如果你不知道它是什么,这里有一些东西可以阅读,但 tl;dr 是组件只负责渲染某些东西——没有逻辑)。smart/container 元素负责逻辑 - 在您的问题中给出的示例中,根组件将是 smart/container 组件。有了这个架构,你就可以使用Vue的父子通信方式让组件进行交互。您将数据传递给MainTablevia props,MainTable通过events将用户操作发送到其父级它可能看起来像这样:

Vue.component('main-table', {
  template: "<ul>" +
    "<li v-for='(set, index) in settings'>" +
    "{{index}}) " +
    "{{set.title}}" +
    "<button @click='changeSetting(index)'> Info </button>" +
    "</li>" +
    "</ul>",
  props: ['settings'],
  methods: {
    changeSetting(value) {
      this.$emit('change', value);
    },
  },
});


var app = new Vue({
  el: '#settings',
  template: '<main-table :settings="data.settings" @change="changeSetting"></main-table>',
  data: data,
  methods: {
    changeSetting(value) {
      // Handle changeSetting
    },
  },
}),

以上应该足以让您很好地了解该怎么做并开始解决您的问题。

@Aseem:分离代码的关注点以使事情更容易理解和改变是永恒的。答案中描述的方法将数据的关注点和数据呈现的关注点分开,这只是如何完成事情的一个示例。我不会评估该方法是否“当前”,而是评估它是否使代码更易于更改和理解。
2021-03-14 06:45:43
@FlasHfromRu:您可以从中引用内容,$root但总的来说这不是一个好主意。请参阅 Vue文档中有关访问根实例的说明:“这对于演示或具有少量组件的非常小的应用程序非常方便。但是,该模式不能很好地扩展到中型或大型应用程序,因此我们强烈建议使用Vuex在大多数情况下管理状态。”
2021-04-04 06:45:43
我不是 Vue 的专家,但是stackoverflow.com/questions/43292810/...建议您可以通过$root. 例如this.$root.changeSetting(value)changeSetting(..)在这种情况下直接来自组件对我来说看起来更方便...
2021-04-08 06:45:43
这是目前最受欢迎的方法吗?事情在 Vue 中不断发展,所以我想我会问
2021-04-11 06:45:43

如果有人遇到我遇到的同样愚蠢的问题,请确保您的组件的“数据”属性拼写正确。(例如data,而不是date

<template>
    <span>{{name}}</span>
</template>

<script>
export default {
  name: "MyComponent",
  data() {
    return {
      name: ""
    };
  }
</script>
我在 2020 年来到这里,我写了 DATE
2021-03-25 06:45:43
Should anybody land with the same silly problem I had, make sure your component has the 'data' property spelled correctly. 大声笑真的是一个非常愚蠢的问题:)谢谢男人
2021-04-02 06:45:43
当您拼错属性名称时,它会引发相同的错误。对我来说这是因为我datas在模板中使用了复数
2021-04-05 06:45:43
lmfao 这个评论救了我
2021-04-07 06:45:43
这条评论救了我!我在“数据”属性中定义了“计算”。
2021-04-12 06:45:43

就我而言,原因是,我只忘记了关闭

</script>

标签。

但这导致了相同的错误消息。

哥们……就是这样!我永远不会发现这个。
2021-04-03 06:45:43
OMFG 谢谢!
2021-04-03 06:45:43
谢谢你。在找到这个解决方案之前,我四处看了看。
2021-04-11 06:45:43
出乎意料的是,我几个小时的错误就是这个:)
2021-04-12 06:45:43

记得归还财产

在渲染期间访问属性“搜索”但未在实例定义的另一个原因是当您忘记在setup(){}函数中返回变量时

所以记得在最后加上return语句:

export default {

  setup(){

    const search = ref('')
    //Whatever code

    return {search}

  }
}

注意:我使用的是 Composition API

可能是拼写错误造成的

我在脚本结束标记处输入错误

</sscript>