在ReactJS中将包装器组件作为道具传递

时间:2016-12-23 10:01:04

标签: javascript reactjs

我正在尝试将包装器组件作为props传递。在React中技术上是否可以这样?

import React, {Component, PropTypes} from 'react';
import ChildComp from './child-comp';

class Comp extends Component {
  render() {
    const { Wrapper } = this.props;
    return (
      <Wrapper>
        <ChildComp />
      </Wrapper>
    );
  }
}

Comp.propTypes = {};

export default Comp;

3 个答案:

答案 0 :(得分:34)

是的,这是完全可能的,也是常用的。唯一的事情是,作为惯例,在JSX中,大写单词意味着用户定义的组件,因此您需要将您的属性设置为小写,并且您必须将用于保存组件引用的变量大写。

import React from 'react';

function HelloWorld () {
  return (
    <span>
      <Foo wrapper={Bar}/>
      <Foo wrapper="h5"/>
    </span>
  );
}

class Bar extends  React.Component {
  render() {
    return <h1>{this.props.children}</h1>
  }
}

class Foo extends React.Component {
  render() {
    // the variable name must be capitalized
    const Wrapper = this.props.wrapper;
    return (
      <Wrapper><p>This works!</p></Wrapper>
    );
  }
}

对于本机组件,您可以传递一个String,如下所示:<Foo wrapper="h1"/>。这是有效的,因为JSX只是React.createElement('h1',props, children)

的语法糖

答案 1 :(得分:1)

您可以通过多种方式包装组件。但是,最常见的是:

  1. 渲染儿童
  2. 渲染子节点时,jsx显式使用包装组件:

    <Wrapper>
      <Child />
    </Wrapper>
    

    Wrapper组件如下所示:

    export default class Wrapper extends Component {
      render() {
        return (
          <div>
             { this.props.children }
          </div>
        );
      }
    }
    
    1. 高阶组件
    2. 高阶组件(HOC)是一种混合功能而无需更改jsx标记的方法。您可以更改jsx,但也可以在不更改jsx的情况下混合功能。

      使用HOC看起来像这样:

      const Wrapped = Wrapper(Child);
      
      ...
      
      <Wrapped />
      

      HOC本身看起来像:

      export default Child => class extends Component {
        render() {
          return (
            <div>
               <Child />
            </div>
          );
        }
      }
      

答案 2 :(得分:0)

https://codepen.io/keshav1706/pen/eWMZwL?editors=0010

这是一个简单解决方案的编解码器。 `

class ComponentOne extends React.Component {
  render() {
    return(
      <div>
        <h1>Component One</h1>
        <div>{this.props.children}</div>
      </div>
    ) 
  }
}

class ComponentTwo extends React.Component {
  render() {
    return(
      <h4>hello</h4>
    )
  }
}
class ComponentThree extends React.Component {
  render() {
    return(
      <h4>component three</h4>
    )
  }
}
ReactDOM.render(
    <div>
      <ComponentOne> <ComponentThree/></ComponentOne>
    </div>,
  document.getElementById('root')
);

`