react HOC 高阶组件
高阶组件(HOC)
高阶组件接受组件作为参数,返回新的组件
import React, { PureComponent } from "react";
import PropTypes from "prop-types";
export default class AdvancedTabSelector extends PureComponent {
static propTypes = {
value: PropTypes.object,
options: PropTypes.array,
onChange: PropTypes.func,
children: PropTypes.func
};
static defaultProps = {
value: null,
options: [],
onChange: () => {},
children: () => {}
};
render() {
const { options, value, onChange } = this.props;
return (
<div className="tab-selector">
<ul>
{options.map(opt => (
<li
key={opt.value}
className={`tab-item ${
opt.value === this.props.value ? "selected" : ""
}`}
onClick={() => this.props.onChange(opt.value)}
>
{opt.name}
</li>
))}
</ul>
<br />
<br />
// this.props.children 传入一个func 满足条件执行
{this.props.value && this.props.children(this.props.value)}
</div>
);
}
}
const colors = [
{ name: "Red", value: "red" },
{ name: "Blue", value: "blue" },
{ name: "Orange", value: "orange" }
];
const animals = [
{ name: "Tiger", value: "tiger" },
{ name: "Elephant", value: "elephant" },
{ name: "Cow", value: "cow" }
];
export class AdvancedTabSelectorSample extends PureComponent {
state = {
color: null
};
render() {
return (
<div>
<h3>Select color: </h3>
<AdvancedTabSelector
options={colors}
value={this.state.color}
onChange={c => this.setState({ color: c })}
>
{color => (
<span
style={{
display: "inline-block",
backgroundColor: color,
width: "40px",
height: "40px"
}}
/>
)}
</AdvancedTabSelector>
<br />
<br />
<br />
<h3>Select animal: </h3>
<AdvancedTabSelector
options={animals}
value={this.state.animal}
onChange={c => this.setState({ animal: c })}
>
{animal => (
<img width="100px" src={require(`../../images/${animal}.png`)} />
)}
</AdvancedTabSelector>
</div>
);
}
}