从两个 link 打开 ant design 弹出窗口

open ant design popover from two link

我有两个组件:1:StudentList 2:主修react和antd。

StudentList Component 呈现了学生列表。 Major Component 列出了您可以选择的专业。 select修读专业后,select修读的专业名称显示在学生列表的顶部。并且列表将根据 selected 专业过滤。

这是 StudentList 组件,包含主要组件:

class StudentList extends Component {

  render(){
    return(
      <>
      <Major/>
      <h5>20 student found in <a>selected major</a></h5>
     
      <List>
      //this is the list of students and is not related to this question
      </List>
      </>);
  }
 }

这是主要组件,带有用于打开弹出窗口的过滤器按钮:

class Major extends Component {
  render() {
    return (
      <Popover
        trigger="click"
        content={content} //list of majors
      >
        <Button>
            <FilterOutlined /> Select major to filter
        </Button>
      </Popover>
    );
  }
}

当我单击 Select major to filter 按钮时,弹出窗口会打开 select 个专业。我想更改代码以便从两个位置打开此弹出窗口:

1- 单击主要组件中的 Select major to filter 按钮

2- 单击 StudentList 组件中标题中的 selected major

注意:我想在同一个地方打开同一个弹出窗口(类似于我点击 Select major to filter 按钮)

也许它可以处理 statehandleVisibleChange 函数。但我不知道如何从 2 个组件处理它。很高兴听到您的解决方案。

您可以在文档中使用 Antd's tooltip because they are used by the PopOver as well. You can find an easy example from Andt how to control a PopOver by visible 中的 visibleonVisibleChange 属性。

要点击按钮,您可以使用 antd's Button Api 中的 onClick

使用 React 组件的所需示例:

class Major extends Component {
  componentDidUpdate(prevProps) {
    // Typical usage (don't forget to compare props):
    if (this.props.value !== prevProps.value) {
      this.setState({ visible: this.props.value });
    }
  }

  state = {
    visible: false
  };

  hide = () => {
    this.setState({
      visible: false
    });
  };

  handleVisibleChange = visible => {
    this.setState({ visible });
    // this.props.onChange(visible); // add me to open popover on every click on studenlist
  };

  render() {
    return (
      <Popover
        trigger="click"
        content={<a onClick={this.hide}>Close</a>}
        visible={this.state.visible}
        onVisibleChange={this.handleVisibleChange}
      >
        <Button>Select major to filter</Button>
      </Popover>
    );
  }
}

class StudentList extends Component {
  state = {
    visible: false
  };

  onClick = () => {
    this.setState({ visible: !this.state.visible });
  };

  render() {
    return (
      <>
        {/* <Major value={this.state.visible} onChange={setVisible} /> */}
        <Major value={this.state.visible} />
        <h5>
          20 student found in <a>selected major</a>
        </h5>

        <Button onClick={this.onClick}>Select major from Studenlist</Button>
      </>
    );
  }
}

组件示例 CodeSandBox.


这是一个简单的示例,您的请求使用 react hooks 和简单的按钮打开 PopOver:

function Major({ value, onChange }) {
  const [visible, setVisible] = useState(value);
  useEffect(() => {
    value && setVisible(value);
  }, [value]);

  const hide = () => setVisible(false);

  const handleVisibleChange = visible => {
    setVisible(visible);
    onChange(visible);
  };

  return (
    <Popover
      trigger="click"
      content={<a onClick={hide}>Close</a>}
      visible={visible}
      onVisibleChange={handleVisibleChange}
    >
      <Button>Select major to filter</Button>
    </Popover>
  );
}

function StudentList() {
  const [visible, setVisible] = useState(false);
  const onClick = () => {
    setVisible(true);
  };

  return (
    <>
      <Major value={visible} onChange={setVisible} />
      <h5>
        20 student found in <a>selected major</a>
      </h5>

      <Button onClick={onClick}>Select major from Studenlist</Button>
    </>
  );
}

依赖工作CodeSandBox.


Edit1:添加了 React 组件示例。