Vuejs 在父组件中使用插槽变量

ber*_*rdh 1 vue.js vuejs2

假设我们有一个表单组件:

<!-- appform.vue -->
<template>
    <form @submit.prevent="onSubmit">
        <slot></slot>
        <input type="submit">
    </form>
</template>
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我想使用它并向其动态添加表单域:

<!-- app.vue -->
<template>
    <appform>
        <input type="text" name="firstname" />
        <input type="text" name="lastname" />
    </appform>
</template>
Run Code Online (Sandbox Code Playgroud)

现在我需要告诉 vuejs,我想将每个输入字段绑定到 appform 组件数据字段的“模型”变量。

<!-- app.vue -->
<template>
    <appform>
        <input type="text" name="firstname" :model="model.firstname" />
        <input type="text" name="lastname" :model="model.lastname" />
    </appform>
</template>
Run Code Online (Sandbox Code Playgroud)

当然,这是行不通的,因为 vuejs 说,该模型不在应用程序数据字段内。如何告诉它使用 appform 组件的“模型”而不是当前范围?

Ber*_*ert 5

您需要使用作用域 slot

appform.vue,暴露model在插槽上。

<template>
    <form @submit.prevent="onSubmit">
        <slot :model="model"></slot>
        <input type="submit">
    </form>
</template>
Run Code Online (Sandbox Code Playgroud)

然后在 中app.vue,添加一个作用域模板。

<template>
    <appform>
        <template v-slot="{model}">
            <input type="text" name="firstname" :model="model.firstname" />
            <input type="text" name="lastname" :model="model.lastname" />
        </template>
    </appform>
</template>
Run Code Online (Sandbox Code Playgroud)

此外,在您使用的输入元素上:model="model.firstname"。这对我来说似乎是一个错误。input元素没有model属性。您可能打算使用v-model="model.firstname".

  • @bernhardh 您添加到 `appform` 中的插槽的所有属性都作为单个对象传递。语法,`slot-scope="{model}"` 实际上是在解构那个对象(一种 es6 语法)。如果你没有解构,比如使用 `slot-scope="props"`,那么传递的模型属性将作为 `props.model` 访问。 (2认同)