一、前置准备
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 (
<>
测试
</>
)
}
1.2 optionsAPI(不常用)
import { defineComponent } from 'vue'
export default defineComponent({
data(vm) {
return {
num: 18
}
},
render() {
return (<>{this.num}</>)
}
})
1.3 setup函数模式
import { defineComponent } from 'vue'
export default defineComponent({
setup() {
return () => (<>测试</>)
}
})
2. tsx与template的区别(以下以setup函数模式为例)
2.1 {}
在 template
中 变量渲染使用{{}}
,而 tsx
使用 {}
,且可以直接使用 {}
代替 v-bind
2.2 ref的使用
在 template
中 ref
会自动解包,而 tsx
不会,所以需要 .value
import { defineComponent, ref } from 'vue'
export default defineComponent({
setup() {
const num = ref(18)
return () => (<>需要使用.value:{num.value}</>)
}
})
2.3 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
...
return () => (flag.value ? <div>flag为true</div> : <div>flag为false</div>)
2.4 v-for
...
const list = [{ name: '多多' }, { name: '小多' }, { name: '小凡' }]
return () => (
list.map((item) => (<div>{item.name}</div>))
)
2.5 v-on
...
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
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进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。