Closed XieZongChen closed 2 years ago
后面会输出 TagInput,SelectInput,暂时先别做 输入框相关的组件:cascader, select, treeselect , datepicker, timepicker
button
@amadeus711 icon是在icon库中维护的 已经是用composition API的方式实现的了。
loading
领取 checkbox
现在项目内没有lock文件, 不需要统一开发环境依赖版本吗?
现在项目内没有lock文件, 不需要统一开发环境依赖版本吗?
开发者的源和npm版本,node版本都会存在不一致的情况。lock可能会导致一些差异,或者一些版本未被更新的情况。 我们在ci流程会用固定的环境跑test,lint,build。
cascader
compositionApi中 provide/inject 的 injectKey 是需要单列文件 还是统一有什么规则
compositionApi中 provide/inject 的 injectKey 是需要单列文件 还是统一有什么规则
目前没有统一规则,对这一块又什么想法嘛
compositionApi中 provide/inject 的 injectKey 是需要单列文件 还是统一有什么规则
目前没有统一规则,对这一块又什么想法嘛
是不是可以与props定义一样由脚本生成, 可以在一部分组件重构后进行尝试 同时希望 开放仓库的 discussions 进行社区讨论
compositionApi中 provide/inject 的 injectKey 是需要单列文件 还是统一有什么规则
目前没有统一规则,对这一块又什么想法嘛
是不是可以与props定义一样由脚本生成, 可以在一部分组件重构后进行尝试 同时希望 开放仓库的 discussions 进行社区讨
已放开讨论
领取 pagination
领取 divider
领取 tag
有些公共方法会出现一些不兼容的情况,
例如emitEvent
这个,老版本的写法是用vm: ComponentPublicInstance
的,
如果迁移到composition api
上的话,getCurrentInstance
获取到的是ComponentInternalInstance
类型,
原本的$props
和$emit
都要改成props
和emit
。
类似于这种情况是在emitEvent
后新起一个func
保证兼容性以及方便后期统一替换,还是有别的方案呢?
以及类似于这类问题是放issue还是到开发指南的discussions上去。。
有些公共方法会出现一些不兼容的情况, 例如
emitEvent
这个,老版本的写法是用vm: ComponentPublicInstance
的, 如果迁移到composition api
上的话,getCurrentInstance
获取到的是ComponentInternalInstance
类型, 原本的$props
和$emit
都要改成props
和emit
。 类似于这种情况是在emitEvent
后新起一个func
保证兼容性以及方便后期统一替换,还是有别的方案呢?以及类似于这类问题是放issue还是到开发指南的discussions上去。。
关于迁移compositionAPI的差异问题,新起一个 discussions 。 关于emitEvent 以及其他公共 func 可以起一个新的 func 先保证兼容性
如果大家有关于重构的想法和问题,可以到这里进行讨论 #84
领取input
领取 comment
Cascader / DatePicker / TimePicker / TreeSelect 等组件 Vue2 本身还需要继续建设,大家先不要重构
这些组件会单独抽出一个 SelectInput 统一控制输入框和下拉框逻辑
有些公共方法会出现一些不兼容的情况, 例如emitEvent这个,老版本的写法是用vm: ComponentPublicInstance的, 如果迁移到composition api上的话,getCurrentInstance获取到的是ComponentInternalInstance类型, 原本的$props和$emit都要改成props和emit。 类似于这种情况是在emitEvent后新起一个func保证兼容性以及方便后期统一替换,还是有别的方案呢?
emitEvent
是 Vue2 特有的写法,为了支持 <checkbox @change="xxx"/>
和 <checkbox :onChange="xxx"
两种写法。Vue3 不需要 emitEvent
。
⚠️ 看到 emitEvent 的地方,Vue3 组件内部直接执行 this.onChange(xxx)
即可。 ⚠️
@higuaifan @pengYYYYY
https://github.com/Tencent/tdesign-vue-next/pull/96
突然,在思考一个关于 composition api 问题:
从官网描述来看,CompisitionAPI 的出发点是为了在复杂的业务场景中可以更好的复用各类逻辑。setUp
函数也是因为逻辑复用而存在。
如果压根儿没有什么需要复用的逻辑,我们仅仅是把每个组件改成 setup
写法的目的是什么?
改成 setup
写法,代码真的更容易阅读了吗?(从 Comment 的实际代码来看,并没有深刻的感受。原先的拆分写法逻辑也是相对独立的,阅读上并没有障碍。)
看了下 Element Plus 某组件代码:https://github.com/element-plus/element-plus/blob/dev/packages/components/calendar/src/calendar.vue
这样的写法,把什么内容都放在 setup 里面的写法真的是更简洁了吗?代码真的有复用起来了吗
这样子把什么都写在 setup 里面,真的比以前的 options API 更合理吗 为什么我觉得 Element 这一波代码看起来还不如之前的 options API 变量、方法、计算属性 分开的写的方式呢
结尾,提一个问题:
为什么我们一定、必须、非得把每一个组件都改造成 Composition API ?(仅供讨论,欢迎大家发表意见)
仔细对比 Options API 和 Composition API 两种写法,真的是每一种情况下,每一个组件,每一个业务场景里面,Composition API 都更好吗?
https://github.com/element-plus/element-plus/blob/dev/packages/components/calendar/src/calendar.vue 大家在看这一波代码的时候,不觉得就是一个巨大的 setup
函数吗?有点强行 Composition API 的感觉
我们是否可以在必要的时候再使用 Composition API ?(通用逻辑再使用 useXXX 这种写法)
有些公共方法会出现一些不兼容的情况, 例如emitEvent这个,老版本的写法是用vm: ComponentPublicInstance的, 如果迁移到composition api上的话,getCurrentInstance获取到的是ComponentInternalInstance类型, 原本的$props和$emit都要改成props和emit。 类似于这种情况是在emitEvent后新起一个func保证兼容性以及方便后期统一替换,还是有别的方案呢?
emitEvent
是 Vue2 特有的写法,为了支持<checkbox @change="xxx"/>
和<checkbox :onChange="xxx"
两种写法。Vue3 不需要emitEvent
。⚠️ 看到 emitEvent 的地方,Vue3 组件内部直接执行
this.onChange(xxx)
即可。 ⚠️@higuaifan @pengYYYYY
👌疏忽了对函数本身作用的思考,感谢提醒
个人觉得像 Element Plus
中calendar.vue
这样全都丢在一个setup
的写法可读性和使用Options API
差不多差,要阅读一个组件的源码依旧需要上下翻阅。
不过Composition API
的出发点应该不仅仅是复用逻辑,
也许是水平不到位,但是目前在我看来代码逻辑收集的作用是极大的,
例如calendar
这个组件,将validatedRange
和date
操作分离开来,或许会一定程度上更易读一些。不过这个组件本身逻辑不算复杂,类似于input这样的组件我觉得将各个功能点抽离开来,可读性和可维护性都会提升。
不过我很疑惑为什么大家都没这么做,不知道是不是有些点我没考虑到,如果有的话希望大佬可以答疑解惑下。
例如calendar这个组件,将validatedRange和date操作分离开来,或许会一定程度上更易读一些。不过这个组件本身逻辑不算
看看 tdesign-vue(vue2) 的 Calendar,逻辑挺复杂的,交互也挺多
复杂,类似于input这样的组件我觉得将各个功能点抽离开来,可读性和可维护性都会提升。
逻辑复用,逻辑隔离,完全没有问题,支持。
https://github.com/vuejs/vue-next/issues/5191 大家也可以在这个 issue 里面一起探讨 Vue3 最佳实践
不是不搞重构,重构很重要,非常重要,特别需要有实力的小伙伴共同参与。 只是在做一件事情之前,我们需要先规划好,然后再行动。
如果 tdesign-vue-next 继续按照每个组件单独开发,单独重构的模式,组件复用率依旧会非常低。而 Composition API 提倡的正是如何更优雅地提高组件复用率。
稍后,我们会拉群沟通,感兴趣的小伙伴可以扫码加入
@gaopeak Message 组件建议,移步这里:https://github.com/Tencent/tdesign-vue-next/issues/107
当前 issue 讨论 Vue3 重构计划以及 Composition API 最佳实践
领取alert
目前,正在讨论对一些基础的Hook,大家也可以熟悉一下项目。认领组件后如果有重构完成的,可以提PR,可能CR的时间会稍长。官方这边也会加快基础Hook的建设。也欢迎加入群探讨。
认领avatar组件
有些公共方法会出现一些不兼容的情况, 例如emitEvent这个,老版本的写法是用vm: ComponentPublicInstance的, 如果迁移到composition api上的话,getCurrentInstance获取到的是ComponentInternalInstance类型, 原本的$props和$emit都要改成props和emit。 类似于这种情况是在emitEvent后新起一个func保证兼容性以及方便后期统一替换,还是有别的方案呢?
emitEvent
是 Vue2 特有的写法,为了支持<checkbox @change="xxx"/>
和<checkbox :onChange="xxx"
两种写法。Vue3 不需要emitEvent
。 ⚠️ 看到 emitEvent 的地方,Vue3 组件内部直接执行this.onChange(xxx)
即可。 ⚠️ @higuaifan @pengYYYYY👌疏忽了对函数本身作用的思考,感谢提醒
这里还不能直接用emit(event)
这样写,因为vue3的文档写着支持:onChange=xxx这种写法,还是要处理下兼容的
认领drawer组件
认领calendar组件
认领 progress
认领dropdown
认领List组件
认领 radio
& switch
认领badge组件
认领 notification
认领slider组件
认领 textarea
& transfer
认领 message
认领 popup
认领 anchor 和 breadcrumb
认领 message
认领
radio
&switch
因为最近工作安排较多,radio
暂时没空重构,sorry
认领 radio
认领 tooltip
认领 tree
说明
Composition Api
语法重构,文件类型依然使用tsx
issue
中评论领取的组件optionsAPI
照搬compositionAPI
review
开发规范
https://github.com/Tencent/tdesign-vue-next/wiki/TDesign--CompositionAPI-%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83
基础Hook:
hook
。 @pengYYYYYv-model
,内置受控和非受控处理。 @chaishiv-model:xxx
,内置受控和非受控处理。 @chaishisetup
组合TNode
,render
函数渲染TNode
请使用renderTNodeJSX
。 @pengYYYYYdefault slot
,获取子组件VNode
。处理多种子组件创建场景。组件
config-provider
- @pengYYYYYbutton
- @amadeus711 #106grid
- @pengYYYYY #233layout
- @pengYYYYY #233affix
- @btea #105anchor
- @Blackn-L #646breadcrumb
- @Blackn-L #567dropdown
- @qunbotop #749pagination
- @youuss #282steps
- @K1nZ #584tabs
- @LeeJim #490cascader
- @pengYYYYY - #585checkbox
- @whylost -#436date-picker
- @HQ-Lin #943form
- @k1nz - #782input
- @youuss #588input-number
- @youuss #588radio
- @k1nz #555select
- @pengYYYYY #965slider
- @ChrisLee0211 #552switch
-@zouhangwithsweet #434textarea
- @btea #432transfer
- @btea #496time-picker
- @uyarn #943tree-select
-@Godlike-meteor #508upload
- @pengYYYYY #427avatar
- @vnues #160badge
- @ChrisLee0211 #402calendar
- @PsTiu #472comment
- @simpleAndElegant #263list
- @ChrisLee0211 #321progress
- @Blackn-L #276table
- @chaishi #468tag
- @higuaifan #273tooltip
- @cca313 #566tree
- @pengYYYYY #857alert
- @vnues #159dialog
- @vnues #312drawer
- @vnues #210loading
- @uyarn #212message
- @qunbotop #539notification
- @qunbotop #429pop-confirm
- @pengYYYYY #410popup
@ikeq #635