使用vite插件编写tsx文件

news2024/12/28 5:26:23

一般情况下,我们在template标签里去写静态页面模板。现在可以扩展另一种书写风格 tsx,类似react的jsx语法。vue2 的时候就已经支持jsx写法,只不过不是很友好,随着vue3对typescript的支持度增高,tsx写法越来越被接受。

使用参阅:@vitejs/plugin-vue-jsx

1、安装

npm i @vitejs/plugin-vue-jsx -D

可能会出现插件与vite版本不兼容的问题:

解决办法:添加 --force 参数,强制安装即可。

 

2、配置vite.config.ts

import vueJsx from '@vitejs/plugin-vue-jsx';
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vueJsx()]
})

3、 配置tsconfig.json

添加以下信息在compilerOptions配置项中:

    "jsx": "preserve",
    "jsxFactory": "h",
    "jsxFragmentFactory": "Fragment",

这样就可以编写tsx文件了。 

4、新建xxx.tsx测试

第一种编写方式,内容如下;

export default function() {

    return (<div>hello world!</div>)
}

像引入组件一样,在App.vue中 import,使用:

import AppTsx from './App'  // 后缀可省略
...
<AppTsx></AppTsx> 

显示结果:

 

5、使用defineComponent编写tsx

第二种编写方式,该语法类似react的class component书写方式,属于Optional API。

import { defineComponent } from 'vue'
export default defineComponent({
    data () {
        return {
            name: "Tom",
            age: 23
        }
    },
    render () {
        return (<div>{ this.name } is { this.age } years old. </div>)
    }
})

注意:在render函数中使用data函数定义的变量时,用的是单花括号‘{ xxx }’进行渲染。

页面效果:

 

6、setup函数模式编写tsx

import { defineComponent } from 'vue'
export default defineComponent({
    setup () {
        return () => (<div>Setup!</div>)
    }
 
})

7、指令使用变化

支持使用v-show的指令:

setup () {
        const flag = false
        return () => (<div v-show={flag}>Setup!</div>)
    }

Setup!字样是正常隐藏了的。但如果给变量flag使用ref包装一下,v-show就失效了?如下:

 这是因为在ts里{xx},对于响应式数据的解析不能自动.value拆包,需要手动写上.value。

不支持v-if指令:

解决:采取另一种编程思想(如js的三元表达式):

个人感觉这种结构读性较差。

不支持v-for指令:

采用数组遍历方式渲染,map()代替v-for:

 

v-bind 可以用 '{}' 替代:

 8、Props接收值

// App.tsc 定义接口类型
type Props = {
    title?:string 
}

export default defineComponent({
    props: {
        title:String
    },
// setup接收props参数
  setup(props:Props) {    
    return () => (
      <>
      <div> Props: { props?.title }</div>
      <hr />
      </>
    );
  }
});
......
// App.vue 传值
<AppTsx title="我是标题"></AppTsx>

结果:

 9、emit派发事件

  ... 
   const fun = () => {
        console.log('click!');        
    }
    return () => (
      <>
     {/* <div onClick={fun()}> Props: { props?.title }</div> */}
         <div onClick={() => fun()}> Props: { props?.title }</div>
      <hr />
      </>
    );
...

不是以@开头的事件书写,注意{xx}不能直接调用函数,它会自动执行,需要改写为回调函数形式:onClick={() => xxx()}。

 传参:

    const fun = (num:number) => {
        console.log('click!', '参数: ', num);        
    }
...
    <div onClick={() => fun(666)}> Props: { props?.title }</div>
...

触发父组件事件:

setup(props:Props, { emit }) {
...
}
...
const fun = (num:number) => {
        console.log('click!', '参数: ', num);   
        emit('on-click', num)     
    }
// App.vue
const getNum = (num:number) => {
  console.log('父组件接收emit: ', num);
}

...
<AppTsx @on-click="getNum" title="我是标题"></AppTsx>
...

10、插槽slots

// 定义一个子组件
const A = (_, { slots }) => (
    <>
      <h1>{ slots.default ? slots.default() : '默认插槽' }</h1>
      <h2>{ slots.foo?.() }</h2>
    </>
  );
...

setup(props:Props, { emit }) {
    const slot = {
        default: () => (<div>hello - default slots</div>),
        foo: () => (<div>world - foo slots</div>),
    }
    return () => (
      <>
      <A v-slots={slot}></A>
      <hr />  
      </>
    );
  }
});
...

 11、表单双向数据绑定

支持v-model指令:

    const v = ref<string>('')
...
    return () => (
      <>
      <input v-model={v.value} type="text" />
      <div>{ v.value }</div>
      </>
    );
...

 

 

参考: https://xiaoman.blog.csdn.net/article/details/123172735

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

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

相关文章

基本素质提升(一)----日常/命令积累

目录 一、引言 二、日常积累 三、命令积累 一、引言 这个主题主要带大家学习一下日常开发所使用的命令及相关知识&#xff0c;会持续更新 二、日常积累 1、kill 给某个进程发送信号 kill -STOP pid(进程号)&#xff0c;可以发送任何信号给进程&#xff1b;kill -STOP %…

【云计算与大数据技术】云计算概论介绍

一、什么是云计算 云计算&#xff08;cloud computing&#xff09;是基于互联网的相关服务的增加、使用和交付模式&#xff0c;通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法&#xff0c;过去往往用来用云表示电信网&#xff0c;后…

基于51单片机电动自行车车速报警系统proteus仿真原理图程序

功能&#xff1a; 0.本项目采用STC89C52作为单片机系统的控制MCU 1.LCD1602液晶分三种显示模式 a)显示实时速度和本次里程 b)显示当前时间 c)显示报警速度和总里程 2.超过报警速度将声光报警 3.功能按键介绍 a显示状态下: 上’键——电机速度1 下’键——电机速度-1 设置’键—…

Java基于JSP+mysql的学科竞赛管理系统

随着我学科竞赛是对课堂上所学的理论知识的实践运用&#xff0c;是考察大学生学科基本理论知识和解决实际问题能力的比赛&#xff0c;是高等学校人才培养质量的标志之一&#xff0c;是培养知识-能力-素质协调发展的创新型、高素质人才重要途径&#xff0c;对高校的学风、就业也…

Go开发中配置一个Logger日志的功能实现

为什么需要Logger 一般在开发项目的时候我们都是需要一个存储日志的文件&#xff0c;因为在部署项目以后&#xff0c;我们只能通过去筛查日志进行检索问题&#xff0c;这时候日志是否可以呈现清晰这个对于我们进行排查工作是十分重要的&#xff0c;所以Logger能否展示出我们最…

Linux基础——git和gdb的使用

前言 我们在平时维护和上传代码时会用到git&#xff0c;但是这个git具体是什么&#xff0c;往往又说不清楚。其实git其实就是一个版本管理工具&#xff0c;有了这个工具就能方便快捷地查询自己上传代码的不同版本&#xff0c;对每一次上传的改动了如指掌。 那gdb又是什么呢&a…

文本生成自回归解码策略总结

当今文本生成的主流方式还是自回归式的语言建模&#xff0c;本篇文章对文本生成常用的几种自回归采样&解码策略进行总结&#xff08;以下统称为采样&#xff09;。 采样方式Argmax Decoding&#xff08;贪婪采样&#xff09;Greedy Search&#xff08;贪心搜索&#xff09;…

Neo4J入门笔记[2]---Neo4J GDS 图数据科学库

Neo4J 提供了GDS的库&#xff0c;里面包括了很多算法。GDS的英语全称是Graph Data Science&#xff08;图数据科学库&#xff09;&#xff0c;其句法流程如下&#xff1a; stream Returns the result of the algorithm as a stream of records. stats Returns a single recor…

【VUE3】保姆级基础讲解(二)计算属性,vue组件,vue-cli脚手架,组件通讯,插槽slot

目录 计算属性computed 侦听器watch 对象监听 组件 注册全局组件 注册局部组件 Vue-CLI脚手架 安装和使用 .browserslistrc main.js jsconfig.json 组件通讯 父组件传递给子组件 props基础 非prop的attribute 子组件传递给父组件 插槽slot 基础使用 具名插槽 …

前端整合ECharts

1、简介 ECharts是百度的一个项目&#xff0c;后来百度把Echart捐给apache&#xff0c;用于图表展示&#xff0c;提供了常规的折线图、柱状图、散点图、饼图、K线图&#xff0c;用于统计的盒形图&#xff0c;用于地理数据可视化的地图、热力图、线图&#xff0c;用于关系数据可…

图数据库 Neo4j 学习之SpringBoot整合

Neo4j 系列 1、图数据库 Neo4j 学习随笔之基础认识 2、图数据库 Neo4j 学习随笔之核心内容 3、图数据库 Neo4j 学习随笔之基础操作 4、图数据库 Neo4j 学习随笔之高级操作 5、图数据库 Neo4j 学习之JAVA-API操作 6、图数据库 Neo4j 学习之SpringBoot整合 文章目录Neo4j 系列前…

Docker与Linux之间的关系——Namespace,Cgroups, 网络通信总结

文章目录一、前言二、NamespaceNamespace Linux内核操作方法容器隔离性与 Linux Namespace 关系Linux Namespace 常用操作三、CgroupsCgroups 子系统CPU 子系统cpuacct 子系统Memory 子系统Linux 调度器使用 cgroup 限额实践四、DockerDocker的文件系统OCI 容器标准Docker 引擎…

php+vue基于微信小程序的房屋租赁小程序

当今社会房屋租赁买卖是必不可少的&#xff0c;人们不管走到哪里都需要有一个温馨的家&#xff0c;有一个落脚之地&#xff0c;所以房屋租赁市场也是非常火爆&#xff01;不管是房屋租赁公司或者是个人都需要一套完整的管理系统来掌握整个市场信息。针对这一需求&#xff0c;本…

微信小程序框架(三)-全面详解(学习总结---从入门到深化)

目录 事件系统 什么是事件 事件的使用方式 Event对象 事件分类 冒泡事件(bind) 非冒泡事件(catch) 事件类型 事件类型列表 事件携带参数 currentTarget 携带参数 mark 携带参数 条件渲染 wx:if wx:else wx:elif hidden wx:if vs hidden 区别 列表渲染 基本使用 复杂数…

C++用unordered_map查表代替if else/switch case多判断语句

一、引言 在C中我们写判断逻辑一般会用if else或switch case语句&#xff0c;比如以下例子&#xff1a; #include <iostream>using namespace std;class CTest { public:enum class ConditionType{TYPE1 0,TYPE2,TYPE3,};CTest() default;~CTest() default;void exe…

双倍NB!阿里一线架构师花7天肝出的这份620页“MyBatis源码解析绝密文档” 太震撼了!

前言 都知道MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Jav…

非零基础自学计算机操作系统 第1章 操作系统概述 1.1 操作系统的概念

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.1 操作系统的概念1.1.1 操作系统的地位1.1.2 操作系统的作用1.1.3 操作系统的定义第1章 操作系统概述 1.1 操作系统的概念 关于什么是操作系统&#xff0c;目前尚无统一的定义。这里只能从…

基于Java的JSP电动车维修管理系统

随着我国电动车数量的不断增加&#xff0c;如果能够在电动车出现故障的时候及时的解决这些故障问题&#xff0c;并且能够让电动车的维修人员更好的对维修信息进行管理是本系统主要研究的问题&#xff61; 本项目利用软件工程原理&#xff0c;采用面向对象的编程方法&#xff0c…

会话技术

会话技术 今日目标 理解什么是会话跟踪技术 掌握Cookie的使用 掌握Session的使用 完善用户登录注册案例的功能 1&#xff0c;会话跟踪技术的概述 对于会话跟踪这四个词&#xff0c;我们需要拆开来进行解释&#xff0c;首先要理解什么是会话&#xff0c;然后再去理解什么是…

二叉树的构造(如何唯一确定一棵二叉树?附证明)

二叉树的构造(如何唯一确定一棵二叉树?附证明) 一些直观的认识 ▪ 同一棵二叉树具有唯一先序序列、中序序列和后序序列。 ▪ 不同的二叉树可能具有相同的先序序列、中序序列和后序序列。 通过上面两个例子的验证&#xff1a; ▪ 仅有一个先序序列&#xff08;或中序序列、后…