javascript - 如何在 VueJS 中处理插槽的 onClick 事件

我正在尝试构建一个可重用的对话框,而无需使用任何 refs 与对话框进行交互。它有 2 个命名插槽。 激活器内容

activator 可以是点击时会打开对话框的任何元素(一些文本、图标等)。 content 是要在对话框中显示的内容。

我认为我已经正确地创建了所有内容,但是 on Click 处理程序似乎无法在 activator 插槽上工作。对话框不显示。见下面的代码:

PopupDialog.vue

<template>
  <div>
    <div>
      <slot @click="dialog = true" name="activator" />
    </div>

    <v-dialog
      v-model="dialog"
      persistent
      max-width="400"
    >
      <slot name="content" />
    </v-dialog>
  </div>
</template>

<script>
export default {
  name: "PopupDialog",
  data: () => ({
    dialog: false,
  }),
};
</script>

然后我尝试像这样使用组件:

  <PopupDialog>
    <template v-slot:activator>
      <span>
        Add Member
      </span>
    </template>

    <template v-slot:content>
      <span>
        Content to show in dialog
      </span>
    </template>
  </PopupDialog>

当我单击跨度文本时没有任何反应,这是为什么?不能在插槽上使用事件监听器吗?我怎样才能完成这项工作?

最佳答案

什么都不会发生,因为你不能像那样将事件监听器应用于插槽子项。

相反,您可以将一个方法作为插槽 Prop 传递给 activator 插槽,这样 children 就可以将 click 事件处理程序绑定(bind)到该方法:

<slot name="activator" :onClick="onClick" />
export default {
  name: 'PopupDialog',
  methods: {
    onClick() {
      this.dialog = true
    }
  }
}

然后像这样使用它:

<PopupDialog>
  <template v-slot:activator="{ onClick }">
    <span @click="onClick"> Add Member </span>
  </template>
</PopupDialog>

demo

https://stackoverflow.com/questions/67738496/

相关文章:

c# - 为什么将 List 转换为 Array 而不是在 C# 中引用?

go - 为什么一个空 slice 有 24 个字节?

python - 在 [任何以前的版本] 之前的 Python 中这可能吗

go - 为什么 math.Pow 的性能比位移差?

typescript - noFallthroughCasesInSwitch - 明确允许失败

reactjs - 错误 : Final loader (./node_modules/awesom

firebase - 参数类型 'Object?' 无法分配给参数类型 'Map

windows - 将 Systems Internals 列为制造商的 Windows 服务的名称

c++ - 当我们已经拥有更强大的 vector 时,为什么还需要堆栈?

c - getc 不止一次评估流