如何访问插槽中子组件的反应数据?
How to access child component's reactive data in a slot?
目前,我有一个父组件,它渲染一个子组件,并将一个组件(模态,称为Modal.vue)作为插槽传递给子组件。
Parent.vue
<ChildComponent :id='1>
<modal slot="modal" :postTitle="'test'" />
</ChildComponent>
Child.vue
export default {
props : ['id'],
data(){
return {
modalHeading : "Heading"
}
}
<template>
<slot name="modal"></slot>
</template>
Modal.vue
<script>
export default {
name: "model",
props: ["postTitle"],
data() {
return {
heading: "test"
};
},
mounted() {
console.log("mounted modal slot");
console.log(this.postTitle);
console.log(this.modalHeading);
};
</script>
<template>
<div>
<h2>{{ modalHeading }}</h2>
<h3>This will be the modal slot</h3>
<p>{{ postTitle }}</p>
</div>
</template>
我的问题是,如何在我的插槽组件中访问子项的数据(和函数)?
我一直在尝试让它与作用域插槽一起使用,但似乎无法破解语法。
I'm trying to basically display some of the child data in the modal slot. Essentially The parent component is a page, the child component is a table, the slot is a modal. For each table row clicked on, a modal appears with the tables data in it. How would you suggest doing this
也许是这样的?
<template>
<div>
<table>
<row v-for="item in items" @click="onRowClick(item)"
....show some data
</row>
</table>
<modal v-if="activeItem" :item="activeItem" @onClose="onModalClose" />
</div>
</template>
<script>
export default {
name: 'child',
props: ["items"]
data() {
return {
activeItem: null
}
},
methods: {
onRowClick(item) {
this.activeItem = item;
},
onModalClose() {
this.activeItem = null;
}
}
}
</script>
I don't understand how this has the flexibility of a slot?
嗯,它不像插槽那样灵活,但它完成了工作:)
如果您确实需要设计您的Child/table组件,允许在不同的地方使用它并改变它的一部分的外观(行细节在你的情况),插槽是要走的路....
插槽
Slots 是内容分发渠道。当你在你的组件中放置一个插槽时,你说的是 "My parent component can provide a partial template. When this template is rendered (inside parent's component scope - important because that template has access only to parent's data/methods etc.), I'll take that rendered result and put it at this exact place inside my own template"。使用常规插槽就像 将 HTML 传递到您的组件 .
My question is, how can I access the child's data (and functions) in my slot component?
您必须明确地授予插槽模板访问部分子数据的权限。假设你的子组件有 prop item
。您可以像这样在其中定义 scoped slot:
<slot name="rowExpander" :itemProp="item"></slot>
...并像这样在 parent 中使用它:
<template v-slot:rowExpander="slotProps">
<MyRowExpanderComponent :item="slotProps.itemProp" />
</template>
<template v-slot:rowExpander="{ itemProp }">
<MyRowExpanderComponent :item="itemProp" />
</template>
几乎可以将任何东西传递到作用域插槽中 - data/props/method/computed,您甚至可以使用实例属性,例如 $data
或 $props
:
<slot name="rowExpander" :childProps="$props"></slot>
无法传递子实例本身:
<slot name="rowExpander" :child="this"></slot>
(主要是因为 this
没有在模板中定义 - 我认为如果你在没有模板的情况下使用 render 函数编写组件就可以做到,但那是另一回事了)
了解作用域插槽模板只是常规 Vue 模板很重要。它可以访问定义它的组件(父级)的所有实例属性 并且另外 可以访问 slotProps
对象。当您在作用域插槽模板中使用组件时,该组件 没有 访问所有子数据或 slotProps
自动神奇地 -你仍然需要明确地将它传递给它(就像我上面的 MyRowExpanderComponent
示例)
目前,我有一个父组件,它渲染一个子组件,并将一个组件(模态,称为Modal.vue)作为插槽传递给子组件。
Parent.vue
<ChildComponent :id='1>
<modal slot="modal" :postTitle="'test'" />
</ChildComponent>
Child.vue
export default {
props : ['id'],
data(){
return {
modalHeading : "Heading"
}
}
<template>
<slot name="modal"></slot>
</template>
Modal.vue
<script>
export default {
name: "model",
props: ["postTitle"],
data() {
return {
heading: "test"
};
},
mounted() {
console.log("mounted modal slot");
console.log(this.postTitle);
console.log(this.modalHeading);
};
</script>
<template>
<div>
<h2>{{ modalHeading }}</h2>
<h3>This will be the modal slot</h3>
<p>{{ postTitle }}</p>
</div>
</template>
我的问题是,如何在我的插槽组件中访问子项的数据(和函数)?
我一直在尝试让它与作用域插槽一起使用,但似乎无法破解语法。
I'm trying to basically display some of the child data in the modal slot. Essentially The parent component is a page, the child component is a table, the slot is a modal. For each table row clicked on, a modal appears with the tables data in it. How would you suggest doing this
也许是这样的?
<template>
<div>
<table>
<row v-for="item in items" @click="onRowClick(item)"
....show some data
</row>
</table>
<modal v-if="activeItem" :item="activeItem" @onClose="onModalClose" />
</div>
</template>
<script>
export default {
name: 'child',
props: ["items"]
data() {
return {
activeItem: null
}
},
methods: {
onRowClick(item) {
this.activeItem = item;
},
onModalClose() {
this.activeItem = null;
}
}
}
</script>
I don't understand how this has the flexibility of a slot?
嗯,它不像插槽那样灵活,但它完成了工作:)
如果您确实需要设计您的Child/table组件,允许在不同的地方使用它并改变它的一部分的外观(行细节在你的情况),插槽是要走的路....
插槽
Slots 是内容分发渠道。当你在你的组件中放置一个插槽时,你说的是 "My parent component can provide a partial template. When this template is rendered (inside parent's component scope - important because that template has access only to parent's data/methods etc.), I'll take that rendered result and put it at this exact place inside my own template"。使用常规插槽就像 将 HTML 传递到您的组件 .
My question is, how can I access the child's data (and functions) in my slot component?
您必须明确地授予插槽模板访问部分子数据的权限。假设你的子组件有 prop item
。您可以像这样在其中定义 scoped slot:
<slot name="rowExpander" :itemProp="item"></slot>
...并像这样在 parent 中使用它:
<template v-slot:rowExpander="slotProps">
<MyRowExpanderComponent :item="slotProps.itemProp" />
</template>
<template v-slot:rowExpander="{ itemProp }">
<MyRowExpanderComponent :item="itemProp" />
</template>
几乎可以将任何东西传递到作用域插槽中 - data/props/method/computed,您甚至可以使用实例属性,例如 $data
或 $props
:
<slot name="rowExpander" :childProps="$props"></slot>
无法传递子实例本身:
<slot name="rowExpander" :child="this"></slot>
(主要是因为 this
没有在模板中定义 - 我认为如果你在没有模板的情况下使用 render 函数编写组件就可以做到,但那是另一回事了)
了解作用域插槽模板只是常规 Vue 模板很重要。它可以访问定义它的组件(父级)的所有实例属性 并且另外 可以访问 slotProps
对象。当您在作用域插槽模板中使用组件时,该组件 没有 访问所有子数据或 slotProps
自动神奇地 -你仍然需要明确地将它传递给它(就像我上面的 MyRowExpanderComponent
示例)