Vue3进阶<2>插槽在tsx 语法的使用

Vue3进阶<2>插槽在tsx 语法的使用

tsx语法

Vue3的TSX语法是一种在Vue组件中使用TypeScript编写代码的方法。TSX是JSX的扩展,它允许我们在Vue模板中使用类似于HTML的标记来描述组件的结构,tsx 语法在封装一些组件的时候有很大的用途

1.vite构建项目中使用 安装配置

bash 复制代码
npm i -D @vitejs/plugin-vue-jsx

2.配置 vite.coonfig.ts

typescript 复制代码
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
 
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(), vueJsx({})],
});

3.配置tsconfig.json

json 复制代码
{
  "compilerOptions": {
    "jsx": "preserve",
    "jsxFactory": "h",
    "jsxFragmentFactory": "Fragment",
  }
}

tsx 语法的介绍请参考官网

tsx中使用插槽

vue3中,新增了 defineComponent ,它并没有实现任何的逻辑,只是把接收的 Object 直接返回,它的存在是完全让传入的整个对象获得对应的类型,它的存在就是完全为了服务 TypeScript 而存在的。

setup 函数默认接收两个参数 1. props 2. ctx 上下文 其中包含 slots、attrs、emit 等

子组件children.tsx

typescript 复制代码
import { defineComponent,reactive } from 'vue'
export default defineComponent({
    setup(props, { slots }) {
        const state = reactive({
            name:"周杰伦",
            phone: "15888888888"
        })
        return () => (
            <div>
                <p>我是子组件</p>
                {/* 这是默认插槽 */}
                {
                    slots.default ? slots.default() : null
                }
                {/* 这是具名插槽 */}
                {
                    slots. sex ? slots. sex() : null
                }
                {/* 这是作用域插槽 */}
                {
                    slots.fullInfo ? slots.fullInfo({ name: state.name, phone:state.phone}) : null
                }
            </div>
        );
    }
})

父组件

typescript 复制代码
import Children  from './components/children.tsx';
import {defineComponent} from 'vue'
export default defineComponent({
    setup() {
        return () => (
            <div class={'box'}>
                <Children>
                    {{
                        default: () => <p>年龄18</p>,
                        sex: () => <p>男</p>,
                        fullInfo(slotProps) {
                            return [
                                <p>{slotProps.name}</p>,
                                <p>{slotProps.phone}</p>,
                            ];
                        }
                    }}
                </Children>
            </div>
        );
    }
})

页面效果

v-slots 指令

除了直接在组件中传递包含插槽函数的对象外,还可以通过 v-slots 指令传递,这样就可以将插槽内容单独抽取出来

typescript 复制代码
import Children  from './components/children.tsx';
import {defineComponent} from 'vue'
export default defineComponent({
    setup() {
        const slots = {
            default: () => <p>年龄18</p>,
            sex: () => <p>男</p>,
            fullInfo(slotProps) {
                return [
                    <p>{slotProps.name}</p>,
                    <p>{slotProps.phone}</p>,
                ];
            }
        }
        return () => (
            <div class={'box'}>
                <Children v-slots={slots}/>
            </div>
        );
    }
})

这样,结构和数据就进行了分离,看着更加干净清晰,也便于我们后期的维护。

当然,默认插槽也可以标签的形式直接写在组件里,就像这样:

typescript 复制代码
return () => (
    <div class={'box'}>
        <p>我是父组件1</p>
        <Children v-slots={slots}/>
    </div>
);

页面效果

这里需要指出的是,在 Vue 官方文档中,并没有 v-slots 这个指令,我们之所以能在 TSX 中使用它是因为项目中安装了 @vitejs/plugin-vue-jsx 插件,该插件允许以 JSX 的方式来编写 Vue 代码。

相关推荐
姜太小白1 小时前
【前端】CSS Grid布局介绍及示例
前端·css
风继续吹..4 小时前
后台管理系统权限管理:前端实现详解
前端·vue
yuanmenglxb20044 小时前
前端工程化包管理器:从npm基础到nvm多版本管理实战
前端·前端工程化
新手小新5 小时前
C++游戏开发(2)
开发语言·前端·c++
我不吃饼干5 小时前
【TypeScript】三分钟让 Trae、Cursor 用上你自己的 MCP
前端·typescript·trae
飞翔的佩奇6 小时前
基于SpringBoot+MyBatis+MySQL+VUE实现的经方药食两用服务平台管理系统(附源码+数据库+毕业论文+部署教程+配套软件)
数据库·vue.js·spring boot·mysql·毕业设计·mybatis·经方药食两用平台
小杨同学yx6 小时前
前端三剑客之Css---day3
前端·css
Mintopia8 小时前
🧱 用三维点亮前端宇宙:构建你自己的 Three.js 组件库
前端·javascript·three.js
故事与九8 小时前
vue3使用vue-pdf-embed实现前端PDF在线预览
前端·vue.js·pdf
Mintopia9 小时前
🚀 顶点-面碰撞检测之诗:用牛顿法追寻命运的交点
前端·javascript·计算机图形学