当前位置: 首页 > news >正文

17 vue3之tsx手写vite tsx插件

我们之前呢是使用Template去写我们模板。现在可以扩展另一种风格TSX风格

vue2 的时候就已经支持jsx写法,只不过不是很友好,随着vue3对typescript的支持度,tsx写法越来越被接受,减少我们学习react的成本 Ant Design组件库就是使用tsx语法编写的

安装插件

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

vite.config.ts配置 

import vueJsx from "@vitejs/plugin-vue-jsx";export default ({ mode }: any) => {console.log("mode===>", mode);console.log(loadEnv(mode, process.cwd()));return defineConfig({plugins: [vue(),vueJsx(), //注册AutoImport({imports: ["vue"], // 引入vue的自动引入}),],});
};

 修改tsconfig.json 配置文件

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

使用Tsx

在目录新建一个xxxxxx.tsx文件

tsx支持 v-model 的使用

 
import { ref } from 'vue'let v = ref<string>('')const renderDom = () => {return (<><input v-model={v.value} type="text" /><div>{v.value}</div></>)
}export default renderDom

v-show

 
import { ref } from 'vue'let flag = ref(false)const renderDom = () => {return (<><div v-show={flag.value}>景天</div><div v-show={!flag.value}>雪见</div></>)
}export default renderDom

v-if是不支持 可使用三元表达式支持

import { ref } from 'vue'let flag = ref(false)const renderDom = () => {return (<>{flag.value ? <div>景天</div> : <div>雪见</div>}</>)
}export default renderDom

v-for不支持 可使用map支持

import { ref } from 'vue'let arr = [1,2,3,4,5]const renderDom = () => {return (<>{arr.map(v=>{return <div>${v}</div>})}</>)
}export default renderDom

v-bind使用

import { ref } from 'vue'let arr = [1, 2, 3, 4, 5]const renderDom = () => {return (<><div data-arr={arr}>1</div></>)
}export default renderDom

v-on绑定事件 所有的事件都按照react风格来

  • 所有事件有on开头
  • 所有事件名称首字母大写
 
const renderDom = () => {return (<><button onClick={clickTap}>点击</button></>)
}const clickTap = () => {console.log('click');
}export default renderDom

Props 接受值

 
import { ref } from 'vue'type Props = {title:string
}const renderDom = (props:Props) => {return (<><div>{props.title}</div><button onClick={clickTap}>点击</button></>)
}const clickTap = () => {console.log('click');
}export default renderDom

Emit派发

type Props = {title: string
}const renderDom = (props: Props,content:any) => {return (<><div>{props.title}</div><button onClick={clickTap.bind(this,content)}>点击</button></>)
}const clickTap = (ctx:any) => {ctx.emit('on-click',1)
}

Slot

const A = (props, { slots }) => (<><h1>{ slots.default ? slots.default() : 'foo' }</h1><h2>{ slots.bar?.() }</h2></>
);const App = {setup() {const slots = {bar: () => <span>B</span>,};return () => (<A v-slots={slots}><div>A</div></A>);},
};// orconst App = {setup() {const slots = {default: () => <div>A</div>,bar: () => <span>B</span>,};return () => <A v-slots={slots} />;},
};// or you can use object slots when `enableObjectSlots` is not false.
const App = {setup() {return () => (<><A>{{default: () => <div>A</div>,bar: () => <span>B</span>,}}</A><B>{() => "foo"}</B></>);},
};

完整示例代码

三种不同写法的tsx语法

三种不同写法的tsx语法 一和3的方式用的比较多 我们这里主要是使用第三种

  • 第一种返回渲染函数
  • 第二种optionsApi方式

  • 第三种setup函数模式

// 三种不同写法的tsx语法 一和3的方式用的比较多 我们这里主要是使用第三种
// 第一种返回渲染函数
/* export default function () {return <div>cookie</div>;
} */// 第二种optionsApi方式/*import { defineComponent } from "vue";export default defineComponent({data() {return {name: "cookie123",};},render() {return <div>{this.name}</div>;},
}); *///第三种setup函数模式
/* import { defineComponent } from "vue";
export default defineComponent({setup() {return () => <div>cookie-setup</div>;},
}); */

父组件

<template><div class=""></div><Cookie :title="'Cookie标题'" @cusemit="getStr"></Cookie><hr /><MyTSX title="MyTSX标题" @emit1="getStr"></MyTSX>
</template><script setup lang="ts">
import { ref, reactive } from "vue";
import MyTSX from "./components/MyTSX";
import Cookie from "./components/Cookie ";
let getStr = (params: string) => {console.log("a接收,,,", params);
};
</script><style lang="less" scoped></style>

子组件MyTSX.tsx

  • 派发事件注意函数柯里化
// 三种不同写法的tsx语法 一和3的方式用的比较多 我们这里主要是使用第三种
// 第一种返回渲染函数
/* export default function () {return <div>cookie</div>;
} */// 第二种optionsApi方式/*import { defineComponent } from "vue";export default defineComponent({data() {return {name: "cookie123",};},render() {return <div>{this.name}</div>;},
}); *///第三种setup函数模式
/* import { defineComponent } from "vue";
export default defineComponent({setup() {return () => <div>cookie-setup</div>;},
}); */// v-show 指令
// 1.ref在tsx语法中变量中使用{flag.vue},并且值不会如在template中自动解析.value
// 2.在tsx语法中,v-if不支持可使用三元表达式代替
// v-for也是不支持的,需要使用map函数代替
// v-bind直接使用name={}  <div name="666">name</div>
// props emit  <button onClick={fn()}>点击</button>还未点击就触发了 需要使用函数柯里化的方式处理
// slot插槽
import { defineComponent, ref } from "vue";
type Props = {// 泛型字面量title?: string;
};
// 定义一个组件const A = (props, { slots }) => (<div><div>{slots.default ? slots.default() : "默认值"}</div>{/* 定义其他的插槽 slots.bar?.()等同上面的写法 */}<div>{slots.bar?.()}</div></div>
);
export default defineComponent({props: { title: String },emits: ["cusemit"],setup(props: Props, { emit }) {let show = ref(true);let arr = [1, 2, 3, 4, 5];let name = "666";const fn = (a: any) => {console.log("fn触发了", a);emit("cusemit", a);};const slot = {default: () => <div>default插槽值</div>,bar: () => <div>bar插槽值</div>,};return () => (<div><div v-show={show.value}>show</div>{show ? <div>显示1</div> : <div>显示0</div>}{arr.map((v) => {return <div>${v}</div>;})}<div name={name}>name</div><hr /><h3>props emit 语法</h3><div>{props?.title}</div><button onClick={() => fn(33)}>点击</button><hr /><h3>插槽 语法</h3><A v-slots={slot} /></div>);},
});

子组件cookie.tsx 与MyTSX.tsx不同的写法

import { ref } from "vue";
/* 
需要注意的点
1.ref在tsx语法中变量中使用{flag.vue},并且值不会如在template中自动解析.value*/let v = ref<string>("");
let flag = ref(false);
let list = [1, 2, 3];type Props = {// 泛型字面量title: string;
};const renderDom = (props: Props, ctx: any) => {// ctx东西//  1.v-model/*return (<><input v-model={v.value} type="text" /><div>{v.value}</div></>); *///2.v-show ,v-if不支持可以使用js编程的方式去转变/* return (<div><div v-show={flag}>显示1</div><div v-show={!flag}>显示2</div>{flag ? <div>显示3</div> : <div>显示4</div>}</div>); *///3.v-for不支持,可以用map ,v-bind不支持可以用data-index,v-on不支持可以用onClick={tap}  传参使用onClick={tap1.bind(this, 66)}// props在组件中使用的是一样的,事件派发ctxreturn (<div><div>{props.title}</div>{list.map((v) => {return (<div onClick={tap} data-index={v}>${v}</div>);})}<button onClick={tap1.bind(this, 66)}>函数传参,请点击</button><button onClick={tap2.bind(this, ctx)}>派发事件,请点击</button></div>);
};
let tap = () => {console.log("click");
};
let tap1 = (v: number) => {console.log(v);
};
let tap2 = (ctx: any) => {console.log(ctx);ctx.emit("emit1", "发送");
};export default renderDom;

效果图:

18 vue3之自动引入ref插件&深入使用v-model-CSDN博客TIps 在Vue3 v-model 是破坏性更新的v-model在组件里面也是很重要的v-model 其实是一个语法糖 通过props 和 emit组合而成的默认值的改变prop:value -> modelValue;事件:input -> update:modelValue;v-bind 的 .sync 修饰符和组件的 model 选项已移除新增 支持多个v-model新增 支持自定义 修饰符 Modifiershttps://blog.csdn.net/qq_37550440/article/details/142522527?sharetype=blogdetail&sharerId=142522527&sharerefer=PC&sharesource=qq_37550440&spm=1011.2480.3001.8118

相关文章:

  • 每天学习一个技术栈 ——【Django Channels】篇(1)
  • Kafka与RabbitMQ:深入理解两者之间的区别
  • MySQL基础--表的增删改查
  • 时间技能物品竞品抢拍拍卖发布h5公众号小程序开源版开发
  • 笔记整理—linux进程部分(2)使用fork创建进程
  • 尚品汇-自动化部署-Jenkins的安装与环境配置(五十六)
  • 十分钟实现内网连接,配置frp
  • JavaWeb图书借阅系统
  • MapBox Android版开发 6 关于Logo
  • [java][代码]DateUtil用于处理日期和时间
  • excel怎么转换json
  • C++初阶:STL详解(九)——stacke和queue的模拟实现
  • kmeans聚类分析 生活使用案例
  • 解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多,请稍后片刻再重试,或与系统管理员或技术支持联系“问题
  • Java之多态
  • 【附node操作实例】redis简明入门系列—字符串类型
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • java第三方包学习之lombok
  • Laravel Mix运行时关于es2015报错解决方案
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Node 版本管理
  • oldjun 检测网站的经验
  • yii2权限控制rbac之rule详细讲解
  • 工程优化暨babel升级小记
  • 构造函数(constructor)与原型链(prototype)关系
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深度学习在携程攻略社区的应用
  • 使用SAX解析XML
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 云大使推广中的常见热门问题
  • 智能合约Solidity教程-事件和日志(一)
  • 1.Ext JS 建立web开发工程
  • gunicorn工作原理
  • ​人工智能书单(数学基础篇)
  • ‌JavaScript 数据类型转换
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Oracle)SQL优化技巧(一):分页查询
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)visual stdio 书签功能介绍
  • (转)可以带来幸福的一本书
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .gitattributes 文件
  • .gitignore文件---让git自动忽略指定文件
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • :=
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构