2016-12-23 6 views
11

Я пытаюсь передать компонент обертки в качестве реквизита. Что-то вроде этого технически возможно в реактиве?Передайте компонент обертки как реквизит в ReactJS

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; 
+1

Подпорки Прокси может [компоненты высшего порядка] (https://medium.com/@franleplant/react-higher-order-components-in-depth-cf9032ee6c3e#.aosc7lsuy) быть тем, что вы ищете. В основном это функция обертывания, которая передает компонент вокруг. –

+0

HOC Документация: http://stackoverflow.com/documentation/reactjs/1185/components/4649/creating-components#t=20161223100405611594 –

ответ

23

Да, это вполне возможно, и широко используется. Единственное, что, как соглашение, в заглавных словах 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> 
    ); 
    } 
} 

Для родных компонентов, которые можно передать строку, например, так: <Foo wrapper="h1"/>. Это работает, потому что JSX просто синтаксис для React.createElement('h1',props, children)

+0

Отличный ответ! он будет работать, если Wrapper не является компонентом реакции, а просто родным HTML-div? – Shota

+1

Я не уверен, как вы передадите собственный компонент, одно решение, которое работает, является функциональным компонентом ' (

{children}

)} />' –

+0

Найдено лучший способ, добавил я к своему ответу. –

1

Вы можете обернуть компоненты несколькими способами. Тем не менее, наиболее распространенными являются:

  1. Рендер детей

При рендеринге детей, то JSX явно использует компонент оберточной:

<Wrapper> 
    <Child /> 
</Wrapper> 

и тому Wrapper компонент выглядит следующим образом:

export default class Wrapper extends Component { 
    render() { 
    return (
     <div> 
     { this.props.children } 
     </div> 
    ); 
    } 
} 
  1. Компонент более высокого порядка

Компонент более высокого порядка (HOC) - это способ смешивания функций без необходимости изменения разметки jsx. Вы можете изменить jsx, но вы также можете использовать функции mixin без изменения jsx.

Использование HOC выглядит следующим образом:

const Wrapped = Wrapper(Child); 

... 

<Wrapped /> 

И сам HOC будет выглядеть так:

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

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

вот codepen для простого решения. `

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') 
); 

`

Смежные вопросы