上文提到react高阶组件的基本概念以及基本使用方式,下面将介绍高阶组件的应用方式。css
返回的新组件直接继承于React.Component类,新组件做为传入组件的一个代理,在新组件中渲染出被包裹组件。除了高阶组件本身要作的事情之外,其他所有由被包裹组件来作。
其有四种操做:react
一、操纵props。
二、访问ref。
三、抽取状态。
四、包装组件。
1.操纵props:
咱们拿组件B来作演示,给B加一个属性name。app
import React from 'react'; import B from './components/B' import C from './components/C' import './App.css'; class App extends React.Component { render() { return ( <div> <B name='李雷' /> <C /> </div> ); } }
在B组件中把name经过props显示出来,可是发现上面并未对sex属性赋值,咱们能够在高阶组件中进行传入。this
import React, { Component } from 'react' import A from './A' @A class B extends Component { render() { console.log(this.props) return ( <div> <div>这是组件B</div> <div>个人名字:{ this.props.name }</div> <div>个人性别:{ this.props.sex }</div> </div> ) } } export default B
首先把根节点的props透传入组件B中,在添加一个新的属性sex。spa
import React, { Component } from 'react' export default function A(WrappedComponent) { return class A extends Component { render() { return ( <div className="box"> <div>我是公共组件A的内容</div> <WrappedComponent {...this.props} sex={'男'} /> </div> ) } } }
最终达到咱们操做props的要求:
2.访问ref:
经过ref访问调用C的实例代理
import React, { Component } from 'react' export default function A(WrappedComponent) { return class A extends Component { refContent(instance) { instance.putOutComponent && console.log(instance.putOutComponent()) } render() { return ( <div className="box"> <div>我是公共组件A的内容</div> <WrappedComponent { ...this.props } sex={ '男' } ref={ this.refContent } /> </div> ) } } }
在C中加入putOutComponent方法code
import React, { Component } from 'react' import A from './A' class C extends Component { putOutComponent() { return '这是组件C' } render() { console.log(this.props) return ( <div>这是组件C</div> ) } } export default A(C)
控制台中显示组件C中内容方法,这样能够控制全部被包裹组件,以便与业务扩展。component
3.抽取状态:
把input的value
值和onInputChange
方法从高阶组件中以props方式传入。blog
import React, { Component } from 'react' import A from './A' @A class B extends Component { render() { return ( <div> <input type='text' {...this.props} /> <br /> <div>这是组件B</div> <div>个人名字:{ this.props.name }</div> <div>个人性别:{ this.props.sex }</div> </div> ) } } export default B
设置newProps把value值和onInputChange传入,当输入内容改变时便会触发高阶组件onInputChange方法从而获取改变值的内容,一样能够在C组件中加入input在A高阶组件中进行控制。继承
import React, { Component } from 'react' export default function A(WrappedComponent) { return class A extends Component { constructor(props) { super(props) this.state = { value: '' } } refContent(instance) { instance.putOutComponent && console.log(instance.putOutComponent()) } onInputChange = (e) => { console.log(e.target.value) this.setState({ value: e.target.value }) } render() { const newProps = { value: this.state.value, onInput: this.onInputChange } return ( <div className="box"> <div>我是公共组件A的内容</div> <WrappedComponent { ...this.props } sex={ '男' } ref={ this.refContent } {...newProps} /> </div> ) } } }
4.包装组件:
包装组件指咱们能够在高阶组件中设置公共部分,<div>我是公共组件A的内容</div>
这里就是对组件的包装。
return ( <div className="box"> <div>我是公共组件A的内容</div> <WrappedComponent { ...this.props } sex={ '男' } ref={ this.refContent } {...newProps} /> </div> )
以上就是代理方式的高阶组件介绍。