• Vue3.3 的新功能的体验(下):泛型组件(Generic Component) 与 defineSlots


    上一篇说了 DefineOptions、defineModel、Props 的响应式解构和从外部导入类型 这几个新功能,但是没有说Generic、defineSlots等,这是因为还没有完全搞清楚可以用在什么地方。折腾了几天终于弄清楚了。

    这还要从 TS 的泛型说起。

    泛型的目的和意义

    泛型仅仅只是表达传啥都行吗?当然不是,因为js原生就支持“泛型”,本来就啥都可以传的。
    泛型的目的是——约束!泛型相当于制定了一个白名单,名单里面的类型可以传,不在名单里面的不可以传。

    TS 的泛型可以帮助我们更准确的推断类型,从而在编写代码的时候,可以有更准确的提示和提供验证依据。

    泛型组件(Generic Component)

    组件的props可以设置各种类型,那么如果想用泛型的话,要如何设置呢?这就需要使用 Generic:

    
    
    <template>
      <ts :list="list2" > 
        <h1>测试插槽h1>
        <template #col="{ item, index }"> 
          序号:{{ index }}<br> 
          内容:{{ item }}
        template>
      ts>
    template>
    

    UI库里的 table 组件一般都会支持这样的插槽,以便于灵活设置列表,比如 el-table 的 el-table-column:

    (来自官网示例代码)

    <el-table :data="tableData" style="width: 100%">
        <el-table-column label="日期" width="180">
          <template #default="scope">
            <div style="display: flex; align-items: center">
              <el-icon><timer />el-icon>
              <span style="margin-left: 10px">{{ scope.row.date }}span>
            div>
          template>
        el-table-column>
        ...
      el-table>
    

    这里的 default 就是一个匿名作用域插槽,可以通过scope.row获得每一行的数据。

    defineEmits

    defineEmits 是定义事件的一种快捷表达方式,也是一种语法糖,这个和 defineModel 有重合的地方,那就是 v-model 的 update:modelValue 的部分。

    话说,组件需要事件吗?以前是事件驱动,现在是数据驱动,或者说是状态驱动。以前监听事件,现在只需要监听状态的变化即可,从dom脱离出来。

    好吧,其实我基本已经不使用 emit 了,感觉似乎并不需要了。

    参考资料

    Generic component enhancements - Discussion #436:

    unplugin-vue-define-options - npm: https://www.npmjs.com/package/unplugin-vue-define-options

    Announcing Vue 3.3 | The Vue Point: https://blog.vuejs.org/posts/vue-3-3

    Vue 3.3 主要新特性详解 - 三咲智子 Kevin Deng: https://xlog.sxzz.moe/vue-3-3

    5 Vue3.3 发布:十分钟速递

    6 官方帮助文档

    7 elementPlus

  • 相关阅读:
    Oracle/PLSQL: Sinh Function
    借助开源表单设计器,让办公流程化更顺畅!
    antd树型表格的逐级展开折叠(每次展开都只展开到当前未展开的最小层级,每次折叠都只折叠到当前未折叠的最大层级)
    [Numpy] np.where
    举报即有机会解锁CSDN限定勋章|2022上半年CSDN社区治理数据公布
    睡眠剥夺后皮层微结构的广泛变化
    【Docker从入门到入土 5】 使用Docker-compose一键部署Wordpress平台
    模块、服务、接口命名示例
    复杂微纳结构制造需求旺盛 微纳3D打印市场发展前景广阔
    Spark框架概述
  • 原文地址:https://www.cnblogs.com/jyk/p/17434408.html