Vuejs 属性或方法未在实例上定义,但在渲染期间引用
Posted
技术标签:
【中文标题】Vuejs 属性或方法未在实例上定义,但在渲染期间引用【英文标题】:Vuejs Property or method is not defined on the instance but referenced during render 【发布时间】:2018-07-13 19:28:33 【问题描述】:我是 VueJS 的新手,我正在尝试创建一个自定义表单组件。
我正在使用http://element.eleme.io 元素。于是我新建了一个 Form.vue 文件
<template>
<el-form :model="data">
<slot></slot>
</el-form>
</template>
<script>
import FormItem, Input from 'element-ui';
export default
name: 'general-form',
components:
FormItem,
Input
,
props: ['data'],
mounted: function()
console.log(this.data);
</script>
这是我的 app.js
// Element.io
import Form, FormItem, Input from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// Custom
import GeneralForm from '../../components/presentational-subsystem/form/Form.vue';
Vue.use(Form);
Vue.use(FormItem);
Vue.use(Input);
Vue.config.devtools = true;
var contactsPage = new Vue(
el: '#contacts-page',
components:
GeneralForm
);
这是我的观点:
<div id="contacts-page">
<general-form id="contacts-form" :data="subject: 'abc'" action="/contacts" method="post">
<el-form-item label="Subject" prop="subject">
<el-input v-model="data.subject"></el-input>
</el-form-item>
</general-form>
</div>
但我在控制台中收到此错误:
[Vue 警告]:属性或方法“formData”未在实例上定义,但在渲染期间被引用。通过初始化该属性,确保此属性是反应性的,无论是在数据选项中,还是对于基于类的组件。
我知道如果我把 Vue 对象改成这样:
var contactsPage = new Vue(
el: '#contacts-page',
data: formData:
components:
GeneralForm
);
错误消失了,但是表单不再是反应性的。我试着按照这个例子:
http://element.eleme.io/#/en-US/component/form
我的标记实际上是相同的,但是当我使用 Vue 开发工具时,我可以看到我的 Form.vue 组件中的 formData 变量与我的 Vue 实例中的共享 formData 变量不同。
我的问题是如何让 <el>
元素使用我创建的表单组件中的 formData?
【问题讨论】:
【参考方案1】:当您使用slot
时,它的范围——它的数据来自哪里——是父级。您的插槽的内容引用您在子级中定义的formData
。您可以使用 scoped slots 将子数据传递到插槽
或者,您可以在父级中完全定义formData
,并将其作为prop
传递给子级,子级将其作为道具传递给el-form
。
这个结构:
<el-form :model="formData">
<slot></slot>
</el-form>
您是否将formData
从您的Form
组件传递到el-form
组件。它不会传递到插槽。插槽不是子级,它们是从父级注入的代码。
父代码:
<general-form id="contacts-form" action="/contacts" method="post">
<el-form-item label="Subject" prop="subject">
<el-input v-model="formData.subject"></el-input>
</el-form-item>
</general-form>
正在创建您的 Form
组件的实例并注入 el-form-item
作为插槽内容。您遇到的错误是在该插槽内容中引用 formData
,因为插槽的上下文是父级。插槽对注入的内容一无所知(除非您使用作用域插槽)。
在更新的代码中:
<general-form id="contacts-form" :data="subject: 'abc'" action="/contacts" method="post">
<el-form-item label="Subject" prop="subject">
<el-input v-model="data.subject"></el-input>
</el-form-item>
</general-form>
您在此处将 data
道具传递给 Form
孩子,但尝试在插槽内容中使用它。 el-input
正在父级中查找 data
。试试这个:
var contactsPage = new Vue(
el: '#contacts-page',
data:
data: subject: 'abc'
,
components:
GeneralForm
);
和
<general-form id="contacts-form" :data="data" action="/contacts" method="post">
<el-form-item label="Subject" prop="subject">
<el-input v-model="data.subject"></el-input>
</el-form-item>
</general-form>
【讨论】:
我未能完全理解您的评论。因此,如果我的 Form.vue 中有以上是关于Vuejs 属性或方法未在实例上定义,但在渲染期间引用的主要内容,如果未能解决你的问题,请参考以下文章