猫哥

vuePress-theme-reco 猫哥    2017 - 2025
猫哥 猫哥
主页
博客
  • 杂谈游记
  • 技术笔记
  • 前端技术
  • 前端
  • 杂物收纳
标签
时间轴
关于
author-avatar

猫哥

35

文章

32

标签

主页
博客
  • 杂谈游记
  • 技术笔记
  • 前端技术
  • 前端
  • 杂物收纳
标签
时间轴
关于

Vue3

vuePress-theme-reco 猫哥    2017 - 2025

Vue3

猫哥 2023-03-07 Vue3+tsx

介绍

Vue3

1.vue3+tsx 的几种写法 接下来使用几个简单的代码书写几种写法 第一种写法。

import {defineComponent} from 'vue'

export default defineComponent({

    setup(){

        // 这里使用()不用写return  如果是{}则需要写
        // 内部只能有一个跟标签,你可以使用<></>
        return ()=>(
            <div>hello tsx</div>
        )
    }


})

2.第二种写法 变量使用{},只要在 tsx 想使用任何非字符串的代码,都需要用 {} 包裹,包括数字、布尔、函数表达式。

import {defineComponent} from 'vue'

export default defineComponent({

    setup(){

        // 这里主要书写你的js代码,生命周期,状态等
        // 但是需要将状态方法暴露出去

        let a = ref<string>('12')

        return {a}
    },
    render(){
        return (
            <div>{this.a}<div>
        )
    }

})
  1. 接收父组件传值 需要 props 进行传值类型的设置,就会映射到 setup 中的 props,props 才能拿到值。
export default defineComponent({
  props: {
  },
  setup(props) {
    const msg = ref('hello tsx')
    const state = reactive({
      count: 1
    })

    return () => (
      <div>
        {msg.value} <span>{state.count}</span>
      </div>
    )
  }
})

4.指令 bing 指令:

vue中写法:

<A  :data="data"></A>

tsx写法:

<A data={data}></A>

vue 中需要进行组件的注册,tsx 写法如下:

import {defineComponent} from 'vue'
import A from '..'

export default defineComponent({

    setup(){
        return ()=>(
            <div>
                <A></A>
            </div>
        )
    }

})

v-if:

vue中

<div v-if="flag"></div>


tsx中判断则与react相似,与vue原始写法有较大差距

{
    flag?<div></div>:null
}

v-for:

vue中

let data =[{},{},{}]

<div v-for="item in list" :key="item">{{item}}</div>



tsx中

{
    data?.map((item)=>{
        return <div key={item}>{item}</div>
   })
}

v-model

vue中

<input  v-model="keyword" />

tsx中

<input v-model={keyword} />

v-model 传递参数 vue2 中使用 v-bind.sync 来实现数据的双向绑定,vue3 中移除此写法,只能使用 v-model,tsx 写法没有多大变化,emit 需要在 setup 第二个参数中解构。

vue2写法

<Child :title.sync="title" />

然后需要在子组件更新父组件的值,

this.$emit('update:title',newValue)


vue3写法

<Child v-model='title'/>

const emits = defineEmits(['increase']);

emits('update:modelValue',newVlaue)


如果不想使用默认名称modelValue,可以这样

<Child v-model:title='title'></Child>

const emits = defineEmits(['事件']);

emits('update:title',newVlaue)

vue3+tsx 写法如下:

<Child v-model={[pageTitle,'pageTitle']}/>

传递一个数组,第一项为传递的值,第二项为子组件接收的名称

setup(props,{emit}){

emit('update:pageTitle',newValue)

}

v-model 修饰符

vue写法

<input v-model.trim="keyword"/>

tsx写法


<input v-model={[keyword,['trim']]}/>



vue写法
<input v-model:title="keyword"/>

tsx写法

<input v-model:title={keyword}/>

或者
<input v-model={[keyword,'title']}/>

插槽用法 子组件写法:

import { defineComponent } from "vue";

export default defineComponent({
  name: "main",
  setup(props, { slots }) {
    return () => (
      <div>
        {slots.default ? slots.default() : null}
        {slots.title ? slots.title() : null}
      </div>
    );
  },
});

父组件写法:

 <Main
     v-slots={{
        default:()=> <div>我是默认插槽</div>,
         title: ()=> <div>我是具名插槽</div>,
        }}
      ></Main>


或者



<Main>
    <slot name={'default'}>123</slot>
    <slot name={'title'}>123</slot>

</Main>

4.事件监听

vue写法

<div @click="handleClick"></div>


tsx写法

<div onClick={handleClick}></div>

传递参数

vue 传参就是@click="handleClick(1)",但是如果 tsx 写法和 react 一样,不用回调的形式写,会导致函数直接执行,并不会点击触发事件。正确写法:onClick={()=>handleClick(1)}

5.样式文件引入 全局引入 scss 文件:

vite.config.ts

css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@import '@/style.scss';`,
        },
      },
    },

或者在 main.ts 中引入样式文件 6.动态 class 写法

vue 模块中写法

<div :class="{active:true}"></div>


tsx 写法  多类名写法

<div class={['box',true?'active':'']}></div>