【发布时间】:2020-12-09 07:46:30
【问题描述】:
我正在创建一个调色板,其中每个颜色旁边的工具提示组件中都有一个剪贴板图标。单击它会将颜色的名称复制到用户的剪贴板上。发生这种情况时,工具提示的消息应该从“复制”变为“复制成功”。我在尝试为每种颜色单独显示成功消息时遇到问题。
【问题讨论】:
标签: javascript reactjs material-ui frontend html5-clipboard-api
我正在创建一个调色板,其中每个颜色旁边的工具提示组件中都有一个剪贴板图标。单击它会将颜色的名称复制到用户的剪贴板上。发生这种情况时,工具提示的消息应该从“复制”变为“复制成功”。我在尝试为每种颜色单独显示成功消息时遇到问题。
【问题讨论】:
标签: javascript reactjs material-ui frontend html5-clipboard-api
你们所有Tooltip 组件都使用相同的父状态this.state.copyMessage。如果您单击一个复制,则将this.state.copyMessage 设置为"copy success",并且它会为所有其他工具提示重新呈现。您需要能够:
我个人会采用一种方法来确定谁被点击了。
全局声明
const PROMPT_MESSAGE = "Copy to clipboard"
const CLICKED_MESSAGE = "Copied!"
在点击时设置你的状态
setState({ clickedColor: color.name });
获取特定颜色的相应消息
const tooltipTitle = this.state.clickedColor === color.name
? CLICKED_MESSAGE
: PROMPT_MESSAGE
传入标题
<Tooltip title={tooltipTitle} placement="right">
</Tooltip>
有很多方法可以解决这个问题,这只是我觉得可读的一种!
【讨论】:
initialState = {clickedColor: ""}。我倾向于说这是 styleguidist 的怪癖。
key 属性。当使用.map 之类的函数构建组件列表时,您应该传入key={something unique}。在这种情况下,您可以(可能)使用color.name。
尝试将“事件”作为参数传递给您的 onClick 函数并使用 stopPropagation() 方法。像这样:
<Tooltip title={copyMessage} placement="right">
<span
onClick={(event) => {
event.stopPropagation()
copyNameToClipboard(color.name);
setState({
copyMessage: 'copy success',
});
}}
>
这应该会阻止您的事件“冒泡”到其他组件:
https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation
【讨论】: