高阶组件(2018/12/18)

一、高阶组件
          ①接收一个组件返回一个增强性的组件
        高阶组件其实是一个函数,这个函数接收一个参数,这个参数是一个组件,返回值是一个增强性的组件
component/list/header.js  //①这是新建一个组件
import React,{Component} from 'react'
 
class Header extends Component{
    render(){
        return(
 
            <div>
                header
            </div>
            )
    }
}
export default Header
 
component/list/list.js
import React,{Component} from 'react'
import Header from "./header"   //② 在原有的组件中引入这个组件
 
let Hoc =(Com)=> //③写一个函数,这个函数中带一个参数是一个组件 ,相当于一个将要被替换掉的模板
    class Text extends Component{  
        render(){
            return(
                <div>
                    <p>这是一个高阶组件</p>
                    <Com/>  
                </div>
                )
        }
    }
    return Text
}
 
let Hi =Hoc(Header)  //④ 再写一个函数,将模板Hoc中的参数写成想要的组件名
class List extends Component{
    render(){
        return(
 
            <div>
                <Hi/>  //⑤ 将这个组件渲染到页面上  
            </div>
            )
    }
}
export default List
 
    ②属性代理:实现组件的复用性    //就是我写一个组件,我想在什么组件中使用就将这个组件引入到那个组件中去,利用高阶组件的概念进行渲染
header.js   //这就相当于一个组件模板,需要的时候引入就可以,数据可以在高阶组件中进行修改
import React,{Component} from 'react'
 
class Header extends Component{
    render(){
        let {imgs}= this.props
        return(
 
        <div className="swiper-container">
            <div className="swiper-wrapper">
               {
                imgs.map((item,index)=>{
                       return  <div className="swiper-slide" key={index}>
                            <img src={item}/>
                       </div>
                   })
               }
            </div>
        </div>
            )
    }
}
export default Header
 
list.js
 
import React,{Component} from 'react'
import Header from "./header"
 
let Hoc =(Com)=>{
    class Text extends Component{
        constructor(){  //当不同的高阶组件需要不同的数据时可以在这里修改
            super();
            this.state={
                arr:[
                       "https://www.swiper.com.cn/demo/slow-transition/img/picture-1.jpg",
                    "https://www.swiper.com.cn/demo/slow-transition/img/picture-2.jpg",
                    "https://www.swiper.com.cn/demo/slow-transition/img/picture-3.jpg"
                ]
            }
        }
        render(){
            let {arr} = this.state
            return(
                <div>                    
                    <Com imgs={arr}/>
                </div>
                )
        }
    }
    return Text
}
let Hi =Hoc(Header)
class List extends Component{
    render(){
        return(
 
            <div>
                <Hi/>
            </div>
            )
    }
}
export default List
 
 
③  反向集成 :渲染劫持
    根据条件来渲染不同的组件或数据
list.js
import React,{Component} from 'react'
import Header from "./header"
 
let Hoc =(params)=>(Com)=>{
    class Text extends Component{
        constructor(){
            super();
            this.state={
                arr:[
                       "https://www.swiper.com.cn/demo/slow-transition/img/picture-1.jpg",
                    "https://www.swiper.com.cn/demo/slow-transition/img/picture-2.jpg",
                    "https://www.swiper.com.cn/demo/slow-transition/img/picture-3.jpg"
                ]
            }
        }
        render(){
            let {arr} = this.state
            return(
                                
                    params?<Com imgs={arr}/>:<p>请登录</p>   //这里是一个三目运算,根据条件的不同来渲染不同的组件
                
                )
        }
    }
    return Text
}
let Hi =Hoc(false)(Header)  //这里的第一个参数是params中的值
class List extends Component{
    render(){
        return(
 
            <div>
                <Hi/>
            </div>
            )
    }
}
export default List
原文地址:https://www.cnblogs.com/zsrTaki/p/11510869.html