vue3 + tsx语法小记

构建vue3 + ts

目录

构建vue3 + ts

支持TS语法

语法

指令

v-if

v-bind

v-for

v-model v-show

事件绑定

组件通信

父向子

子向父传

插槽


npm create vite@latest


# npm 6.x
npm create vite@latest my-vue-app --template vue-ts

# npm 7+, extra double-dash is needed:
npm create vite@latest my-vue-app -- --template vue-ts

查看 create-vite 以获取每个模板的更多细节:vanilla,vanilla-ts,vue,vue-ts,react,react-ts,preact,preact-ts,lit,lit-ts,svelte,svelte-ts。

支持TS语法

  1. 安装jsx库
npm i @vitejs/plugin-vue-jsx -D
  1. 安装完成之后在vite.config.ts中使用插件
import vueJsx from '@vitejs/plugin-vue-jsx'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(),vueJsx()]
})

语法

// 注意ref创建的数据不管在什么地方都应该.value 跟原生vue3有区别

// 组件定义

import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
    // Todo
    return () => (
      <div>
        <div>Child1</div>
        <div>Child2</div>
        <div>Child3</div>
      </div>
    )
  }
})
// 多节点
return () => (
  <>
    <div>Child1</div>
    <div>Child2</div>
    <div>Child3</div>
  </>
)


// 一种条件语法  但是不是v-if
import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
    // Todo
    return () => {
      if (something) {
        return (
          <div>
            <div>Child1</div>
            <div>Child2</div>
            <div>Child3</div>
          </div>
        )
      } else {
        return (
          <div>noChild</div>
        )
      }
    }
  }
})
 

指令

v-show 正常使用

v-if

{
    isShow.value ? <span>v-if yes</span> : <span>v-else no</span>
}

v-bind

<Home num={num.value} a="1"></Home>  

v-for

{
    arr.map(item => {
        return (
            <div>
                <span>{item}</span>
            </div>
        )
    })
}

v-model v-show

<input type="text" v-model={text.value} />
<div v-show={isShow.value}>v-show</div>

事件绑定

<button onClick={changeShow} data-name={text.value}>点击1</button>
<button onClick={changeDemo.bind(this,text.value)}>点击2</button>
<button onClick={e => changeDemo(text.value)}>点击3</button>

组件通信

父向子

需要注意的是,prop传递过来的值如果没有默认值,需要判断是否为空,可以使用计算属性或者条件渲染处理。

// 父亲
<Home num={num.value} a="1"></Home>

// Home组件
// 先是props接收定义类型,之后在setup中使用
import {defineComponent,toRefs} from 'vue'

export default defineComponent({
    props: {
        num: Number,
        a:{
          type:String,
          default: ''
        }
    },
    setup(props) {
        console.log(props,88);
        return () => (
            <div>Home page{props.num}{props.a}</div>
        )
    }
})



// provide  inject是支持的
// 注意  provide  inject必须写在setup下层   不能是下下层

子向父传

// 绑定自定义事件实现
//    父组件  监听消息

function giveHome(val:any) {
  // 应该采用这种方式去处理
    Object.assign(arr,val)
}
<Home num={num.value} a="1" onGiveHome={giveHome}></Home>


// Home组件
// 先接收    在事件中发布
emits: ['giveHome'],
setup(props, {emit}) {
      let arr = reactive([1,2,3,4,5,6])
      onMounted(() => {
          console.log(999);
          
          emit('giveHome',arr)
      })
      return () => (
          <>
              <div>Home page{props.num}{props.a}</div>
              {
                  arr.map(item => {
                      return (
                          <div>
                              <span>{item}</span>
                          </div>
                      )
                  })
              }
          </>
      )
  }

插槽

// 父组件中
<Home num={num.value} a="1" onGiveHome={giveHome}
    v-slots={{
        default: () => <h1>默认插槽</h1>,
        main: () => '具名插槽',
        work: (props:number) => '我才是主要的' + props
    }}
></Home>

//子组件
<div>
    默认插槽:{slots.default && slots.default()}
    具名插槽: {slots.main && slots.main()}
    作用域插槽:{slots.work && slots.work(b)}
</div>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ankang_路上的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值