vue3 中使用JSX书写普通、具名和作用域插槽

171 阅读1分钟

背景

做个记录,有时候不常用,就可能会遗忘

普通、具名插槽

父组件

export default defineComponent({
    setup(props, { emit, slots }) {
        return () => {
            const slots = {
                "input": () => (
                  <RadioGroup v-model={checked.value} direction="horizontal">
                    这是具名插槽
                  </RadioGroup>
                ),
                "default": () => (
                    <>这是默认插槽</>
                 )
             };
             const innerContent = (
                <div className={face_content}>
                  <Field name="radio" label="单选" v-slots={slots}></Field>
                </div>
             );
             return (
                 <div
                      className={`popup_content`}
                      onClick={withModifiers(closeOnly, ["self"])}
                  >
                    {innerContent}
                 </div>
             )
        }
    }
})

子组件

export default defineComponent({
    name: "Field",
    render() {
        return (
            <>
                <span>xxxx</span>
                { this.$slots.default() }
                { this.$slots.header() }
            </>
        )
    }
})

作用域插槽

子组件

export default defineComponent({
    name: "Field",
    setup() {
        return {
            value: {
                name: 'xzw'
            }
        }
    },
    render() {
        return (
            <>
                <span>学习学习</span>
                { this.$slots.content(this.value) }
            </>
        )
    }
})

父组件

export default defineComponent({
    setup(props, { emit, slots }) {
        return () => {
            const slots = {
                "content": (scope) => (
                  <RadioGroup v-model={checked.value} direction="horizontal">
                    {scope.name}
                  </RadioGroup>
                ),
               
             };
             const innerContent = (
                <div className={face_content}>
                  <Field name="radio" label="单选" v-slots={slots}></Field>
                </div>
             );
             return (
                 <div
                      className={`popup_content`}
                      onClick={withModifiers(closeOnly, ["self"])}
                  >
                    {innerContent}
                 </div>
             )
        }
    }
})