【问题标题】:Unwrap a div in react, something similar to jQuery unwrap method在 react 中解包一个 div,类似于 jQuery 解包方法
【发布时间】:2017-08-25 02:39:45
【问题描述】:

我正在使用 React JSX。我有一个带有 className="shadow" 的 div,如下所示。

<div className="main">
  <div className="shadow" style={{backgroundColor: "#FFFFFF"}}>
    <div id="wrapper">
      Hello
    </div>
  </div>
</div>

基于某个条件是真还是假,我想删除 className="shadow" 的 div,但希望保持每个 div 包括 id="wrapper" 的 div 完整。类似于 jQuery 的 unwrap() 方法。 有点像下面写的东西,但没有那么多代码行。

  if ( currentPage==="login") {
   <div className="main">
     <div id="wrapper">
       Hello
     </div>
   </div>
}
else {
    <div className="main">
  <div className="shadow" style={{backgroundColor: "#FFFFFF"}}>
    <div id="wrapper">
      Hello
    </div>
  </div>
</div>
}

我检查了React.js: Wrapping one component into anotherHow to pass in a react component into another react component to transclude the first component's content?,但没有找到我想要的。

【问题讨论】:

    标签: reactjs conditional unwrap


    【解决方案1】:

    也许可以帮助您的是根据您所在的页面更改className,因为您尝试做的事情会更好地使用react-router根据您所在的路径显示不同的组件。

    使用类似于此代码的东西,希望对您有所帮助。

    const App = React.createClass({
      changePage(nextPage) {
        this.setState({ page: nextPage })
      },
      getInitialState() {
        return({
          page: 'Login'
        })
      },
      render() {
        return(
          <div className="main">
            <div className={ this.state.page === 'Login' ? 'shadow' : '' }>
              <div id="wrapper">
                Hello from { this.state.page } page.
              </div>
              <button onClick={ this.changePage.bind(null, 'Login') }>Go to Login page.</button>
              <button onClick={ this.changePage.bind(null, 'Home') }>Go to Home page.</button>
            </div>
          </div>
        )
      }
    })
    
    ReactDOM.render(<App />, document.getElementById('app'))
    div.shadow{ background-color: #000000; color: #ffffff}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id='app'></div>

    【讨论】:

    • 我猜这个方法不会让我在当前页面未登录时从 dom 中删除类为“shadow”的 div。它只会从该 div 中添加/删除类“shadow”。
    【解决方案2】:

    这是Higher Order Components 的一个很好的用例!

    const HOC = (currentPage, Shadow, Wrapper) => (
      () => <div className="main">
        {
          currentPage === 'login'
            ? <Shadow {...this.props} />
            : <Shadow {...this.props}><Wrapper {...this.props}>{this.props.children}</Wrapper></Shadow>
        }
      </div>
    )
    

    用法:

    render () {
      const Shadow = props => <div className="shadow" style={{backgroundColor: '#FFFFFF'}}>{props.children}</div>
      const Wrapper = props => <div id="wrapper">Hello</div>
    
      const Example = HOC(
        currentPage,
        Shadow,
        Wrapper
      )
    
      return (
        <Example />
      )
    }
    

    更新:

    要渲染&lt;Wrapper /&gt; 的子级,请使用{this.props.children} 并在HOC 中使用class 语法:

    const HOC = (currentPage, Shadow, Wrapper) => (
      class extends Component {
        render () {
          return (
            <div className="main">
              {
                currentPage === 'login'
                  ? <Shadow />
                  : <Shadow><Wrapper>{this.props.children}</Wrapper></Shadow>
              }
            </div>
          )
        }
      }
    )
    

    如果您需要在&lt;Shadow /&gt;&lt;Wrapper /&gt; 上捕获props,请执行以下操作。注意:我认为您不能将道具传递给普通的 DOM 元素,例如 &lt;div&gt; 标签。但是,如果它们是具有大写首字母的其他组件,那么我相信使用 {...this.props} 传递道具会很好。

    const HOC = (currentPage, Shadow, Wrapper) => (
      class extends Component {
        render () {
          return (
            <div className="main">
              {
                currentPage === 'login'
                  ? <Shadow {...this.props} />
                  : <Shadow {...this.props}><Wrapper {...this.props}>{this.props.children}</Wrapper></Shadow>
              }
            </div>
          )
        }
      }
    )
    

    【讨论】:

    • 这个解决方案似乎对我有用。但是,不幸的是,我有 ,而不是 id 为“wrapper”的 div 中的“Hello”。此 Content 组件根据“currentPage”返回不同的组件。因此,它在某个地方迷失在无限循环中,并且永远不会呈现所需的结果。只有 很好,但是以 currentPage 作为其道具的内容会导致问题,但即使我也不确定为什么会这样。
    • @abhi,已更新。您可以使用{this.props.children} 渲染&lt;Wrapper /&gt; 的孩子。如果您有任何问题,请告诉我。
    • 它的行为仍然相同,从不渲染页面上的内容。所以,我决定使用 if else 条件渲染的传统方式。
    • @abhi,我已经测试了答案中的代码并且知道它可以工作。请确认您是 1) 使用我之前更新中概述的类语法,并且 2) 在您的 render () 方法中使用 {this.props.children}
    • 是的,我在渲染方法中使用了类语法和 {this.props.children}。我不能在这里发布我的完整代码,但我猜在我冗长的复杂代码的某个地方,它会丢失并且无法呈现。
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 2011-08-26
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2021-12-27
    相关资源
    最近更新 更多