如何将一个react组件传入另一个react组件以嵌入第一个组件的内容?

IT技术 javascript reactjs
2021-02-11 11:32:42

有没有办法将一个组件传递给另一个react组件?我想创建一个模型react组件并传入另一个react组件以嵌入该内容。

编辑:这是一个 reactJS 代码笔,说明了我正在尝试做的事情。http://codepen.io/aallbrig/pen/bEhjo

HTML

<div id="my-component">
    <p>Hi!</p>
</div>

ReactJS

/**@jsx React.DOM*/

var BasicTransclusion = React.createClass({
  render: function() {
    // Below 'Added title' should be the child content of <p>Hi!</p>
    return (
      <div>
        <p> Added title </p>
        {this.props.children}
      </div>
    )
  }
});

React.renderComponent(BasicTransclusion(), document.getElementById('my-component'));
6个回答

您可以使用this.props.children渲染组件包含的任何子项:

const Wrap = ({ children }) => <div>{children}</div>

export default () => <Wrap><h1>Hello word</h1></Wrap>
来自我下面的评论:通过将其作为道具传递,您甚至可以为其命名并使用 propTypes 进行类型检查。
2021-03-29 11:32:42
@AndrewAllbright:你的例子没有通过任何孩子。这有效:codepen.io/ssorallen/pen/Dyjmk
2021-04-03 11:32:42
我会使用这个答案。this.props.children是组件 API 的一部分,预计会以这种方式使用。React 团队的示例使用了这种技术,例如传输 props和谈论单个孩子时
2021-04-07 11:32:42
如果您想获得孩子的 DOM 节点:stackoverflow.com/questions/29568721/...
2021-04-11 11:32:42

注意我在这里提供了更深入的答案

运行时包装器:

这是最地道的方式。

const Wrapper = ({children}) => (
  <div>
    <div>header</div>
    <div>{children}</div>
    <div>footer</div>
  </div>
);

const App = () => <div>Hello</div>;

const WrappedApp = () => (
  <Wrapper>
    <App/>
  </Wrapper>
);

请注意,这children是 React 中的“特殊props”,上面的示例是语法糖并且(几乎)等效于<Wrapper children={<App/>}/>


初始化包装器/ HOC

您可以使用高阶组件(HOC)。它们最近已添加到官方文档中

// Signature may look fancy but it's just 
// a function that takes a component and returns a new component
const wrapHOC = (WrappedComponent) => (props) => (
  <div>
    <div>header</div>
    <div><WrappedComponent {...props}/></div>
    <div>footer</div>
  </div>
)

const App = () => <div>Hello</div>;

const WrappedApp = wrapHOC(App);

这可以带来(一点)更好的性能,因为包装器组件可以使用 shouldComponentUpdate 提前一步缩短渲染,而在运行时包装器的情况下,children prop 可能总是不同的 ReactElement 并导致重新渲染即使您的组件扩展了 PureComponent。

请注意,connectRedux 曾经是运行时包装器,但已更改为 HOC,因为如果您使用该pure选项,它可以避免无用的重新渲染(默认情况下为 true)

你永远不应该在渲染阶段调用 HOC,因为创建 React 组件可能很昂贵。您应该在初始化时调用这些包装器。


请注意,在使用上述功能组件时,HOC 版本没有提供任何有用的优化,因为无状态功能组件没有实现 shouldComponentUpdate

更多解释在这里:https : //stackoverflow.com/a/31564812/82609

const ParentComponent = (props) => {
  return(
    {props.childComponent}
    //...additional JSX...
  )
}

//import component
import MyComponent from //...where ever

//place in var
const myComponent = <MyComponent />

//pass as prop
<ParentComponent childComponent={myComponent} />
如果是这样的话,这将是正确的... React 15.x 不允许您返回多节点组件。React 16(又名 React Fiber)将允许多个节点。这是您的代码示例的修复程序: const ParentComponent = (props) => ({ props.childComponent }); import MyComponent from //...where ever const myComponent = <MyComponent /> //pass as prop <ParentComponent childComponent={myComponent} />
2021-03-31 11:32:42

您可以将其作为普通props传递: foo={<ComponentOne />}

例如:

const ComponentOne = () => <div>Hello world!</div>
const ComponentTwo = () => (
  <div>
    <div>Hola el mundo!</div>
    <ComponentThree foo={<ComponentOne />} />
  </div>
)
const ComponentThree = ({ foo }) => <div>{foo}</div>

Facebook 推荐使用无状态组件 来源:https : //facebook.github.io/react/docs/reusable-components.html

在理想的世界中,您的大多数组件都是无状态函数,因为将来我们还可以通过避免不必要的检查和内存分配来针对这些组件进行性能优化。如果可能,这是推荐的模式。

function Label(props){
    return <span>{props.label}</span>;
}

function Hello(props){
    return <div>{props.label}{props.name}</div>;
}

var hello = Hello({name:"Joe", label:Label({label:"I am "})});

ReactDOM.render(hello,mountNode);