[英]How to split react component into nested components
I would like to split up a react component, as I want to make an own component for the meta
-block. 我想拆分一个react组件,因为我想为
meta
-block制作一个自己的组件。 So this is my current component: 这是我当前的组件:
/imports/ui/components/example.jsx /imports/ui/components/example.jsx
import React, { Component } from 'react';
export default class Example extends Component {
constructor(props) {
super(props);
this.state = { activeMetaTab: 'First' };
this.setActiveClassOnMetaMenu = this.setActiveClassOnMetaMenu.bind(this);
this.handleChangeTabs = this.handleChangeTabs.bind(this);
}
setActiveClassOnMetaMenu(tab) {
return this.state.activeMetaTab === tab ? 'active' : '';
}
handleChangeTabs(event) {
this.setState({ activeMetaTab: event.target.textContent });
}
render() {
return (
<div className="ui raised padded text container segment">
<h1 className="ui right floated header">Otitis media</h1>
<div className="ui clearing divider"></div>
<div id="meta" className="ui segment">
<div className="ui compact mini menu secondary vertical pointing">
{ this.props.meta.map((item) => {
return (<a className={`item ${ this.setActiveClassOnMetaMenu(item.title) }`} onClick={ this.handleChangeTabs } key={ item.title}>{ item.title }</a>);
}) }
</div>
{ this.props.meta.map((item, index) => {
return (
<div className={`ui tab content ${ this.setActiveClassOnMetaMenu(item.title) }`} key={ index }>
<p>{ item.content }</p>
</div>
);
}) }
</div>
</div>
);
}
}
/client/main.js /client/main.js
import Example from '../imports/ui/components/example.jsx';
render(<Example
meta = {[
{ title: 'First', 'content': 'Lorem ipsum 1' },
{ title: 'Second', 'content': 'Lorem ipsum 2' },
{ title: 'Third', 'content': 'Lorem ipsum 3' },
]}
/>, document.getElementById('react-root'));
I would like to use a meta
component, but I don't know how to nest a component into another (main) component. 我想使用一个
meta
组件,但是我不知道如何将一个组件嵌套到另一个(主)组件中。 So this is what I come up with: 这就是我想出的:
/imports/ui/components/example.jsx /imports/ui/components/example.jsx
import React, { Component } from 'react';
import ExampleMeta from './example-meta.jsx';
export default class Example extends Component {
render() {
return (
<div className="ui raised padded text container segment">
<h1 className="ui right floated header">Otitis media</h1>
<div className="ui clearing divider"></div>
<ExampleMeta />
</div>
);
}
}
/imports/ui/components/example-meta.jsx /imports/ui/components/example-meta.jsx
import React, { Component } from 'react';
export default class ExampleMeta extends Component {
constructor(props) {
super(props);
this.state = { activeMetaTab: 'First' };
this.setActiveClassOnMetaMenu = this.setActiveClassOnMetaMenu.bind(this);
this.handleChangeTabs = this.handleChangeTabs.bind(this);
}
setActiveClassOnMetaMenu(tab) {
return this.state.activeMetaTab === tab ? 'active' : '';
}
setActiveClassOnContentMenu(item) {
return this.state.activeContentTab === item ? 'active' : '';
}
handleChangeTabs(event) {
this.setState({ activeMetaTab: event.target.textContent });
}
render() {
return (
<div id="meta" className="ui segment">
<div className="ui compact mini menu secondary vertical pointing">
{ this.props.meta.map((item) => {
return (<a className={`item ${ this.setActiveClassOnMetaMenu(item.title) }`} onClick={ this.handleChangeTabs } key={ item.title}>{ item.title }</a>);
}) }
</div>
{ this.props.meta.map((item, index) => {
return (
<div className={`ui tab content ${ this.setActiveClassOnMetaMenu(item.title) }`} key={ index }>
<p>{ item.content }</p>
</div>
);
}) }
</div>
);
}
}
What you did is almost right. 你所做的几乎是正确的。 However , you have to forward
meta
props to <ExampleMeta />
: 但是,您必须将
meta
<ExampleMeta />
转发到<ExampleMeta />
:
import React, { Component } from 'react';
import ExampleMeta from './example-meta.jsx';
export default class Example extends Component {
render() {
return (
<div className="ui raised padded text container segment">
<h1 className="ui right floated header">Otitis media</h1>
<div className="ui clearing divider"></div>
<ExampleMeta meta={this.props.meta} />
</div>
);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.