关于 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.
-
目前,我们的 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