• vue 3 + TS 组合式标注类型


    1.组件的 emits 标注类型

    <script setup lang="ts">
    // 运行时
    const emit = defineEmits(['change', 'update'])
    
    // 基于选项
    const emit = defineEmits({
      change: (id: number) => {
        // 返回 `true` 或 `false`
        // 表明验证通过或失败
      },
      update: (value: string) => {
        // 返回 `true` 或 `false`
        // 表明验证通过或失败
      }
    })
    
    // 基于类型
    const emit = defineEmits<{
      (e: 'change', id: number): void
      (e: 'update', value: string): void
    }>()
    
    // 3.3+: 可选的、更简洁的语法
    const emit = defineEmits<{
      change: [id: number]
      update: [value: string]
    }>()
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    2.为 provide / inject 标注类型

    import { provide, inject } from 'vue'
    import type { InjectionKey } from 'vue'
    
    const key = Symbol() as InjectionKey<string>
    
    provide(key, 'foo') // 若提供的是非字符串值会导致错误
    
    const foo = inject(key) // foo 的类型:string | undefined
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    2.1:tip:建议将注入 key 的类型放在一个单独的文件中,这样它就可以被多个组件导入,可以添加如页面结构上的文件夹 types —>typesData.ts,使用 export 导出。

    3.defineExpose 组件:子传父

    3.1当你可能需要为一个子组件添加一个模板引用,以便调用它公开的方法。举例来说,我们有一个 MyModal 子组件,它有一个打开模态框的方法:
    <!-- 子组件 MyModal.vue -->
    <script setup lang="ts">
    import { ref } from 'vue'
    
    const isContentShown = ref(false)
    const open = () => (isContentShown.value = true)
    
    defineExpose({
      open
    })
    </script>
    
    
    <!--父组件 App.vue -->
    <script setup lang="ts">
    import MyModal from './MyModal.vue'
    
    const modal = ref<InstanceType<typeof MyModal> | null>(null)
    
    const openModal = () => {
      modal.value?.open()
    }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    3.2当你是传值时
    <!-- 父组件.vue -->
    <Index ref="childeRef"></Index>
     
    <script setup>
        import Index from "./index.vue";
        const childeRef = ref();
        function test() {
            console.log(childeRef.value.msg) // Hello World
        }
        onMounted(() => {
          let flag:boolean = true;
          let value:number= 5;
          childeRef.value.childFn(flag,value) // 调用子组件函数, 输出 6
        })
    </script>
    
    
    <!-- 子组件.vue -->
    <script setup>
        import {ref} from "vue";
     
        function childFn(type:boolean, data:number) {
            console.log('我是子组件');
            if(data){
               let value = data + 1;   
               return value;
            }
        }
        
        const msg = 'Hello World';
        const num = ref(0);
        
        defineExpose({ //暴露想要传递的值或方法
            msg,
            childFn,
        });
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    Mac安装brew、mysql、redis
    【花雕动手做】有趣好玩的音乐可视化系列小项目(15)--横排LED方管灯
    Cppcheck 详细介绍
    C++智能指针与类型转换
    Verilog的奇技淫巧[更新中]
    BERT:来自 Transformers 的双向编码器表示 – 释放深度上下文化词嵌入的力量
    【C语言刷题】牛客网刷题——替换空格
    【MAPBOX基础功能】16、mapbox叠加图片图层到地图上
    18 Linux之Python定制篇-Python开发平台Ubuntu
    vue全局字典值获取方法一例
  • 原文地址:https://blog.csdn.net/weixin_47981445/article/details/138133555