微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 vue 3 的插槽上使用 v-model?

如何解决如何在 vue 3 的插槽上使用 v-model?

我试图找到一种方法来使用我制作的模型组件,但能够从一个插槽关闭模型。

我可以将数据传递到插槽,但不能使用 v-model 并且不相信我可以更改插槽道具以关闭模型打开状态

https://v3.vuejs.org/guide/component-slots.html#scoped-slots

这是我正在使用的弹出框

<PopoverModal>
    <template #toggleButton>
      <button>A</button>
    </template>
    <template #modalContent="{ toggleModal }">
      <div style="color: #fff; height: 400px; width: 400px;">test2 {{toggleModal}}</div>
      <button @click="toggleModal = false">click me</button>
    </template>
  </PopoverModal>

在 popover 组件中,我试图能够发送状态变量

<slot name="modalContent" :toggleModal="showSelector"></slot>

我猜答案是不可能的,并找到另一种方法,但如果有人知道那将非常感谢

解决方法

不能直接使用模板改变 PopoverModal 数据,但可以绑定一些 setter 方法。

一些示例代码:

HelloWorld.vue

<template>
  <div class="hello">
    <PopoverModal>
      <template #toggleButton>
        <button>A</button>
      </template>
      <template #modalContent="modelContent">
        <div style="color: #fff; height: 400px; width: 400px;">test2 {{modelContent.toggleModal}}</div>
        <button @click="modelContent.setToggleModal(false)">click me</button>
      </template>
    </PopoverModal>
  </div>
</template>

<script>
import PopoverModal from './PopoverModal'
export default {
  components: {PopoverModal},name: 'HelloWorld',data () {
    return {
    }
  }
}
</script>

PopoverModal.vue

<template>
  <div>
    <slot name="toggleButton"></slot>
    <slot name="modalContent" :toggleModal="showSelector" :setToggleModal="setShowSelector"></slot>
  </div>
</template>

<script>
export default {
  data () {
    return {
      showSelector: true
    }
  },methods: {
    setShowSelector(showSelector) {
      this.showSelector = showSelector;
    },}
}
</script>
,

如果你传递一个对象并在 v-model 中使用它的属性,它可以工作,但我认为不推荐这样做(至少在 Vue 2.x 中)。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>CDN en Vue 3</title>
    <script src="https://unpkg.com/vue@next"></script>
  </head>
  
  <body>
    <div id="app">
      <child>
        <template v-slot:default="props">
          <h3>Slot</h3>

          <p>
            Object.val: <input v-model="props.data.val"> : {{props.data.val}} (binding works)
          </p>
        </template>
      </child>
    </div>
  </body>
</html>
const child = {
  template: `
    <h3>Component</h3>

    <p>
      Object.val: <input v-model="data.val"> : {{data.val}} (binding works)
    </p>

    <hr>

    <slot :data="data" :val="val"></slot>
  `,data() {
    return {
      data: {val: 1},val: 'asd'
    }
  }
}

https://jsfiddle.net/rjurado/un3sdqte/30/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?