
useclipboard 是 chakra ui 提供的一个便捷 hook,用于处理文本内容的复制到剪贴板操作。它封装了浏览器原生的 navigator.clipboard.writetext api,并提供了简洁的接口供 react 组件使用。
该 Hook 返回一个包含以下属性的对象:
当应用中存在多个需要独立复制功能的输入框时,开发者常犯的一个错误是只调用一次 useClipboard Hook。如果这样做,所有输入框将共享同一个 value 和 hasCopied 状态,导致以下问题:
这在输入框的值来源于 Redux store 或其他外部状态管理时尤为突出,因为你需要确保每个输入框与其对应的复制逻辑独立关联。
解决多输入框复制问题的关键在于:为每一个需要独立复制功能的输入框,都单独调用一次 useClipboard Hook。
每次调用 useClipboard 都会创建一个独立的 Hook 实例。每个实例都拥有自己独立的 value、setValue、onCopy 和 hasCopied 状态。然后,将每个 Hook 实例返回的属性,分别绑定到对应的 Input 组件和 Button 组件上。
假设我们有两个输入框,分别显示 token 和 prodKey。这些值可能来自 Redux store 或其他状态管理。
import React from 'react';
import { Input, InputGroup, InputRightElement, Button, Box } from '@chakra-ui/react';
import { useClipboard } from '@chakra-ui/react';
import { useSelector } from 'react-redux'; // 假设您的应用使用Redux
function ApiKeyManagement() {
// 从Redux store获取数据,这里仅作示例
// 实际应用中,state.apikeys 可能包含 { token: '...', prodKey: { prodKey: '...' } }
const { token, prodKey } = useSelector((state) => ({
token: state.apikeys.token,
prodKey: state.apikeys.prodKey // 假设prodKey是一个对象,包含prodKey属性
}));
// 为token输入框创建独立的useClipboard实例
// 初始值设置为从Redux store获取的token
const tokenClipboard = useClipboard(token);
// 为prodKey输入框创建独立的useClipboard实例
// 初始值设置为从Redux store获取的prodKey.prodKey
const prodKeyClipboard = useClipboard(prodKey.prodKey);
return (
<Box p={4}>
{/* Token 输入框及复制功能 */}
<InputGroup mb={4}>
<Input
value={tokenClipboard.value} // 绑定到tokenClipboard实例的value
onChange={(e) => tokenClipboard.setValue(e.target.value)} // 绑定到tokenClipboard实例的setValue
placeholder="Your Token"
readOnly // 如果值是只读的,可以添加此属性
/>
<InputRightElement width="4.5rem">
<Button h="1.75rem" size="sm" onClick={tokenClipboard.onCopy}>
{tokenClipboard.hasCopied ? "已复制!" : "复制"}
</Button>
</InputRightElement>
</InputGroup>
{/* ProdKey 输入框及复制功能 */}
<InputGroup>
<Input
value={prodKeyClipboard.value} // 绑定到prodKeyClipboard实例的value
onChange={(e) => prodKeyClipboard.setValue(e.target.value)} // 绑定到prodKeyClipboard实例的setValue
placeholder="Your Production Key"
readOnly // 如果值是只读的,可以添加此属性
/>
<InputRightElement width="4.5rem">
<Button h="1.75rem" size="sm" onClick={prodKeyClipboard.onCopy}>
{prodKeyClipboard.hasCopied ? "已复制!" : "复制"}
</Button>
</InputRightElement>
</InputGroup>
</Box>
);
}
export default ApiKeyManagement;在上述代码中,我们为 token 和 prodKey 分别创建了 tokenClipboard 和 prodKeyClipboard 两个 useClipboard 实例。每个实例都独立管理其 value、setValue、onCopy 和 hasCopied 状态,确保了每个输入框的复制功能互不干扰。
在 Chakra UI 中处理多输入框的复制功能时,关键在于为每个独立的输入框创建其专属的 useClipboard Hook 实例。这确保了每个输入框的复制操作和状态管理都是独立的,从而避免了共享状态带来的逻辑混乱。遵循这一模式,可以轻松地在复杂的用户界面中实现健壮且用户友好的复制功能。
以上就是在Chakra UI中为多个输入框实现高效的复制到剪贴板功能的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号