Replies: 3 comments 4 replies
-
|
另外,如果要做这个事情,这个最后的效果该怎么验证? 我的想法就是做一个 Shadcn 的主题包。实现整个主题包的过程中完全不用 className 的覆写,在这个情况下如果能达到 Shadcn 的 95% 像(极个别交互的确不一定需要一致),让别人一眼看去分辨不出来 是 antd 还是 Shadcn 。那么这个定制能力就成了 |
Beta Was this translation helpful? Give feedback.
1 reply
-
<Notification theme={
type: {
warning: {
color: "purple"
}
element: "icon"
}
}>现在的 classNames: <Notification classNames={{ icon: 'commonCls' }} /><Notification
classNames={{
icon: [
'commonCls',
{
className: 'xxxx',
variants/props/condition: { placement: 'left', type: 'warning', },
headless: true
},
],
}}
/><Notification
styles={{
icon:[
{ width:12 },
[{ width:16 }, { placement: 'left', type: 'warning' }]
]
}}
classNames={{
icon: [
'commonCls',
['xxxx', { placement: 'left', type: 'warning' }]
],
}}
/> |
Beta Was this translation helpful? Give feedback.
3 replies
-
|
这个建议很好地说出了喜欢定制开发的开发者的心声 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
背景
Antd V5 发布至今,已经带来了诸多灵活性上的优化,目前的定制能力已经远远超过 V4 的程度,但是在想用 antd 来实现一些自定义组件样式上仍然存在较大距离。例如下面这个样式就很难定制出来:
来源:https://twitter.com/Limichange2/status/1825108940528693558/photo/1
所以本 RFC 希望能够讨论一下如何基于现有的主题体系( antd token+ classNames/styles )轻松实现上述定制。
先抛砖引玉一下:https://stackblitz.com/edit/react-vnhfmn?file=demo.tsx
上述是基于现有的开放的 token 能力实现的自定义效果,可以说离原图差的非常远,但是这是目前 antd token 体系开放出来的定制极限,更进一步可能就是得进入到覆写样式环节才能达成,那这个就很难受了。
分析
首先介绍下我的自定义逻辑。在 antd v5 现有体系下,我认为最理想的定制方式是通过包裹一个
<ConfigProvider>实现组件的定制。例如:这是非常贴合 React Provider 的一种定制思想,且可以做到很好的样式隔离(不包裹 CP 样式就还是原样) 。
但是目前存在的问题有三块:
各个组件暴露出来的 token 不是面向定制做的设计,比如这里所有的间距类token,如果按个测试,根本不知道每个token到底影响的区域是什么。
例如为了完美还原设计稿,还需要调小不少 icon 的尺寸,但在这里并没有给出来 icon 的尺寸定义 token,导致如果要修改可能只能覆写。
虽然可以通过以下修改实现
某个特定状态自定义,但是这样一来就没法改 warning / error / success 的场景,定制度就又非常受限了。
解法思路
针对上述问题,逐一讨论下:
Token 定义模式问题: 这个问题可能是相对来说最好解决的,就是将每个组件可以定义的部分,给出明确的修改接口名。但这个是挺需要花时间梳理和敲定的,是个大工程。
开放 token 量问题: 这个问题我认为可能不能通过无限制开放 token 的方式来解决,应该通过 classNames / styles 来实现元素的定制。比如 Notification这个场景,如果能提供 icon 这个 style ,那么也能实现尺寸的快速定制:
但我非常不喜欢这种方案,因为和最早 antd v4 没啥差别,不是好的解决方案。
这部分我认为可能未来的一个方向是参考 tailwindcss 的发展。其实 tailwindcss 用来做组件的人也不少,他们非常容易遇到上述提到的不同变体之间样式踩踏的情况。而后面出现了一个叫
cva(https://cva.style/ ) 的解决方案,从接口来看非常优雅:cva 通过定义不同变体,每个变体中添加对应的 className 来实现样式的组合。这样一来大大减少了组合维护的重复性。
我觉得我们可以采用类似的思想允许外部传入对应变体的样式/token 来实现相应的自定义,例如:
这样一来就可以做到按照变体维度做样式隔离,我觉得这是后续应该发展的方向(其实这个就是当时搞 v5时候提的 stylish 的概念)
最后,虽然当前 ConfigProvider 具备了样式定制的功能,但是定制组件样式的接口分散在各个props中,我们是否应该给一个封装过的组件,将自定义口子收敛到几个更加高层次的口子上?例如:
以上,还是一些比较草稿的一些想法,欢迎一起讨论下
Beta Was this translation helpful? Give feedback.
All reactions