本文介绍: 绑定事件按照React风格来。构建的,所以安装的是。

一、前置准备

完整用法请见文档Vue 3 Babel JSX 插件

1. 安装插件

文章基于vite 构建的,所以安装的是 @vitejs/plugin-vue-jsx见文档

npm i @vitejs/plugin-vue-jsx

2. 配置vite.config.ts

// vite.config.ts
import vueJsx from '@vitejs/plugin-vue-jsx'

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

3. 配置tsconfig.json

{
  "compilerOptions": {
    "jsx": "preserve",
    "jsxFactory": "h",
    "jsxFragmentFactory": "Fragment",
    ...
  },
  ...
}

二、使用TSX

1. tsx三种书写方法

1.1 直接返回一个渲染函数
export default function () {
  return (
    <&gt;
      测试
    </&gt;
  )
}
1.2 optionsAPI(不常用)
import { defineComponent } from 'vue'

export default defineComponent({
  data(vm) {
    return {
      num: 18
    }
  },
  render() {
    return (<&gt;{this.num}</&gt;)
  }
})
1.3 setup函数模式
import { defineComponent } from 'vue'

export default defineComponent({
  setup() {
    return () =&gt; (<&gt;测试</&gt;)
  }
})

2. tsxtemplate区别(以下以setup函数模式为例

2.1 {}

template变量渲染使用{{}},而 tsx 使用 {},且可以直接使用 {} 代替 v-bind

2.2 ref的使用

templateref自动解包,而 tsx 不会,所以需要 .value

import { defineComponent, ref } from 'vue'

export default defineComponent({
  setup() {
    const num = ref(18)
  
    return () =&gt; (<>需要使用.value{num.value}</>)
  }
})
2.3 vshow

tsx 支持 v-show

import { defineComponent, ref } from 'vue'

export default defineComponent({
  setup() {

    const flag = ref(true)

    return () => (<div v-show={flag.value}>v-show</div>)
  }
})
2.4 v-if

tsx支持 v-if 可以使用三元表达式代替

...
return () => (flag.value ? <div>flagtrue</div> : <div>flagfalse</div>)
2.4 v-for

tsx支持 v-for 可以使用map代替

...
const list = [{ name: '多多' }, { name: '小多' }, { name: '小凡' }]

return () => (
	list.map((item) => (<div>{item.name}</div>))
)
2.5 v-on

绑定事件按照React风格

...
    const flag = ref(true)

    return () => (
      <>
        <button onClick={() => flag.value = !flag.value}>改变flag</button>
        <div>flag{`${flag.value}`}</div>
      </>
    )

注意

2.6 Props
import { defineComponent, ref } from 'vue'

interface Props {
  name?: string
}

export default defineComponent({
  props: {
    name: String
  },
  setup(props: Props) {
    return () => (
      <>
        props: {props?.name}
      </>
    )
  }
})
2.7 emit
import { defineComponent, ref } from 'vue'

interface Props {
  name?: string
}

export default defineComponent({
  props: {
    name: String
  },
  emits: ['emit-test'],
  setup(props: Props, {emit}) {

    const fn = (num: number) => {
      emit('emit-test', num)
    }

    return () => (
      <>
        <button onClick={() => fn(11)}>派发</button>
      </>
    )
  }
})
2.8 插槽
import { defineComponent, ref } from 'vue'

export default defineComponent({
  setup() {

    const slot = {
      default: () => (<section>这是渲染内容</section>),
      header: () => (<h2>这是标题</h2>)
    }
    
    return () => (
      <>
        <A v-slots={slot}></A>
      </>
    )
  }
})

const A = (_: any, { slots }: any) => (
  <>
    <div>{slots.header?.()}</div>  {/* 不设置默认值写法 */}
    <hr />
    <div>{slots.default ? slots.default() : '默认值'}</div> {/* 设置默认值 */}
  </>
)
2.9 v-model

tsx 支持 v-model

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

原文地址:https://blog.csdn.net/wgh4318/article/details/128659790

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_33846.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注