TSX常见简单用法(入门) Vue3+Vite

1.安装tsx

1.安装tsx插件

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

2.vite.config.ts里的配置

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里的配置

{
  "compilerOptions": {
    "target": "esnext",
    "useDefineForClassFields": true,
    "module": "esnext",
    "moduleResolution": "node",
    "strict": true,
    "jsx": "preserve",
    "jsxFactory": "h",
    "jsxFragmentFactory": "Fragment",
    "sourceMap": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "lib": ["esnext", "dom"],
    "skipLibCheck": true,
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

这三条为配置项 

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

2.使用TSX

app.vue里的代码

<template>
  <renderDom title="我是标题" @on-click="getNum"></renderDom>
</template>

<script setup lang="ts">

import renderDom from "./App";
import { provide, ref } from "vue";

const data = ref(false);
provide("flag", data);
const getNum = (num: number) => {
  console.log("我接受到了", num);
};
</script>

<style>
</style>

2.app.tsx的代码

import { ref } from "vue";

let v = ref<string>("");
let flag = ref(false);
let arr = ref([0, 1, 2, 3, 4, 5]);
//  tsx不会自动结构所以该用.value还是要使用
type Props = {
  title: string;
};
const renderDom = (props: Props, ctx: any) => {
  return (
    <div>
        <button onClick={clickEmit.bind(this,ctx)}>点击emit</button>
      <h1>{props.title}</h1>
      <div>
        <input v-model={v.value} type="text" />
        <div>
          <h1>{v.value}</h1>
        </div>
      </div>
      <div>
        <div v-show={flag.value}>正确的</div>
        <div v-show={!flag.value}>错误的</div>
      </div>
      {/* <div>
        <div v-if={flag.value}>正确的</div>
        <div v-if={!flag.value}>错误的</div>
        </div> */}
      {/* 不支持v-if 可用三元表达式去代替 */}
      <div>{flag.value ? <div>正确的</div> : <div>错误的</div>}</div>
      {/* 不支持v-for 但可以用map循环去代替 */}
      {/*不支持v-bind,可以直接绑定数值 */}
      <div>
        {arr.value.map((item, i: any) => {
          return (
            <div data-inext={i} onClick={clickIndex.bind(this, i)}>
              {item}
            </div>
          );
        })}
      </div>
    </div>
  );
};

const clickIndex = (i: any) => {
  alert(i);
};

const clickEmit=(ctx:any)=>{
    ctx.emit('on-click',123)
}
export default renderDom;

注意:

1.tsx里面写的标签内容是不会自动解构的,所以ref里面的.value还是要加上值才会出来2.tsx里面支持v-show,v-model,但不支持v-bind,v-for,v-if,所以再写这些的时候要更改写法

v-if使用三元表达式

  <div>{flag.value ? <div>正确的</div> : <div>错误的</div>}</div>

 v-for通过map函数遍历数组来实现

 <div>
        {arr.value.map((item, i: any) => {
          return (
            <div data-inext={i} onClick={clickIndex.bind(this, i)}>
              {item}
            </div>
          );
        })}
  </div>

v-bind可以直接绑值

 <div data-inext={i} onClick={clickIndex.bind(this, i)}>

props和emit使用

1.props

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

(app.vue里传值title)

type Props = {
  title: string;
};
const renderDom = (props: Props, ctx: any) 

(renderDom里面接收后可以使用,和以前一样)

2.emit

const renderDom = (props: Props, ctx: any)

(拿到上下文)

 <button onClick={clickEmit.bind(this,ctx)}>点击emit</button>

(绑定方法)

const clickEmit=(ctx:any)=>{
    ctx.emit('on-click',123)
}

 (通过emit传值)

(以上为app.tsx文件里面)

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

(绑定自定义事件) 

const getNum = (num: number) => {
  console.log("我收到了", num);
};

(拿到值去使用)

(以上为父组件收到并使用)

 

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue3中使用JSX,你需要在Vite项目中安装`@vitejs/plugin-vue-jsx`插件。可以通过以下两种方式安装该插件: 1. 使用npm安装: ``` npm install -D @vitejs/plugin-vue-jsx ``` 2. 使用yarn安装: ``` yarn add -D @vitejs/plugin-vue-jsx ``` 安装完成后,在`vite.config.js`文件中进行配置,添加`vueJsx`插件,并导出一个Vite配置对象。示例代码如下: ```javascript import vueJsx from '@vitejs/plugin-vue-jsx'; export default defineConfig({ plugins: [vueJsx(), /* 其他插件 */], // 其他配置项 }) ``` 配置完成后,你就可以在Vue组件中使用JSX编写代码了。以下是一个使用JSX的Vue3组件的示例代码: ```javascript import { defineComponent, ref } from 'vue'; export default defineComponent({ props: { params: { type: Object, default: () => {} } }, setup(props) { const str = ref<string>('tsx的使用'); const clickFunc1 = () => { console.log('没有参数'); } const clickFunc2 = (msg: string = '默认值') => { console.log(msg); console.log(props); } return () => ( <> <div class="async">{str.value}</div> <button onClick={clickFunc1}>不传参数点击</button> <button onClick={() => clickFunc2('额外参数')}>传参数点击</button> </> ); } }); ``` 请注意,以上示例中使用了`defineComponent`来定义Vue组件,并使用`setup`函数来设置组件的逻辑。在`setup`函数中,可以使用`ref`来定义响应式数据,以及定义其他函数和变量。最后,使用箭头函数返回一个渲染函数来渲染组件的JSX模板。 希望以上信息能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值