在现有项目里面添加 TSX 并编写组件过程记录

news2024/11/24 1:48:11

首先需要安装编译支持和 vite 支持插件

## babel 基础插件
yarn add @vue/babel-plugin-jsx -D

## 项目用 vite 构建的就需要按照这个
yarn add @vitejs/plugin-vue-jsx -D 

 

使用插件

  1. 按照 babel-plugin-jsx 的指引在 babel
    配置项中启用插件:
{
  "plugins": ["@vue/babel-plugin-jsx"]
}
  1. 按照 @vitejs/plugin-vue-jsx 的指引在 vite.config.js 中启用插件
import vueJsx from '@vitejs/plugin-vue-jsx'

export default {
  plugins: [
    vueJsx({
      // options are passed on to @vue/babel-plugin-jsx
    })
  ]
}

 

tsconfig.json 配置项添加

tsconfig.json 文件的配置项比较灵活,可以参考 TypeScript 的配置文档,
也可以直接根据 Vue 里面使用 TS 的官方指引 来配置。
使用 tsc --init 可以快速初始化配置。

这里我个人配的是这样:

{
    "compilerOptions": {
        "module": "ES6",
        "target": "ES6",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": true,
        "jsx": "preserve",
        "isolatedModules": true,
        "strict": true,
        "baseUrl": "./",
        "paths": {
            "@/*": [
                "src/*"
            ]
        }
    },
    "include": [...]
}

 

Vue 中的 TSX 和 JSX 与渲染函数的转换关系:

参考:

  • Vue 渲染函数 & JSX
    https://staging-cn.vuejs.org/guide/extras/render-function.html
  • babel 编译转换说明
    https://github.com/vuejs/babel-plugin-jsx/blob/dev/packages/babel-plugin-jsx/README-zh_CN.md
  • Vue 渲染函数 API
    https://staging-cn.vuejs.org/api/render-function.html#h
  • Vue 渲染机制
    https://staging-cn.vuejs.org/guide/extras/rendering-mechanism.html#virtual-dom

 

组件代码编写模式

单文件组件(SFC) 模式

参考:

  • Vue 单文件中使用 TS
    https://staging-cn.vuejs.org/guide/extras/render-function.html#passing-slots

示例一:

<script setup lang="tsx">
import { ref } from "vue"
const message: String = "Hello world"
const count = ref(0)
const inc = () => count.value++
</script>

<template>
    <div @click.self="inc">
        {{ message }}
        &nbsp;
        {{ count }}
    </div>
</template>

示例二:
<script lang="tsx">
import { defineComponent, ref, withModifiers } from "vue"
export default defineComponent({
    setup(props) {
        const message: String = "Hello world"
        const count = ref(0)

        const inc = () => count.value++

        return () => (
            <div onClick={withModifiers(inc, ["self"])}>
                {message}
                &nbsp;
                {count.value}
            </div>
        )
    }
})
</script>

 

TSX 代码编写模式

参考:

  • babel 文档示例
    https://github.com/vuejs/babel-plugin-jsx/blob/dev/packages/babel-plugin-jsx/README-zh_CN.md
  • Vue 官网示例
    https://staging-cn.vuejs.org/guide/extras/render-function.html#passing-slots

示例一:

import { defineComponent } from "vue"

const A = (props, { slots }) => (
    <>
        <h1>{slots.default ? slots.default() : 'foo'}</h1>
        <h2>{slots.bar?.()}</h2>
    </>
);

export default defineComponent({
    props: {
        messages: String
    },
    setup(props) {
        const slots = {
            default: () => <div>A</div>,
            bar: () => <span>C</span>,
        }
        return () => (
            <A v-slots={slots}></A>
        )
    },
})

示例二:
import { defineComponent, ref, withModifiers } from "vue"
export default defineComponent({
    setup(props) {
        const count = ref(0)

        const inc = () => count.value++

        return () => (
            <div onClick={withModifiers(inc, ["self"])}>
                Hello world &nbsp;
                {count.value}
            </div>
        )
    }
})

 

TSX 使用插槽以及作用域插槽

示例一:
main.ts

import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')

App.vue

<script lang="tsx" setup>
import MainComponent from './components/MainComponent';
</script>

<template>
    <MainComponent />
</template>

MainComponent.tsx

import { defineComponent } from "vue";
import TestComponent from "./TestComponent";

export default defineComponent({
    setup() {
        return () => (
            <>
                <TestComponent
                    v-slots={{
                        default: (str: string, idx: number) => {
                            console.log(str, idx);
                            return `hello ${str} ${idx}`;
                        },
                        header: () => "世界如此美丽",
                    }}
                />
                <TestComponent>
                    {{
                        default: (str: string, idx: number) => {
                            console.log(str, idx);
                            return `hello ${str} ${idx + 1}`;
                        },
                        header: () => "世界如此美丽",
                    }}
                </TestComponent>
            </>
        )
    }
})

TestComponent.tsx

import { defineComponent, SetupContext } from "vue";

export default defineComponent({
    setup(props, ctx: SetupContext) {

        const data = "world";

        console.log(ctx);
        return () => (
            <>
                <p>
                    { ctx.slots.header!() }
                </p>
                <p>
                    {ctx.slots.default!(data, 1)}
                </p>
            </>

        )
    }
})

 
示例二:
main.ts

import { createApp } from 'vue'
// import App from './App.vue'
import MainComponent from './components/MainComponent';

createApp(MainComponent).mount('#app')

效果:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统常见问题汇总

1.系统启动流程。 uboot -> kernel -> 根文件系统。 uboot第一阶段属于汇编阶段&#xff1a; 定义入口&#xff08;start.S&#xff09;&#xff1a;uboot中因为有汇编阶段参与&#xff0c;因此不能直接找main.c。 设置异常向量&#xff1a;当硬件发生故障的时候CPU会…

K8s Dashboard 部署

1、下载 Dashboard 的 yaml 文件 点击链接下载 YAML 文件 2、源码包中 yaml 文件在哪里 3、修改 yaml 文件 vim recommended.yaml... kind: Service apiVersion: v1 metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard…

Java web 2022跟学尚硅谷(十) 后端基础 书城

Java web 2022跟学尚硅谷十 后端基础 书城验证码kaptcha和缓存cookie简单了解cookie步骤简单创建cookie的样例代码CookieServlet01hello.html页面结果Cookie保存结果第二次请求cookie的APIKaptcha验证码使用步骤显示效果验证码的校验相关类KaptchaServlet01书城1.2正则表达式正…

C语言经典题目—单链表求和

练习的题目<单链表求和>题目难度较小。 1、题目描述 小明输入了一个长度为 n 的数组&#xff0c;他想把这个数组转换成链表&#xff0c;链表上每个节点的值对应数组中一个元素的值&#xff0c;然后遍历链表并求和各节点的值。输入描述&#xff1a; 第一行输入一个正整数…

Linux下内存空间分配、物理地址与虚拟地址映射

一、Linux内核动态内存分配与释放 1.1 kmalloc函数 Kmalloc分配的是连续的物理地址空间。如果需要连续的物理页&#xff0c;可以使用此函数&#xff0c;这是内核中内存分配的常用方式&#xff0c;也是大多数情况下应该使用的内存分配方式。 传递给函数的最常用的标志是GTP_A…

火山引擎DataTester:无需研发人力,即刻开启企业A/B实验

近日&#xff0c;火山引擎A/B测试平台—— DataTester 对产品内A/B实验的“可视化编辑器”进行了新的升级&#xff0c;对交互、预览、Xpath的层次结构视图等能力均做了优化。 据介绍&#xff0c;火山引擎DataTester的可视化编辑器&#xff0c;可以让用户无需编写任何代码&#…

基于java+springboot+mybatis+vue+mysql的CSGO游戏比赛赛事管理系统

项目介绍 CSGO赛事管理系统利用网络沟通、计算机信息存储管理&#xff0c;有着与传统的方式所无法替代的优点。比如计算检索速度特别快、可靠性特别高、存储容量特别大、保密性特别好、可保存时间特别长、成本特别低等。在工作效率上&#xff0c;能够得到极大地提高&#xff0…

基于JAVA+SpringMVC+Mybatis+Vue+MYSQL的大健康老年公寓管理系统

项目介绍 本系统采用java语言开发&#xff0c;后端采用ssm框架&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。 管理员后台页面&#xff1a; 功能&#xff1a;主页、个人中心、护理人员管理、收费标准管理、接待登记管理、房间信息管理、床位信息管理…

ASEMI肖特基二极管MBR30200FCT封装,MBR30200FCT体积

编辑-Z ASEMI肖特基二极管MBR30200FCT参数&#xff1a; 型号&#xff1a;MBR30200FCT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;140V 最大直流阻断电压&#xff08;VDC&#xff09…

Android 相机预览 横屏竖屏 -- 显示

相机在设备上处于固定位置&#xff0c;无论设备是否 是手机、平板电脑或计算机。当设备方向更改时&#xff0c; 相机方向更改。常见的布局显示比率是 4:3。 对于前置摄像头&#xff0c;图像缓冲区逆时针旋转&#xff08;从 传感器的自然方向&#xff09;对于后置摄像头&#xf…

机械硬盘如何克隆至固态硬盘,如何把硬盘系统克隆到固态硬盘

由于电脑的磁盘空间是既定的&#xff0c;随着使用年限越来越长&#xff0c;电脑磁盘空间已经不满足实际的需求了。为了拓展磁盘空间&#xff0c;就可以使用磁盘克隆的方法来扩展磁盘空间。因此&#xff0c;在本文中&#xff0c;易我小编将讲解硬盘克隆的相关理论知识&#xff0…

非零基础自学Golang 第7章 函数 7.5 匿名函数和闭包

非零基础自学Golang 文章目录非零基础自学Golang第7章 函数7.5 匿名函数和闭包7.5.1 定义和使用匿名函数7.5.2 闭包的定义7.5.3 闭包的“记忆力”第7章 函数 7.5 匿名函数和闭包 匿名函数即在需要函数时定义函数&#xff0c;匿名函数能以变量方式传递&#xff0c;它常常被用于…

【图像评价】图像质量评价【含GUI Matlab源码 1373期】

⛄一、简介 理论知识参考文献&#xff1a;图像印刷质量的客观评价——以报纸印刷为例 ⛄二、部分源代码 function varargout IQA(varargin) % Begin initialization code - DO NOT EDIT gui_Singleton 1; gui_State struct(‘gui_Name’, mfilename, … ‘gui_Singleton…

C++模板(初阶)

本章主要讲解三个部分&#xff1a;泛型编程、函数模板、类模板 目录 泛型编程 函数模板 函数模板概念 函数模板的格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化 模板参数的匹配原则 类模板 泛型编程 先来大致说一下什么是泛型编程. 在计算机程序设计领…

如何安装第三方的Python包?

目录 什么是第三方包 常见的第三方包 如何安装 方法1&#xff1a;命令行 方法2&#xff1a;在IDE中用图形界面操作 什么是第三方包 我们知道&#xff0c;在Python中包就是把一些同类型的功能封装到一处&#xff0c;包含了函数、类、变量等可供外界使用。使用的方法就是在文…

肠道微生物群、营养与长期疾病风险:母婴视角

谷禾健康 怀孕的母亲与体内的胎儿是息息相关的。由于婴儿接触母体微生物群&#xff0c;母亲和孩子之间的微生物联系在怀孕期间形成。而宿主与微生物群的联系在出生后成熟&#xff0c;并进化成为个体生命中最重要的共生关系之一&#xff0c;对响应营养和环境刺激的稳态调节至关重…

【Git】“分支” 如何管理和使用?这一篇就够了~

目录 一、什么是分支&#xff1f; 二、分支的操作 2.1、查看分支 2.2、创建分支 2.3、切换分支 和 修改分支 2.4、合并分支 2.4.1、正常合并 2.4.2、合并冲突 三、创建分支和切换分支的底层原理 一、什么是分支&#xff1f; 在版本控制中&#xff0c;我们可以针对每个任…

单调队列算法 - 滑动窗口问题(常见模型:找出滑动窗口中的最大值/最小值)

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09; 文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点✔ 蓝色文字表示&#xff1a…

ASEMI肖特基二极管MBR10100FCT图片,MBR10100FCT大小

编辑-Z ASEMI肖特基二极管MBR10100FCT参数&#xff1a; 型号&#xff1a;MBR10100FCT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;100V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;70V 最大直流阻断电压&#xff08;VDC&#xff09;…

SpringBoot整合Druid数据源

SpringBoot整合Druid数据源1.使用Druid数据源2.完整的Druid配置3.为 DruidDataSource 绑定全局配置文件中的参数4.配置Druid数据源监控5.配置 filter 过滤器1.使用Druid数据源 <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency><gr…