将应用程序渲染到正文时,语义 UI 侧边栏会使用 ReactJS 引发控制台错误

IT技术 meteor reactjs semantic-ui
2021-04-26 19:21:40

有什么方法可以在不使用 HTML 正文中的 id 标签的情况下将 Semantic-UI 侧边栏渲染到 React App 中?我想避免在 HTML 正文中将 React 组件渲染为 tagis,例如 NOT using: <div id="some-name"></div>

我正在使用 Meteor 但不应该对这个问题产生影响,这似乎是 React & Semantic UI 特有的。

下面的代码在浏览器控制台中给出了以下错误:

Sidebar: Had to add pusher element. For optimal performance make sure body content is inside a pusherSidebar: 

Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag <div class=​"ui sidebar inverted vertical menu left uncover animating visible" data-reactid=​".0.0">​…​</div>​ 

Warning: ReactMount: Root element has been removed from its original container. New container:

index.html 语义边栏1

应用程序.js

// App component - represents the whole app
App = React.createClass({

  showSideMenu() {
    $('.ui.sidebar')
      .sidebar('toggle');
  },

  render() {
    return (
      <div>
         <div className="ui sidebar inverted vertical menu">
            <a className="item">
              1
            </a>
            <a className="item">
              2
            </a>
            <a className="item">
              3
            </a>
          </div>

        <div className="pusher">
          <button onClick={this.showSideMenu} className="ui button">Test MyModalDlgOne</button>

          <p />
          React App.
        </div>
      </div>
    );
  }
});

if (Meteor.isClient) {
  // This code is executed on the client only

  Meteor.startup(function () {
    // Use Meteor.startup to render the component after the page is ready
    // React.render(<App />, document.getElementById("render-target"));
    React.render(<App />, document.body);
  });
}
2个回答

我有一些实现 reactJS + Semantic-UI 侧边栏的经验,所以可能会有所帮助。

抛出错误的原因是 Sidebar 组件<body>默认粘附在标签上,并将向相邻元素添加一个pusher类,用作动画期间移动/覆盖的窗口内容。

我不完全确定你想要做什么,但看起来你想要初始化侧边栏,所以<body>标签是 React 渲染结果的父标签,但保留你提供的 DOM 结构。像这样的东西:

<!-- Your desired parent element -->
<body>
    <!-- Return result of the React render -->
    <div>
        <div class="ui sidebar"></div>

        <div class="pusher"></div>
    </div>
</body>

如果您计划将该<div class="pusher">元素用作语义 UI 的上下文,这将正常工作如果是这种情况,则需要在初始化侧边栏时定义上下文。您可以在中初始化它,showSideMenu()但在componentDidMount().

   componentDidMount: function() {
       // Localize the selector instead of having jQuery search globally
       var rootNode = React.findDOMNode(this);

       // Initialize the sidebar
       $(rootNode).find('.ui.sidebar').sidebar({
           context: $(rootNode)
       });
   },
   showSideMenu: function() {
       // Same thing as before, might want to store this as a variable
       var rootNode = React.findDOMNode(this);
       $(rootNode).find('.ui.sidebar').sidebar('toggle');
   }

这在使用自定义上下文中进行了记录

您需要更改侧边栏的上下文设置。让我们试试下面的代码,让我知道它是否有效!

<div id="application">
    <div class="ui sidebar"></div>
    <div class="pusher"></div>
</div>

jQuery('.ui.sidebar').sidebar({
    context: '#application'
});