我们之前呢是使用Template去写我们模板。现在可以扩展另一种风格TSX风格

vue2 的时候就已经支持jsx写法,只不过不是很友好,随着vue3对typescript的支持度,tsx写法越来越被接受

1.安装插件

npm install @vitejs/plugin-vue-jsx -D
vite.config.ts 配置
image.png

  1. import { defineConfig } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import vueJsx from '@vitejs/plugin-vue-jsx';
  4. // https://vitejs.dev/config/
  5. export default defineConfig({
  6. plugins: [vue(),vueJsx()]
  7. })

2.修改tsconfig.json 配置文件

  1. "jsx": "preserve",
  2. "jsxFactory": "h",
  3. "jsxFragmentFactory": "Fragment",

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

3.使用TSX

TIPS tsx不会自动解包使用ref加.vlaue ! ! !
tsx支持 v-model 的使用

  1. import { ref } from 'vue'
  2. let v = ref<string>('')
  3. const renderDom = () => {
  4. return (
  5. <>
  6. <input v-model={v.value} type="text" />
  7. <div>
  8. {v.value}
  9. </div>
  10. </>
  11. )
  12. }
  13. export default renderDom

v-show

  1. import { ref } from 'vue'
  2. let flag = ref(false)
  3. const renderDom = () => {
  4. return (
  5. <>
  6. <div v-show={flag.value}>景天</div>
  7. <div v-show={!flag.value}>雪见</div>
  8. </>
  9. )
  10. }
  11. export default renderDom

v-if是不支持的

所以需要改变风格

  1. import { ref } from 'vue'
  2. let flag = ref(false)
  3. const renderDom = () => {
  4. return (
  5. <>
  6. {
  7. flag.value ? <div>景天</div> : <div>雪见</div>
  8. }
  9. </>
  10. )
  11. }
  12. export default renderDom

v-for也是不支持的

需要使用Map

  1. import { ref } from 'vue'
  2. let arr = [1,2,3,4,5]
  3. const renderDom = () => {
  4. return (
  5. <>
  6. {
  7. arr.map(v=>{
  8. return <div>${v}</div>
  9. })
  10. }
  11. </>
  12. )
  13. }
  14. export default renderDom

v-bind使用

直接赋值就可以

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

v-on绑定事件 所有的事件都按照react风格来

  • 所有事件有on开头
  • 所有事件名称首字母大写 ```javascript

const renderDom = () => { return ( <> </> ) }

const clickTap = () => { console.log(‘click’); }

export default renderDom

  1. <a name="LP2Pz"></a>
  2. ### Props 接受值
  3. ```javascript
  4. import { ref } from 'vue'
  5. type Props = {
  6. title:string
  7. }
  8. const renderDom = (props:Props) => {
  9. return (
  10. <>
  11. <div>{props.title}</div>
  12. <button onClick={clickTap}>点击</button>
  13. </>
  14. )
  15. }
  16. const clickTap = () => {
  17. console.log('click');
  18. }
  19. export default renderDom

Emit派发

  1. type Props = {
  2. title: string
  3. }
  4. const renderDom = (props: Props,content:any) => {
  5. return (
  6. <>
  7. <div>{props.title}</div>
  8. <button onClick={clickTap.bind(this,content)}>点击</button>
  9. </>
  10. )
  11. }
  12. const clickTap = (ctx:any) => {
  13. ctx.emit('on-click',1)
  14. }

————————————————
版权声明:本文为CSDN博主「小满zs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq1195566313/article/details/123172735