如何在 vue 3 的插槽上使用 v-model?
How to use v-model on a slot in vue 3?
我正在尝试找到一种方法来使用我制作的模型组件,但能够从其中一个插槽关闭模型。
我可以将数据传递到插槽,但不能使用 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>
在弹出窗口组件中,我试图能够发送状态变量
<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'
}
}
}
我正在尝试找到一种方法来使用我制作的模型组件,但能够从其中一个插槽关闭模型。
我可以将数据传递到插槽,但不能使用 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>
在弹出窗口组件中,我试图能够发送状态变量
<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'
}
}
}