【问题标题】:Use parent slot variables in Vue template slot在 Vue 模板槽中使用父槽变量
【发布时间】:2021-04-04 20:02:18
【问题描述】:

我有一个简单的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 文档非常好,但并未涵盖所有极端情况。

【问题讨论】:

  • 请链接文档部分,说明支持在开槽元素上使用这种绑定。
  • 它询问“你怎么知道这甚至被支持”。

标签: javascript vue.js vuejs2 vue-component vuejs-slots


【解决方案1】:

带有&lt;slot&gt;&lt;/slot&gt; 标签的组件必须将数据绑定到&lt;slot&gt; 标签上的一个属性上,就像一个prop:

<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>

这是更常见(和通用)的&lt;template&gt; 语法:

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

您也可以destructureslotProps 更直接地访问属性:

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

【讨论】:

  • 您能解释一下#default="{ isEditing }" 的工作原理吗?我知道我需要将isEditing 绑定到组件中的&lt;slot&gt;,但我看不到简写命名插槽和:disabled="!isEditing" 之间的连接。
  • 只是 es6 对象destructuring,不是 Vue 特性。您可以将{ } 替换为任何给定的对象引用,并列出您想要提取的属性。所以{ } 是前面示例中slotProps 的替代品。无论哪种方式,都有一个对象被传递到那里,现在它没有命名,而是被解构了。
  • 是的,我明白了,对不起。我的意思是slotProps 做了什么。当您将其添加到FormComponent 时,我不明白为什么它会起作用。链接到一个好的来源也很好,但我无法从 Vue 文档中得到它为什么这样有效。
  • 这是一个 Vue 创建的对象,它聚合了 &lt;slot&gt; 标签上的所有属性绑定,所以因为 &lt;slot&gt; 上有一个 isEditing 属性,所以该属性也存在于该对象上。需要default 的原因是必须提供名称来指定目标槽。当没有像&lt;slot name="myslot"&gt;&lt;/slot&gt;这样显式给出名称时,“default”是插槽的默认名称
  • Vue 指南的 slot props doc 讨论了其中的一些内容
猜你喜欢
  • 2021-02-06
  • 2018-04-25
  • 2018-12-05
  • 1970-01-01
  • 2021-11-27
  • 2018-12-27
  • 1970-01-01
  • 2019-06-08
  • 2018-10-24
相关资源
最近更新 更多