vue3中tsx的基本语法使用

注意:如需在vue3中配置tsx的环境,请点击这里
注意:以下的教程均会以第三种写法来写

事件及修饰符的使用

经测试,capture、once 和 passive三个事件修饰符必须使用链接模式,使用withModifiers不生效(后续vue版本更新后有可能可以,目前这里是暂时不行,当前教程vue版本:3.2.37)

import { defineComponent, ref, withModifiers } from "vue";
export default defineComponent({
  setup(){
    const num = ref<number>(0);
    const addNum = () => {
      num.value += 1;
    }
    return () => (
      <div>
        <div>{num.value}</div>
        // 基本事件
        <button onClick={addNum}>1</button>
        // once事件修饰符,但ts可能会报警告
        <button onClickOnce={addNum}>我只会触发一次</button>
        // once事件修饰符与capture事件修饰符链式使用
        <button onClickOnceCapture>多个事件修饰符</button>
        // 阻止事件传递及按键ctrl才能触发
        <button onClick={withModifiers(addNum, ['stop', 'ctrl'])}>withModifiers的使用</button>
      </div>
    );
  }
})
v-model的使用

语法:v-model={[‘传递的数据’, ‘如果不设置我,默认是modelValue’, [‘修饰符,可多个’]]}

//父组件
import { defineComponent, ref } from "vue";
import ChildCom from '@/components/child/index';
export default defineComponent({
  setup(){
    const num = ref<number>(0);
    const addNum = () => {
      num.value += 1;
    }
    return () => (
      <div>
        <div>我是tsx{num.value}</div>
        <button onClick={addNum}>父组件加1</button>
        <ChildCom v-model={[num.value, 'num']} />
      </div>
    );
  }
});
//子组件
import { defineComponent } from "vue";
export default defineComponent({
  props: {
    num: {
      type: Number,
      default: 0
    }
  },
  emits: ['update:num'],
  setup(props, { emit }){
    const addNum = () => {
      emit('update:num', props.num + 1);
    }
    return () => (
      <div>
        <div>{props.num}</div>
        <button onClick={addNum}>子组件加1</button>
      </div>
    );
  }
})
插槽的使用
1.匿名插槽
// 父组件
import { defineComponent } from "vue";
import ChildCom from '@/components/child/index';
export default defineComponent({
  setup(){
    return () => (
      <div>
        <ChildCom>匿名插槽的使用</ChildCom>  // 匿名插槽的话我个人喜欢这种
        // 或者
        <ChildCom>{() => '匿名插槽的使用'}</ChildCom>        
      </div>
    );
  }
})
// 子组件
import { defineComponent } from "vue";
export default defineComponent({
  setup(props, { slots }){
    return () => (
      <>
        <div>{ slots.default ? slots.default() : '' }</div>
      </>
    );
  }
})
2.具名插槽
// 父组件
import { defineComponent } from "vue";
import ChildCom from '@/components/child/index';
export default defineComponent({
  setup(){
    return () => (
      <div>
        <ChildCom>{{
          default: () => <h5>默认插槽</h5>,
          aaa: () => <h4>具名插槽</h4>
        }}</ChildCom>
      </div>
    );
  }
})
3.插槽传值
// 父组件
import { defineComponent } from "vue";
import ChildCom from '@/components/child/index';
export default defineComponent({
  setup(){
    return () => (
      <div>
        <ChildCom>{{
          default: () => <h5>默认插槽</h5>,
          aaa: ({num}: {num: number}) => <h4>具名插槽值为:{num}</h4>
        }}</ChildCom>
      </div>
    );
  }
})
// 子组件
import { defineComponent, ref } from "vue";
export default defineComponent({
  setup(props, { slots }){
    const num = ref<number>(0);
    const addNum = () => {
      num.value++;
    }
    return () => (
      <>
        <div>{ slots.default ? slots.default() : '' }</div>
        <div>{ slots.aaa ? slots.aaa({num: num.value}) : '' }</div>
        <button onClick={addNum}>点我改变插槽名为aaa的值</button>
      </>
    );
  }
})
自定义指令的使用

实现一个指令,使文本框自动获得焦点,如果传递了延迟时间,则延迟指定时间后获得焦点

// main.ts
import { createApp, Directive } from 'vue'
import App from './App'

const inputFocus: Directive<HTMLInputElement> = {
  mounted(el, binding){
    const value = isNaN(binding.value) ? 0 : binding.value
    console.log(binding.modifiers) // 修饰符
    const arg = typeof binding.arg === 'boolean' ? binding.arg : false // 如果传递了arg参数,且为true,则五秒后获得焦点
    if(arg){
      setTimeout(() => {
        el.focus && el.focus();
      }, 5000);
      return
    }
    setTimeout(() => {
      el.focus && el.focus();
    }, value);
  }
}
const app = createApp(App)
app.directive('inputFocus', inputFocus);
app.mount('#app')


// App.tsx
import { defineComponent, ref } from "vue";
export default defineComponent({
  setup(){
    const bol = ref(true)
    return () => (
      <div>
        <div>默认情况:<input v-inputFocus /></div>
        <div>延迟2s:<input v-inputFocus={2000} /></div>
        <div>arg参数情况:<input v-inputFocus={[2000, bol.value]} /></div>
        // 语法格式为 v-xxx={[value, arg, ['modifiers1', 'modifiers2', ...]]}
      </div>
    );
  }
})
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,那我来给你提供一个使用 Vue 3 + TSX 语法的实现方案。 首先,我们需要安装 `@vue/runtime-dom` 和 `@vue/compiler-dom` 这两个包以支持 Vue 3 的编译和运行时: ``` npm install @vue/runtime-dom @vue/compiler-dom ``` 然后,我们可以创建一个单独的组件来展示 DA 结果。在这个组件,我们可以使用 TSX 语法来定义模板和组件逻辑: ```tsx import { defineComponent, ref } from 'vue'; import { DaResult } from './types'; // 假设 DaResult 是 DA 结果的类型定义 export default defineComponent({ props: { daResult: { type: Object as () => DaResult, required: true, }, }, setup(props) { const isExpanded = ref(false); function toggleExpansion() { isExpanded.value = !isExpanded.value; } return { isExpanded, toggleExpansion, }; }, render() { const { daResult, isExpanded } = this; const { source, query, analyse } = daResult; return ( <div> <div onClick={this.toggleExpansion}> {source} - {query} </div> {isExpanded && ( <div> <div> term_weight: {analyse.basic.ltrfeat.term_weight}, cut_idf:{' '} {atob(analyse.basic.ltrfeat.cut_idf)}, ngram_idf:{' '} {atob(analyse.basic.ltrfeat.ngram_idf)} </div> <div> 成分分析: {formatMaxProb(analyse.search.parse)} </div> <div> 意图识别: {formatMaxProb(analyse.search.type)} </div> {analyse.search.ww && ( <div> ww: {analyse.search.ww.map((wwItem) => ( <div> {wwItem.type === 1 ? 'where' : 'what'}: {wwItem.words.join(', ')} </div> ))} </div> )} </div> )} </div> ); function formatMaxProb(prob: { [key: string]: number }): string { const maxProb = Math.max(...Object.values(prob)); const maxProbLabel = Object.keys(prob).find( (key) => prob[key] === maxProb ); return `${maxProbLabel}: ${maxProb.toFixed(2)}`; } }, }); ``` 这个组件接受一个 `daResult` 属性作为输入,并且使用 `isExpanded` 和 `toggleExpansion` 两个响应式变量来控制是否展开。在模板,我们使用 `onClick` 来绑定展开和收起的事件,并且使用 `isExpanded` 和 JSX 的条件渲染来控制展开和收起时的内容。 需要注意的是,在 TSX 使用插值时,我们需要使用 `{}` 包裹 JavaScript 表达式,并且使用 `this` 来访问组件实例上的属性和方法。 最后,我们可以在父组件使用这个新组件来展示 DA 结果: ```tsx import { defineComponent } from 'vue'; import DaResultComponent from './DaResult'; export default defineComponent({ data() { return { daResults: [], // 假设这里是 DA 结果的数组 }; }, render() { return ( <div> {this.daResults.map((daResult) => ( <DaResultComponent daResult={daResult} /> ))} </div> ); }, }); ``` 这样,我们就可以使用 Vue 3 + TSX 语法来实现这个需求了。需要注意的是,TSX语法和 JSX 有一些不同,需要了解一下它的语法规则。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Agwenbi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值