
useclipboard 是 chakra ui 提供的一个便捷钩子,用于简化复制文本到剪贴板的功能。它返回一个包含以下属性的对象:
在使用时,你可以通过 useClipboard(initialValue) 传入一个初始值,或者在后续通过 setValue 更新它。
当应用中存在多个需要独立复制功能的输入框时,一个常见的错误是尝试使用一个 useClipboard 钩子实例来管理所有输入框的复制操作。例如:
import { useClipboard } from "@chakra-ui/react";
import { useSelector } from 'react-redux'; // 假设使用Redux获取数据
function MyComponent() {
const { sandboxKey, token, prodkey } = useSelector((state) => state.apikeys);
// 错误示范:尝试用一个 useClipboard 实例处理多个值
const { onCopy, value, setValue, hasCopied } = useClipboard("");
return (
<>
<InputGroup>
<Input
value={token} // 这里直接绑定了Redux的token
onChange={(e) => {
setValue(e.target.value); // 尝试更新钩子的值
}}
/>
<InputRightElement>
<Button onClick={onCopy}>
{hasCopied ? "Copied!" : "Copy"}
</Button>
</InputRightElement>
</InputGroup>
<InputGroup>
<Input
value={prodkey.prodKey} // 这里直接绑定了Redux的prodKey
onChange={(e) => {
setValue(e.target.value); // 尝试更新钩子的值
}}
/>
<InputRightElement>
<Button onClick={onCopy}>
{hasCopied ? "Copied!" : "Copy"}
</Button>
</InputRightElement>
</InputGroup>
</>
);
}上述代码存在两个主要问题:
解决上述问题的关键在于,为每一个需要独立复制功能的输入框(或需要复制的独立值)创建其专属的 useClipboard 钩子实例。每个实例将拥有自己独立的 value、setValue、onCopy 和 hasCopied。
import { Input, InputGroup, InputRightElement, Button } from "@chakra-ui/react";
import { useClipboard } from "@chakra-ui/react";
import { useSelector } from 'react-redux';
function MyComponent() {
const { token, prodkey } = useSelector((state) => state.apikeys);
// 为每个需要复制的值独立调用 useClipboard 钩子
const tokenCopy = useClipboard(token); // 初始化时传入token的值
const prodKeyCopy = useClipboard(prodkey.prodKey); // 初始化时传入prodKey的值
return (
<>
<InputGroup mb={4}> {/* 增加一些间距 */}
<Input
// Input的value绑定到钩子实例的value
value={tokenCopy.value}
// Input的onChange更新钩子实例的value
onChange={e => tokenCopy.setValue(e.target.value)}
/>
<InputRightElement width="4.5rem">
<Button h="1.75rem" size="sm" onClick={tokenCopy.onCopy}>
{tokenCopy.hasCopied ? "已复制!" : "复制"}
</Button>
</InputRightElement>
</InputGroup>
<InputGroup>
<Input
// Input的value绑定到另一个钩子实例的value
value={prodKeyCopy.value}
// Input的onChange更新另一个钩子实例的value
onChange={e => prodKeyCopy.setValue(e.target.value)}
/>
<InputRightElement width="4.5rem">
<Button h="1.75rem" size="sm" onClick={prodKeyCopy.onCopy}>
{prodKeyCopy.hasCopied ? "已复制!" : "复制"}
</Button>
</InputRightElement>
</InputGroup>
</>
);
}
export default MyComponent;代码解析:
通过以上方法,你可以轻松且正确地在 Chakra UI 应用中为多个输入框实现独立的复制到剪贴板功能,从而提供更流畅、更直观的用户体验。
以上就是Chakra UI useClipboard 钩子在多输入框场景下的应用实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号