【问题标题】:Use custom component in overlay attribute in AntD在 AntD 的覆盖属性中使用自定义组件
【发布时间】:2018-10-31 09:11:24
【问题描述】:

我正在尝试将自定义右键单击菜单组件添加到菜单项。我可以通过 const 来做到这一点,但是当我使用组件时,样式似乎工作错误。有什么想法吗?

工作示例:https://codesandbox.io/s/m5n31opx2j

我的自定义菜单:

import React from "react";
import ReactDOM from "react-dom";
import Dropdown from "antd/lib/dropdown";
import Menu from "antd/lib/menu";
import "antd/dist/antd.css";

export default class MyMenu extends React.Component {
  render() {
    return (
      <Menu>
        <Menu.Item
          onClick={e => {
            alert("clicked");
          }}
        >
          click
        </Menu.Item>
        <Menu.Item>Like it</Menu.Item>
        <Menu.Item>Bookmark</Menu.Item>
      </Menu>
    );
  }
}

我的主要组件:

import React from "react";
import ReactDOM from "react-dom";
import Dropdown from "antd/lib/dropdown";
import Menu from "antd/lib/menu";
import "antd/dist/antd.css";
import MyMenu from "./MyMenu";

const menu = (
  <Menu>
    <Menu.Item
      onClick={e => {
        alert("clicked");
      }}
    >
      click
    </Menu.Item>
    <Menu.Item>Like it</Menu.Item>
    <Menu.Item>Bookmark</Menu.Item>
  </Menu>
);

class App extends React.Component {
  render() {
    return (
      <div>
        <Menu mode="horizontal">
          <Menu.Item
            key="1"
            onClick={() => {
              alert("parent clicked");
            }}
          >
            <Dropdown overlay={menu} trigger={[`contextMenu`]}>
              <span style={{ userSelect: "none" }}> from const </span>
            </Dropdown>
          </Menu.Item>

          <Menu.Item
            key="2"
            onClick={() => {
              alert("parent clicked");
            }}
          >
            <Dropdown overlay={<MyMenu />} trigger={[`contextMenu`]}>
              <span style={{ userSelect: "none" }}> from component </span>
            </Dropdown>
          </Menu.Item>
        </Menu>
      </div>
    );
  }
}

const APP_NODE = document.getElementById(`container`);
ReactDOM.render(<App />, APP_NODE);

【问题讨论】:

    标签: javascript reactjs antd


    【解决方案1】:

    这是因为在组件中您将 Menu 与 react 类包装在一起。并且你失去了对 antd Dropdown 组件的继承。

    因此,您需要将Menu 直接传递给Dropdown 组件的overlay 属性,就像使用常量menu 一样:

    这就是组件的工作原理。

    要继续使用自定义组件方法,您需要在 MyMenu 组件中包含 Dropdown,以便将 Menu 直接传递给 overlay 属性:

    import React from "react";
    import ReactDOM from "react-dom";
    import Dropdown from "antd/lib/dropdown";
    import Menu from "antd/lib/menu";
    import "antd/dist/antd.css";
    
    const menu = (
      <Menu>
        <Menu.Item
          onClick={e => {
            alert("clicked");
          }}
        >
          click
      </Menu.Item>
        <Menu.Item>Like it</Menu.Item>
        <Menu.Item>Bookmark</Menu.Item>
      </Menu>
    );
    
    export default class MyMenu extends React.Component {
      render() {
        return (
          <Dropdown overlay={menu} trigger={[`contextMenu`]}>
            <span style={{ userSelect: "none" }}> from const </span>
          </Dropdown>
        );
      }
    }
    

    希望这会有所帮助。

    在这里您可以直接在源代码中看到它是如何完成的: https://github.com/ant-design/ant-design/blob/557683c7644d2aef1e2df0490815b294b063d457/components/dropdown/dropdown.tsx#L74

    【讨论】:

    • 直接是什么意思? overlay=&lt;MyMenu /&gt;overlay=MyMenu 都不起作用。
    • 我的意思是您在第一个使用常量的示例中所做的方式。所以直接作为dom元素。您可以为此制作一个单独的组件,但在其中包含 Dropdown 组件,而不是将该组件放入 Dropdown
    • 好的,有道理。
    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2018-05-08
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多