如何手动指定slot里面的内容
来源:10-5 Modal组件编码
慕莱坞0998854
2021-05-18
老师你好,这一节的Modal组件我想改进为像createMessage一样,创建一个createModal函数,然而这时候却在如何传入slot的值的时候犯了难。
我搜索了一下,好像vue2可以通过vm.$slots.xxx =[ vnode ] 来指定slot里面的内容,如下(https://stackoverflow.com/questions/50150668/how-to-create-vue-js-slot-programmatically)
但是在vue3里面却犯了难,
这已经提示我没有这个属性了,所以我想问下老师该怎么手动指定slot的值?
写回答
1回答
-
张轩
2021-05-19
同学你好 你这个问题问的很好 很深刻,这里我简单描述一下解法,要将我们现在的做法推翻掉。
我们这里是创建的实例(比较简单),但是创建实例,不支持直接传入slot, 这里我们还可以创建 vnode 节点,挂在dom 上,可以实现同样的功能,由于比较复杂,而且推翻之前的做法,所以请看注释,代码如下
import { createApp, createVNode, render } from 'vue' import Message from './Message.vue' export type MessageType = 'success' | 'error' | 'default' const createMessage = (message: string, type: MessageType, timeout = 2000) => { /// 这里特别注意 createVnode,有三个参数,第三个是 children,可以设定 slot, // 假如是一个函数直接返回一个 vnode 节点,那就是 default slot,假如是 named slot // 可以参考文档:https://vue3js.cn/global/h.html const messageInstance = createVNode( Message, {message,type}, () => createVNode('h1', {}, 'hello') ) const mountNode = document.createElement('div') document.body.appendChild(mountNode) // 使用内置的 render 挂载到 DOM render(messageInstance, mountNode) setTimeout(() => { // 使用 render null 进行卸载 render(null, mountNode) document.body.removeChild(mountNode)}, timeout ) } export default createMessage
00
相似问题
render函数创建插槽
回答 1
slot是什么意思?
回答 1