【Vue3+Vite+Ts+element-plus】vue 使用 tsx语法详解

系列文章目录

【Vue3+Vite+Ts+element-plus】
超级详细 最新 vite4+vue3+ts+element-plus+eslint-prettier 项目搭建流程
【Vue3+Vite+Ts+element-plus】使用tsx实现左侧栏菜单无限层级封装
【Ts 系列】
TypeScript 从入门到进阶之基础篇(一) ts类型篇


文章目录

  • 系列文章目录
  • 前言
  • 一、必要插件安装
    • 1.安装
    • 2.配置
  • 二、vue文件与 tsx文件内容区别
  • 三、绑定变量
  • 四 、v-show与v-if、v-else 命令
  • 五、v-for 循环
  • 六、插槽
  • 七、事件监听


前言

本章我们将了解 在vue中使用tsx 语法 和我们日常vue正常开发上的一些语法区别

一、必要插件安装

我们需要创建一个vue3项目 我用的是vite去创建vue3+ts 项目的 ,这里就不多讲项目的创建了 ,如果要详细的项目搭建流程可参考:超级详细 最新 vite4+vue3+ts+element-plus+eslint-prettier 项目搭建流程
在使用tsx之前 我们要安装一些插件 使我们的项目支持tsx

1.安装

//下面3种安装方式选择一种 推荐pnpm
yarn add @vitejs/plugin-vue-jsx
//or
npm install @vitejs/plugin-vue-jsx -D
//or
pnpm install @vitejs/plugin-vue-jsx -D

2.配置

在 vite.config.ts 文件中挂载

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

tsconfig.json 文件中

{
  // include 需要包含tsx
"include": ["src/*", "src/**/*.vue", "src/**/*.tsx", "src/**/*.jsx", "src/**/*.ts", "src/**/*.js"],
 "compilerOptions": {
    // 在.tsx文件里支持JSX
    "jsx": "preserve",
 }
}

二、vue文件与 tsx文件内容区别

在普通的vue 文件中 内容结构都是用 SFC 方式结构固定:template、script、style

<template>
  <div>Hello World</div>
</template>

<script setup lang="ts">
</script>

<style scope>
</style>

而在tsx中 完全是一个ts文件的写法 如下

import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
    return () => <div>Hello World</div>
  }
})

三、绑定变量

在vue 文件中 我们绑定变量 是以 v-bind: 的方式或者简写的:冒号 ,而在tsx中则是以大括号的方式来绑定变量 如下面代码

//vue
<template>
  <div :class="className"></div>
</template>

<script lang="ts" setup>
const className=ref('name')
</script>
//vtsx
import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
  	const className=ref('name')
    return () => <div class={className}></div>
  }
})

四 、v-show与v-if、v-else 命令

在tsx 中 是支持v-show指令 具体用法如下 与vue文件中的用法没有区别
只是写法上需要以{} 的方式 定义这是一个变化的变量

//tsx
import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
  	const isShow=ref(true)
    return () => <div v-show={isShow.value}>Hello World</div>
  }
})

注意 在tsx 是不支持v-if 的 ,我们可以使用条件判断语句来实现v-if的功能,一般是三目运算符

//tsx
import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
  	const isShow=ref(true)
    return () => <div>{isShow.value?'Hello':'Hello 前端小羽'}</div>
  }
})

五、v-for 循环

在vue中 我们生成一个列表 通常是用 v-for 的方法去实现的 ,但是在tsx中是不支持 v-for写法的 所以通常是用map循环的方式来生成列表 具体代码区别如下:

//vue
<template>
  <div>
  	<div v-for="item in list" :key="item">{{item}}</div>
  </div>
</template>

<script lang="ts" setup>
const list=ref([1,2,3,4,5,6])
</script>
//vtsx
import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
  	const list=ref([1,2,3,4,5,6])
    return () =>
     <div>
     {
     list.map((item:any)=>(<div>{item}</div))
     }
    </div>
  }
})

六、插槽

在vue中插槽的实现方式如下

// SFC child
<template>
  <div>
    <slot>默认插槽: default</slot>
    <br />
    <slot name="content">具名插槽:content</slot>
    <br />
    <slot name="main" :test="111" >作用域插槽:main</slot>
  </div>
</template>

// SFC parent
<template>
  <div>
    <child>
      <template #main="row"> {{ row.test}} </template>
      <template #content>我是内容</template>
    </child>
  </div>
</template>

在tsx中插槽的写法2如下

// TSX child
import { defineComponent } from 'vue';

export default defineComponent({
  setup(props, { slots }) {
    return () => (
      <div>
        默认插槽: {slots.default && slots.default()}
        <br />
        具名插槽: {slots.content&& slots.content()}
        <br />
        作用域插槽:{slots.main && slots.main({ name: '我是作用域插槽的传值' })}
      </div>
    );
  }
});

// TSX parent 第一种方式
return () => (
  <Child v-slots={{
      default: () => '默认',
      content: () => '我是内容',
      main: (props: Record<'name', string>) =>  + props.name
    }}>
  </Child>
)

// 第二种方式
return () => (
const slot={
      default: () => '默认的内容是',
      content: () => '我是有名称的',
      main: (props: Record<'name', string>) => props.name
    }
  <Child v-slots={slot}>
  </Child>
)

七、事件监听

在vue 中 监听事件使用 v-on或者@ ,但是在tsx中则是以on开头,即使我们的自定义事件没有on,也要在监听的时候加上,一般都采用的是小驼峰的方式 例如@change 变成 onChange @click 变成 onClick 事件等。
注意 如果是自定义事件只需要在事件名前面加上on即可

// SFC
<template>
  <div @click="hanClick">无参数</div>
  <div @click="(event) => hanClick1(event)">鼠标事件参数</div>
  <div @click="hanClick2('我是前端小羽')">自定义参数</div>
</template>

// TSX
return () => (
  <>
    <div onClick={hanClick}>无参数</div>
    <div onClick={(event) => hanClick1(event)}>鼠标事件参数</div>
    <div onClick={() => hanClick2('我是前端小羽')}>自定义参数</div>
  </>
);
const hanClick= () => {
  console.log('click');
};
const hanClick1= (e: MouseEvent) => {
  console.log(e.offsetX);
};
const hanClick2= (name: string) => {
  console.log(name);
};

你可能感兴趣的:(vue3+vite项目实战,vue,vue.js,前端,javascript)