显示隐藏多个工具提示反应材料

Posted

技术标签:

【中文标题】显示隐藏多个工具提示反应材料【英文标题】:Show hide multiple tooltips React material 【发布时间】:2019-05-03 14:52:13 【问题描述】:

我在我的一个项目中使用React material 框架。我正在尝试添加多个controlled tooltips,它们只有在它们各自的statevisible 时才可见。

不幸的是,现在我被卡住了,因为我与多个组件共享相同的状态,因此一旦您将鼠标悬停在其中任何一个上,所有工具提示都是可见的。有什么办法吗?我认为这可以通过数组来完成。

P.S 在一个页面内会有multiple parent components,每个页面都有三组工具提示,即Edit, Delete, View

class ControlledTooltips extends React.Component 
  state = 
    open: false,
  ;

  handleTooltipClose = () => 
    this.setState( open: false );
  ;

  handleTooltipOpen = () => 
    this.setState( open: true );
  ;

  render() 
    return (
      <div>
        <Tooltip
          enterDelay=300
          id="tooltip-controlled"
          leaveDelay=300
          onClose=this.handleTooltipClose
          onOpen=this.handleTooltipOpen
          open=this.state.open
          placement="bottom"
          title="Edit"
        >
          <IconButton aria-label="Delete">
            <Edit />
          </IconButton>
        </Tooltip>
        <Tooltip
          enterDelay=300
          id="tooltip-controlled"
          leaveDelay=300
          onClose=this.handleTooltipClose
          onOpen=this.handleTooltipOpen
          open=this.state.open
          placement="bottom"
          title="view"
        >
          <IconButton aria-label="view">
            <Visibility />
          </IconButton>
        </Tooltip>
        <Tooltip
          enterDelay=300
          id="tooltip-controlleded"
          leaveDelay=300
          onClose=this.handleTooltipClose
          onOpen=this.handleTooltipOpen
          open=this.state.open
          placement="bottom"
          title="Delete"
        >
          <IconButton aria-label="Delete">
            <DeleteOutlined />
          </IconButton>
        </Tooltip>
      </div>
    );
  

codesandbox link

任何帮助将不胜感激:)

【问题讨论】:

您能在您的沙盒演示中演示实际问题吗? @EinarÓlafsson 我已经更新了链接。 我给你写了一个建议@vijayscode,希望对你有帮助。 【参考方案1】:

我建议不要将您的组件状态过于复杂化。在我看来,每个组件都应该控制其状态的一个非常精确的部分。

我建议创建一个自定义工具提示来处理每个元素的状态。您可以构建您的 3 Edit, Delete, View 宽度。

class TooltipCustom extends React.Component 
  state = 
    open: false
  ;

  toggleState = () => 
    this.setState( open: !this.state.open );
  ;

  render() 
    return (
      <IconButton aria-label=this.props.title>
        <Tooltip
          enterDelay=300
          leaveDelay=300
          onClose=this.toggleState
          onOpen=this.toggleState
          open=this.state.open
          placement="bottom"
          title=this.props.title
        >
          this.props.children
        </Tooltip>
      </IconButton>
    );
  


const Delete = () => (
  <TooltipCustom title="delete">
    <DeleteIcon />
  </TooltipCustom>
);

const Edit = () => (
  <TooltipCustom title="Edit">
    <EditIcon />
  </TooltipCustom>
);

const View = () => (
  <TooltipCustom title="View">
    <VisibilityIcon />
  </TooltipCustom>
);

const ControlledTooltips = () => (
  <div>
    <Delete />
    <Edit />
    <View />
  </div>
);

【讨论】:

【参考方案2】:

如果有人正在寻找答案。正如@Einar Ólafsson 所建议的那样,我制作了一个自定义工具提示包装器,其中包含所有三个工具提示。

需要显示的Tooltip name 已传递给handleTooltipOpen() and handleTooltipClose() 函数。在此函数中,我更改了单个工具提示的状态。

class ControlledTooltips extends React.Component 
  state = 
    edit: false,
    delete: false,
    view: false
  ;
  handleTooltipClose = (name) => 
    this.setState( [name]: false );
  ;

  handleTooltipOpen = (name) => 
    this.setState( [name]: true );
  ;

  render() 
    return (
      <div>
        <Tooltip
          id="tooltip-controlled-delete"
          onClose=() => this.handleTooltipClose("delete")
          onOpen=() => this.handleTooltipOpen("delete")
          open=this.state.delete
          placement="bottom"
          title="Delete"
        >
          <IconButton name="delete" aria-label="Delete">
            <DeleteOutlined name="delete" />
          </IconButton>
        </Tooltip>
        <Tooltip
          id="tooltip-controlled-edit"
          onClose=() => this.handleTooltipClose("edit")
          onOpen=() => this.handleTooltipOpen("edit")
          open=this.state.edit
          placement="bottom"
          title="edit"
        >
          <IconButton name="edit" aria-label="edit">
            <Edit />
          </IconButton>
        </Tooltip>
        <Tooltip
          id="tooltip-controlled-view"
          onClose=() => this.handleTooltipClose("view")
          onOpen=() => this.handleTooltipOpen("view")
          open=this.state.view
          placement="bottom"
          title="view"
        >
          <IconButton name="view" aria-label="view">
            <Visibility />
          </IconButton>
        </Tooltip>
      </div>
    );
  

【讨论】:

以上是关于显示隐藏多个工具提示反应材料的主要内容,如果未能解决你的问题,请参考以下文章

如何延迟显示/隐藏引导工具提示?

如何在不让 Flash 8 隐藏工具提示的情况下在 ScrollPane 中显示工具提示?

工具提示隐藏在表格标题后面

如何实现js控制div的隐藏及显现

Visual Studio 调试工具提示 - 隐藏变量

怎么设置电脑上所有文件的扩展名隐藏,或显示