[Vue警告]:属性或方法未在实例上定义,但在呈现期间引用

Lor*_*oro 71 javascript vue.js vue-component vuejs2

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];
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

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

[Vue警告]:属性或方法"changeSetting"未在实例上定义,但在呈现期间引用.确保在数据选项中声明反应数据属性.(找到<MainTable>)

Win*_*ing 81

问题

[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>" +
Run Code Online (Sandbox Code Playgroud)

但是,该changeSetting方法未在MainTable组件中定义.它在根组件中定义:

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

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

父模板中的所有内容都在父作用域中编译; 子模板中的所有内容都在子范围内编译.

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

我能做些什么呢?

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

看起来很简单,但这就是我的建议.

你可能希望你的MainTable组件是一个愚蠢/表达的组件.(如果你不知道它是什么,那么这里有一些东西要读; dr是这个组件只负责呈现某些东西 - 没有逻辑).智能/容器元素负责逻辑 - 在您的问题中给出的示例中,根组件将是智能/容器组件.使用此体系结构,您可以使用Vue的父子通信方法进行交互.您传递MainTable通过道具的数据并MainTable通过事件将用户操作发送到其父级.它可能看起来像这样:

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
    },
  },
}),
Run Code Online (Sandbox Code Playgroud)

以上内容应该足以让您了解如何做和kickstart解决您的问题.

  • 这是当前最优选的方法吗?Vue的事情一直在发展,所以我尽管问 (3认同)

tno*_*007 28

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

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

<script>
export default {
  name: "MyComponent",
  data() {
    return {
      name: ""
    };
  }
</script>
Run Code Online (Sandbox Code Playgroud)

  • lmfao 这个评论救了我 (6认同)
  • 2020 年我在这里,我写了日期 (5认同)
  • “如果有人遇到我遇到的同样愚蠢的问题,请确保您的组件的“数据”属性拼写正确。”哈哈,这确实是一个非常愚蠢的问题:)谢谢伙计 (3认同)
  • 这个评论救了我!我在“数据”属性中定义了“计算”。 (2认同)
  • 如果没有这些问题,Vue 会做得更好...... (2认同)

fra*_*vel 17

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

</script>
Run Code Online (Sandbox Code Playgroud)

标签。

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

  • 老兄……就是这样!我永远不会发现这个。 (5认同)
  • 谢谢。在找到这个解决方案之前,我仔细查看了所有内容。 (2认同)

小智 8

可能是拼写错误造成的

我在脚本结束标记处出现拼写错误

</sscript>
Run Code Online (Sandbox Code Playgroud)


lui*_*7up 8

记得归还财产

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

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

export default {

  setup(){

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

    return {search}

  }
}
Run Code Online (Sandbox Code Playgroud)

注意:我正在使用 Composition API


Dan*_*atz 5

也添加我的一点,如果有人像我一样挣扎,请注意方法是区分大小写的单词:

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

<script>
export default {
  name: "MyComponent",
  Methods: {
      name() {return '';}
  }
</script>
Run Code Online (Sandbox Code Playgroud)

“方法”应该是“方法”


Chu*_*Jr. 5

如果您遇到此问题,请检查以确保您没有

methods: {
...
}
Run Code Online (Sandbox Code Playgroud)

或者

computed: {
...
}
Run Code Online (Sandbox Code Playgroud)

宣布两次