我有以下设置:
CustomForm.vue
<template>
<div>
<input v-model="field1" >
<input v-model="field2" >
</div>
</template>
<script>
export default {
data () {
return {
field1: '',
field2: '',
}
}
}
</script>
Parent.vue
<template>
<div>
<child>
<template>
<custom-form />
</template>
</child>
</div>
</template>
<script>
import Child from ...
import CustomForm from ...
</script>
Child.vue
<template>
<div>
<button @click="click" />
<grand-child>
<template>
<slot></slot>
</template>
</grand-child>
</div>
</template>
<script>
import GrandChild from...
export default {
methods: {
click: function () {
var data = ... // get form data
// do something with data then $emit
this.$emit('custom-click', data)
}
}
}
}
</script>
GrandChild.vue
<template>
<div v-for="(item, index) in list" :key="index" >
<input ...>
<input ...>
<slot></slot>
</div>
</template>
基本上我有一个CustomForm,我想将表单从Parent.vue传递给GrandChild.vue,但是问题是我不知道如何在Child.vue中检索CustomForm数据(field1,field2),即从Child.vue中的click
方法中获取CustomForm值?谢谢
答案 0 :(得分:0)
还有其他方法,而不是尝试从插槽中提取数据。一种解决方案是使用Vue的provide
/inject
功能注入表单数据。
首先,设置CustomForm
以允许v-model
捕获Parent
中的表单数据:
CustomForm
中提交表单后,发出带有表单数据的input
事件。value
道具。CustomForm.vue:
<template>
<form @submit.prevent="submit"> <!-- (1) -->
</form>
</template>
<script>
export default {
props: ['value'], // <-- (2)
methods: {
submit(e) { // <-- (1)
const form = e.target
const formData = {}
for (const [key, value] of new FormData(form).entries()) {
formData[key] = value
}
this.$emit('input', formData)
}
}
}
</script>
然后Parent
可以绑定表单数据:
parentForm
的数据中将Parent
定义为具有子属性的对象(例如parentForm.data
)。CustomForm
的{{1}}。Parent.vue:
v-model
现在,<template>
<child>
<custom-form v-model="parentForm.data" /> <!-- (4) -->
</child>
</template>
<script>
export default {
data() {
return {
parentForm: { // <-- (3)
data: {}
}
};
}
}
</script>
可以提供Parent
:
form
方法,该方法返回具有provide
子属性的对象。form
属性。Parent.vue:
parentForm
...并且export default {
provide() { // <-- (5)
return {
form: this.parentForm // <-- (6)
}
}
}
或Child
可以注入GrandChild
:
form
属性,其值是一个包含inject
((5)中的子属性名称)的字符串数组。GrandChild.vue:
form