英文:
How to swap MUI icon on IconButton when hovering
问题
我有这些标签,它们上面有一个关闭按钮,如果其中的内容已经被编辑过,那么关闭图标会变成一个圆圈,类似于Visual Studio Code。
我遇到的问题是如何在鼠标悬停在按钮上时将图标从圆圈更改为关闭图标。请问有人能帮我找到一个实现这个的好方法吗?
英文:
I have these tabs that have a close button on them, if the content in them has edits then the close icon turns to a circle, similar to visual code.
  {tabs.map((tab, index) => {
    const child = (
      <StyledTab
        label={
          <span>
            {tab.label + ':' + tab.hasEdit}
            <IconButton size="small" component="span" onClick={() => closeClickHandler(tab.value)}>
              {tab.hasEdit ? (
                <CircleIcon style={{ fontSize: "12px" }} />
              ) : (
                <CloseIcon style={{ fontSize: "18px" }} />
              )}
            </IconButton>
          </span>
        }
        value={tab.value}
        key={index}
      />
    );
    return (
      <DraggableTab
        label={
          <span>
            {tab.label}
            <IconButton size="small" component="span" onClick={() => {
              closeClickHandler(tab.value);
            }}>
              {tab.hasEdit ? (
                <CircleIcon style={{ fontSize: "12px" }} />
              ) : (
                <CloseIcon style={{ fontSize: "18px" }} />
              )}
            </IconButton>
          </span>
        }
        value={tab.value}
        index={index}
        key={index}
        child={child}
      />
    );
  })}
What I'm having trouble with is getting the icon to change from a circle to a close icon while hovering over the button.
Could someone give me a hand on a good way to implement this please?!
答案1
得分: 1
你可以通过为这些项目添加一个状态来实现这一点。然后在 IconButton 上添加 onMouseEnter 和 onMouseLeave 事件。当鼠标悬停时,我们可以将索引添加到数组中,最后在离开时移除。要确定是否需要更改图标,我们可以检查索引是否在 hoveringItems 中。
const [hoveringItems, setHoveringItems] = useState([]);
function handleHover(index, isLeaving) {
  setHoveringItems((prevItems) => {
    if (isLeaving) return prevItems.filter((item) => item !== index);
    return [...prevItems, index];
  });
}
return (
  <IconButton
    size="small"
    component="span"
    onClick={() => {
      closeClickHandler(tab.value);
    }}
    onMouseEnter={() => handleHover(index, false)}
    onMouseLeave={() => handleHover(index, true)}
  >
    {tab.hasEdit || hoveringItems.includes(index) ? (
      <CircleIcon style={{ fontSize: "12px" }} />
    ) : (
      <CloseIcon style={{ fontSize: "18px" }} />
    )}
  </IconButton>
);
英文:
You could do this by adding a state for the items. Then add a onMouseEnter and onMouseLeave events on the IconButton. When hovering we can add the index to the array and finally remove when we're leaving. To determine if a icon needs to change we can check if the index in in the hoveringItems.
const [hoveringItems, setHoveringItems] = useState([]);
function handleHover(index, isLeaving) {
  setHoveringItems((prevItems) => {
    if (isLeaving) return prevItems.filter((item) => item !== index);
    return [...prevItems, index];
  });
}
return (
  <IconButton
    size="small"
    component="span"
    onClick={() => {
      closeClickHandler(tab.value);
    }}
    onMouseEnter={() => handleHover(index, false)}
    onMouseLeave={() => handleHover(index, true)}
  >
    {tab.hasEdit || hoveringItems.includes(index) ? (
      <CircleIcon style={{ fontSize: "12px" }} />
    ) : (
      <CloseIcon style={{ fontSize: "18px" }} />
    )}
  </IconButton>
);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论