在 Vue 模板槽中使用父槽变量

Use parent slot variables in Vue template slot

我有一个简单的FormComponent:

<template>
  <form>
    <fieldset>
      <slot />
    </fieldset>
    <span v-if="!isEditing" @click="edit()">Edit</span>
  </form>
</template>

<script>
export default {
  data () {
    return {
      isEditing: false,
    }
  },
  methods: {
    edit (state) {
      this.isEditing = !this.isEditing
    }
  }
}
</script>

当我使用组件时:

<FormComponent>
  <input value="Man" type="text" :disabled="!isEditing">
</FormComponent>

输入字段已正确插入组件,但插槽中的 :disabled="!isEditing" 未对 FormComponentisEditing 的更改作出反应。

Vue 文档非常好,但它没有涵盖每种边缘情况。

具有 <slot></slot> 标签的组件必须将数据绑定到 <slot> 标签上的属性,如道具:

<slot :isEditing="isEditing"></slot>

然后当您渲染那个带槽的组件时,Vue 会创建并公开一个包含所有绑定数据的对象,每个属性在该对象上都有一个 属性。

通过向 v-slot 指令添加表达式来访问对象,格式如下:

<FormComponent v-slot:default="slotProps">  

(或使用别名 #,如 #default="slotProps"。)您可以通过该对象访问 isEditing 等个别属性,例如 slotProps.isEditing:

<FormComponent #default="slotProps">
  <input value="Man" type="text" :disabled="!slotProps.isEditing">
</FormComponent>

下面是更常见(和通用)的 <template> 语法:

<FormComponent>
  <template #default="slotProps">
    <input value="Man" type="text" :disabled="!slotProps.isEditing">
  </template>
</FormComponent>

您还可以 destructure slotProps 更直接地访问属性:

<FormComponent>
  <template #default="{ isEditing }">
    <input value="Man" type="text" :disabled="!isEditing">
  </template>
</FormComponent>