2016-05-30 1 views
0

Я хочу добавить тег <p> в ExtendedComponent, позвонив по телефону super.render(). Проблема в том, что я не знаю, можно ли изменить уже определенный объект jsx. Идеально было бы просто написать parentTemplate + <p>Some paragraph</p>, но это не сработает.Как связать объекты React JSX

class BaseComponent extends React.Component { 
    get title() { 
    return 'I am base component'; 
    } 

    render() { 
    return <h1>Hello {this.title}</h1>; 
    } 
} 

class ExtendedComponent extends BaseComponent { 
    get title() { 
    return 'I am extended component'; 
    } 

    render() { 
    var parentTemplate = super.render(); 
    // append <p>Some paragraph</p> to parentTemplate 
    return parentTemplate; 
    } 
} 

ReactDOM.render(
    <ExtendedComponent />,  
    document.getElementById('test') 
); 
+5

Из любопытства, почему этот шаблон? Почему не только два компонента, где один обертывает другой внутри 'render'? – azium

+0

Это выглядит более естественным для меня, особенно когда я хотел бы настроить как рендер, так и другой метод в дочернем компоненте. В этом случае я чувствую, что мне нужно будет сначала расширить компонент, чтобы настроить какой-то метод, а затем обернуть его другим компонентом в методе визуализации, чтобы добавить больше html. Мой метод убил бы двух птиц одним камнем. – klis87

+1

Если вы можете заставить его работать на вас, я думаю, это прекрасно, однако вы не увидите это очень часто в коде React. Наследование - это боль для поддержания, и с такими вещами, как компоненты более высокого порядка, состав компонентов легко достичь. Если вы хотите отказаться от модели наследования, я с радостью дам вам ответ. – azium

ответ

1

Как упоминалось в комментариях азиум, это не является общим для реагирования. Тем не менее, если вам нужно сделать, это может быть достигнуто, как это:

render() { 
    var parentTemplate = super.render(); 
    // append <p>Some paragraph</p> to parentTemplate 
    return <div>{parentTemplate}<p>Some paragraph</p></div>; 
} 

Вы должны обернуть его внутри DIV так как среагировать элемент только может возвращать один элемент, а не список из них. parentTemplate точно так же, как и любой другой jsx, но он находится в переменной. Для добавления переменных в JSX используется синтаксис {variableName}.

Другим способ сделать это, более «реагирует» -подобный:

class BaseComponent extends React.Component { 
    render() { 
    return <h1>Hello {this.props.title}</h1>; 
    } 
} 
BaseComponent.propTypes = { 
    title: React.PropTypes.string 
}; 
BaseComponent.defaultProps = { 
    title: 'I am base component' 
}; 

class ExtendedComponent extends React.Component { 
    render() { 
    return (
     <div> 
     <BaseComponent title="I am extended component"/> 
     <p>Some paragraph</p> 
     </div> 
    ); 
    } 
} 

ReactDOM.render(
    <ExtendedComponent />,  
    document.getElementById('test') 
); 

JSFiddle

Здесь ExtendedComponent является компонентом высшего порядка, а не тот, который наследует от BaseComponent. В большинстве случаев это разделение проблем, о которых легче рассуждать, и большинство реагирующих приложений построены таким образом, а не наследования.

Надеюсь, это поможет!