- 条件渲染、组合渲染
function proxyHoc(Comp){
return class PH extends React.Component{
render(){
return (
<div>
<p>我</p>
<Comp {...this.props}/>
</div>
)
}
}
}
class Test extends React.Component{
render(){
return (
<p>是最{this.props.isGreat === true ? "棒" : "弱"}的</p>
)
}
}
- 操作props
function proxyHoc(Comp){
return class PH extends React.Component{
render(){
let newProps={...this.props,site:"全世界"}
return (
<div>
<p>我</p>
<Comp {...newProps}/>
</div>
)
}
}
}
class Test extends React.Component{
render(){
return (
<div>
<p>{this.props.site}</p>
<p>是最{this.props.isGreat === true ? "棒" : "弱"}的</p>
</div>
)
}
}
function inheritHoc(Comp){
return class IH extends Comp{
render(){
let CompRenderTree = super.render();
let otherProps = {site:"全世界"};
let newProps = Object.assign({},CompRenderTree.props,otherProps);
let NewComp=React.cloneElement(CompRenderTree,newProps);
return(
NewComp
)
}
}
}
- 获取ref(没有搞懂)
function proxyHoc(Comp){
return class PH extends React.Component{
componentDidMount(){
console.log(this.wrapperRef);
}
render(){
return <Comp ref={ref=> {this.wrapperRef=ref}}/>
}
}
}
function inheritHoc(Comp){
return class IH extends Comp{
componentDidMount(){
console.log(this.wrapperRef);
}
render(){
return (
super.render()
)
}
}
}
class Test extends React.Component{
wrapperRef=React.createRef("wrapperRef");
render(){
return (
<div>
<p ref={this.wrapperRef}>Ref指向我</p>
</div>
)
}
}
- 提取state
function ppHOC(WrappedComponent) {
return class PP extends React.Component {
constructor(props) {
super(props)
this.state = {
name: ''
}
this.onNameChange = this.onNameChange.bind(this)
}
onNameChange(event) {
this.setState({
name: event.target.value
})
console.log(this.state.name);
}
render() {
const newProps = {
name: {
value: this.state.name,
onChange: this.onNameChange
}
}
return <WrappedComponent {...this.props} {...newProps}/>
}
}
}
class Input extends React.Component{
render(){
return <input name="name" {...this.props.name} />
}
}
- 操作state
- 反向继承可实现(仅该用于调试,避免弄乱内部组件state)
function proxyHoc(WrappedComponent){
return class II extends WrappedComponent {
render() {
return (
<div>
<h2>HOC Debugger Component</h2>
<p>Props</p> <pre>{JSON.stringify(this.props, null, 2)}</pre>
<p>State</p><pre>{JSON.stringify(this.state, null, 2)}</pre>
{super.render()}
</div>
)
}
}
}