TSX 写法介绍和实践

发布于 2024-08-11 12:00:44 字数 3719 浏览 13 评论 0

TSX

之前使用 Template 去写我们模板,现在可以扩展另一种风格 TSX 风格,使用 vite 打包工具的话,需要安装: npm install @vitejs/plugin-vue-jsx -D ,并配置 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()],
})

tsconfig.json 配置文件添加:

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

配置完成就可以使用啦,在目录新建一个 xxxxxx.tsx ​ 文件

使用 TSX

ref

tsx 不会自动解包,使用 ref 要加 .vlaue

 
import { ref } from 'vue'
 
let flag = ref("hello")
 
const renderDom = () => {
  return (
    <div>
       {flag.value}
    	</div>
  )
}

export default renderDom

v-model

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

v-show

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

v-bind

直接赋值就可以

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

v-on

所有绑定事件都按照 react 风格来

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

不支持 v-if

需要改变风格

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

不支持 v-for

需要使用 Map

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

Props 接受值

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

Emit 派发

type Props = {
  title: string
}

const renderDom = (props: Props,content:any) => {
  return (
  <div>
    <div>{props.title}</div>
    <!-- 传参必要要绑定 this, 也可以箭头函数写法,内部调用该方法 -->
    <button onClick=> {clickTap.bind(this,content)}>点击</button>
  </div>
  )
}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
773 人气
更多

推荐作者

苍风燃霜

文章 0 评论 0

悸初

文章 0 评论 0

撧情箌佬

文章 0 评论 0

森罗

文章 0 评论 0

lyn1245

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文