高阶组件的使用
目录
import React, { PureComponent } from 'react'
class App extends PureComponent {
render() {
return (
<div>
<h2>app: {this.props.name}</h2>
</div>
)
}
}
function enhanceComponent(WrappedComponent) {
class NewComponent extends PureComponent {
render() {
return <WrappedComponent {...this.props}/>
}
}
NewComponent.displayName = 'czm';
return NewComponent;
}
const EnhanceComponent = enhanceComponent(App);
export default EnhanceComponent;
ReactDOM.render(
<EnhanceComponent name='czm' />
document.getElementById('root')
);
import React, { PureComponent } from 'react'
function enhanceProps(WrappedComponent) {
return props => {
return <WrappedComponent {...props} region='中国'/>
}
}
export default class App extends PureComponent {
render() {
return (
<div>
<EnhanceHome nickname='czm' age={22}/>
<EnhanceAbout nickname='ez' age={18}/>
</div>
)
}
}
class Home extends PureComponent {
render() {
return(
<h2>
Home: 昵称:{this.props.nickname}
等级:{this.props.age}
区域:{this.props.region}
</h2>
)
}
}
const EnhanceHome = enhanceProps(Home);
class About extends PureComponent {
render() {
return(
<h2>About: {
`昵称:${this.props.nickname}
等级:${this.props.age}
区域:${this.props.region}
`}
</h2>
)
}
}
const EnhanceAbout = enhanceProps(About);
import React, { PureComponent, createContext } from 'react'
const UserContext = createContext({
nickname: '默认值',
age: 0,
region: ''
});
const ThemeContext = createContext({
nickname: '默认值',
age: 0,
region: ''
});
function enhanceUser(WrappedComponent) {
return props => {
return (
<UserContext.Consumer>
{
value => {
return (
<WrappedComponent {...props} {...value} />
)
}
}
</UserContext.Consumer>
)
}
}
function enhanceTheme(WrappedComponent) {
return props => {
return (
<ThemeContext.Consumer>
{
value => {
return (
<WrappedComponent {...props} {...value} />
)
}
}
</ThemeContext.Consumer>
)
}
}
export default class App extends PureComponent {
render() {
return (
<div>
<UserContext.Provider value={{ nickname: 'czm', age: 21, region: '中国' }}>
<ThemeContext.Provider value={{ nickname: 'ez', age: 18, region: '中国' }}>
<EnhanceHome />
<EnhanceAbout />
</ThemeContext.Provider>
</UserContext.Provider>
</div>
)
}
}
class Home extends PureComponent {
render() {
return (
<h2>Home: 昵称:{this.props.nickname}
等级:{this.props.age}
区域:{this.props.region}
</h2>
)
}
}
const EnhanceHome = enhanceUser(Home);
class About extends PureComponent {
render() {
return (
<h2>
About: {
`昵称:${this.props.nickname}
等级:${this.props.age}
区域:${this.props.region}
`}
</h2>
)
}
}
const EnhanceAbout = enhanceTheme(About);
import React, { PureComponent } from 'react'
export default class App extends PureComponent {
render() {
return (
<div>
<TimeHome name='Home'/>
<TimeAbout name='About'/>
</div>
)
}
}
function withRenderTime(WrappedComponent)
return class NewComponent extends PureComponent {
componentWillMount() {
this.beginTime = Date.now();
}
componentDidMount() {
this.endTime = Date.now();
const interval = this.endTime - this.beginTime;
console.log(`${this.props.name}渲染时间:${interval}`);
}
render() {
return (
<WrappedComponent {...this.props} />
)
}
}
}
class Home extends PureComponent {
render() {
return <h2>Home</h2>
}
}
class About extends PureComponent {
render() {
return <h2>About</h2>
}
}
const TimeHome = withRenderTime(Home);
const TimeAbout = withRenderTime(About);