React高阶组件

2020-05-07  本文已影响0人  learninginto

React高阶组件

简单地说,高阶组件(Higher-Order Components)就是一个函数,而参数是一个组件,返回值是一个相对增强性的组件。

一、用途

属性代理

反向继承(集成)

最终的目的:抽出公共的逻辑进行封装。

(一)属性代理
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App username="lxc" />, document.getElementById('root'));
import React, { Component } from "react";

export default (WrapperComponent) => {
    return class extends React.Component {
        constructor() {
            super();
            this.state = {
                title: "首页",
                age: 18,
                sign: "lxc"
            }
        }
        render() {
            let { title, ...rest } = this.state;
            console.log(this.props, "高阶组件");
            return (
                <div>
                    高阶组件header
                    <WrapperComponent {...this.props}{...rest}></WrapperComponent>
                </div>
            )
        }
    }
}

import React,{Component} from 'react';
import headerHoc from "./hoc/headerHoc";

class App extends Component{
  render(){
    console.log(this.props);//username: "lxc",age: 18,sign: "lxc"
    return(
      <div>app</div>
    )
  }
}

export default headerHoc(App);
(二) 反向继承
import React, { Component } from 'react';
import footerHoc from "./hoc/footerHoc"

class App extends Component {
  constructor() {
    super();
    this.state = {
      componentName:"App组件"
    }
  }
  render() {
    return (
      <div>app</div>
    )
  }
  handleClick(){
    console.log("123",this);//this通过bind改变为高阶组件
  }
  componentDidMount(){
    console.log("componentDidMount")
  }
}

export default footerHoc(App);

import React from "react"

export default (WrapperComponent) => {
    return class extends WrapperComponent {
        render() {
            return (
                <div>高阶组件
                    {super.render()}
                    <button onClick={super.handleClick.bind(this)}>点击</button>
                </div>
            )
        }
        componentDidMount(){
            console.log(123);
            super.componentDidMount();//打印componentDidMount
        }
    }
}

二、基本使用

(一)加载loading
import React, { Component } from 'react';
import Loading from "./hoc/loading";

class App extends Component {
  constructor() {
    super();
    this.state = {
      success:false
    }
  }
    
  render() {
    return (
      <div>app</div>
    )
  }
    
  componentDidMount(){
    setTimeout(()=>{
      this.setState({
        success:true
      })
    },2000)
  }
}

export default Loading(App);
import React from "react"

export default (WrapperComponent) => {
    return class extends WrapperComponent{
        render(){
            if(this.state.success){
               return super.render();

            }else{
                return(
                    <div>loading...</div>
                )
            }
        }
    }
}
(二) 增加跨组件传值
import React from "react"
export let { Provider, Consumer } = React.createContext();
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { Provider } from "./createContext"
ReactDOM.render(
    <Provider value={{
        username: "lxc",
        age: "18",
        sex: "男"
    }}>
        <App />
    </Provider>
    , document.getElementById('root'));
取出age.png
import React, { Component } from 'react'
import connect from "../hoc/connect"

class one extends Component {
    render() {
        console.log(this);
        return (
            <div></div>
        )
    }
}
// 只从父级拿取自己想要的数据
const mapStateToProps=(state)=>({
    age:state.age,
})
export default connect(one)(mapStateToProps)
import React, { Component} from 'react'
import { Consumer } from "../../createContext"

// 采用柯里化的方式,第一个参数是组件,第二个参数是回调
export default (Wrapper) => (mapStateToProps) => {
    return class extends React.Component {
        render() {
            return (
                <Consumer>
                    {
                        (value) => {
                            let props = mapStateToProps(value);
                            return <Wrapper {...props}></Wrapper>
                        }
                    }
                </Consumer>
            )
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读