关于 ConnectButton 的 buttonProps 属性 #60
Replies: 8 comments 28 replies
-
赞成第二种,相对解耦,因为我们不是基础组件,一些原生属性理论上应该只提供接口暴露。 |
Beta Was this translation helpful? Give feedback.
-
我觉得不需要, 这个组件本来就叫 ConnectButton,上面再有一个 buttonProps 太奇怪了。倒是可以有一个 冲突的问题感觉概率很小,即便是出现也可以换一个别名。 就好像 ProCard 继承了 Card 的属性一样,如果参考 antd pro 的话就更不应该修改了。 |
Beta Was this translation helpful? Give feedback.
-
这个组件很重要,得 work 起来了,可以按照 https://web3.ant.design/zh-CN/guide/contributing 拆分下任务,这样可以更多人一起进来协作。 @kiner-tang @jeasonstudio 看看你们谁先做下一个模块拆分的设计,先按照新的设计思路把架子搭起来,尽快可以推动可以开发的任务拆分出来。这样我这边也可以一起来看看。 |
Beta Was this translation helpful? Give feedback.
-
export interface Chain {} // MOCK
export interface Account {} // MOCK
// Universal Props
// danger 看起来不需要
// href/htmlType/target
export interface UniversalConnectorProps
extends Exclude<ButtonProps, 'danger' | 'href' | 'htmlType' | 'target'> {
// 这里应该继承 Web3ConfigProvider 上定义的部分通用 props
// 比如 onRequestAccounts/onRequestTokenMetadata 等
// 这些与 UI 无关,暂时省略
}
// 链切换的 button/dropdown props, 无论展示形式如何都应该用 button 做 trigger
export interface ChainSwitcherProps extends UniversalConnectorProps {
// 允许的链列表(这个只能受控)
// 但如果不传我们应该要默认只有一个 eth mainnet
chains?: Chain[];
onChainChange?: (chain: Chain) => void;
// 由于要兼容不同的弹出形式(dropdown 和 modal),这里不继承某一个组件的 props
open?: boolean;
onOpenChange?: (open: boolean) => void;
destroyOnHide?: boolean;
}
// 未连接状态下的按钮
export interface UnconnectedConnectorProps extends UniversalConnectorProps {
// 未连接状态按钮应该包含 `ConnectModal` 组件的 props
// 这里预留出来
}
// 已连接状态下的按钮
export interface ConnectedConnectorProps extends UniversalConnectorProps {
// 当前账户,如果不传则为非受控,传了按受控处理
account?: Account;
onAccountChange?: (account: Account) => void;
// 是否展示余额
showBalance?: boolean;
// 是否展示地址信息(包括地址和 ens)
showAddress?: 'full' | 'ellipsis' | 'ens' | false;
// 是否展示头像
showAvatar?: boolean;
// 同样要兼容不同的弹出形式(dropdown 和 modal)
// 本期暂时不支持扩展 dropdown 的 menus
open?: boolean;
onOpenChange?: (open: boolean) => void;
destroyOnHide?: boolean;
}
// 对多种状态的组合组件,需要包含上述用到的几个组件的 props
export interface ConnectorProps
extends UniversalConnectorProps,
Pick<ChainSwitcherProps, 'chains' | 'onChainChange'>,
Pick<
ConnectedConnectorProps,
'account' | 'onAccountChange' | 'showBalance' | 'showAddress' | 'showAvatar'
> {
// 参考 antd 命名规范选择了 showChainSwitcher
showChainSwitcher?: boolean;
// ChainSwitcherProps rename
chainSwitcherOpen?: boolean;
onchainSwitcherOpenChange?: (open: boolean) => void;
destroyOnchainSwitcherHide?: boolean;
// ConnectedConnectorProps rename
connectorOpen?: boolean;
onConnectorOpenChange?: (open: boolean) => void;
destroyOnConnectorHide?: boolean;
} |
Beta Was this translation helpful? Give feedback.
-
我有一个想法大概是: import { Connector } from '@ant-design/web3';
export default () => {
return (
<Connector
/* 链相关的一些 props */
accounts={[]}
showBalance
onRequestAccount={() => {}}
chains={[]}
onChainChanged={}
/* 里面用到的各种组件暴露出来用户自定义 UI 的 props */
connectButtonProps={/* ... */}
connectModalProps={/* ... */}
switchChainDropdownProps={/* ... */}
/>
);
} |
Beta Was this translation helpful? Give feedback.
-
其实 UI 上感觉有点像 ![]() |
Beta Was this translation helpful? Give feedback.
-
除了组件,还要支持 hooks 的方式: import { useConnector } from '@ant-design/web3';
export default () => {
const { connect } = useConnector({
chains: [],
});
return (
<Button onClick={() => { connect() }}>Connect</Button>
);
}; |
Beta Was this translation helpful? Give feedback.
-
梳理了一下现在的想法,感觉可以分为三个组件 其中 首先 export default () => {
return (
<ConnectButton
address={'0x1111....111'}
domain={'xxx.eth'}
connected={false}
chains={[]}
onClick={() => {}}
banlance={[{
amount: 21,
type: 'ETH',
}]}
avatar={}
menuItems={}
walletIcon={}
tooltip
/>
);
};
import { useConnector, ConnectModal, ConnectButton } from '@ant-design/web3';
export default () => {
const [wallet, setWallet] = React.useState();
const { connect } = useConnector({
chains: [],
});
return (
<ConnectModal wallet={wallet} onWalletSelect={setWallet}>
<ConnectButton onClick={() => { connect(wallet) }}>Connect</ConnectButton>
</ConnectModal>
);
}; 但是我们再提供一个 export default () => {
return (
<Connector showBalance={['ETH', 'USDT']} showDomain modalProps={}>
<ConnectButton avatar={}>
</Connector>
);
} 关键点是:
@kiner-tang @jeasonstudio 看看这个设计怎么样,感觉这样搞就比较清晰了。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
目前,我们的 ConnectButton 是基于 antd 的 Button 进行的上层封装,在使用过程中,可能需要使用到 antd 的 Button 的各种原生属性,当前我们的设计是这样的:



这样设计有个好处是可以直接像使用 antd 的 Button 一样使用 ConnectButton,但也可能带来一些副作用,例如 antd 中 Button 属性增加了一个新的属性,刚好跟我们 ConnectButton 自定义的属性命名重名的话就会出现了冲突。以及如果使用这个设计的话,我们在文档中不方便描述那些原始属性。
因此,这边想参考 pro-components 中的设计,如:modalProps 属性,这样,我们在文档中只需要简单的导引过去即可:
并且可以避免上述的命名冲突的问题。
相关改动已经有 PR,可以到:#59 看看
Beta Was this translation helpful? Give feedback.
All reactions