普通类组件实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import React, { Component } from "react";
class Renderprops extends Component { state = { x: 0, y: 0, };
handlerFn = (e) => { this.setState({ x: e.x, y: e.y }); };
componentDidMount() { window.addEventListener("mousemove", this.handlerFn, false); }
componentWillUnmount() { window.removeEventListener("mousemove", this.handlerFn); }
render() { return ( <div> <h1> X:{this.state.x} Y:{this.state.y} </h1> </div> ); } }
export default Renderprops;
|
render props 模式
复用的是组件的状态和功能,传入的是 UI 要呈现的效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import React, { Component } from "react";
class MouseComponent extends Component { state = { x: 0, y: 0, };
handlerFn = (e) => { this.setState({ x: e.x, y: e.y }); };
componentDidMount() { window.addEventListener("mousemove", this.handlerFn, false); }
componentWillUnmount() { window.removeEventListener("mousemove", this.handlerFn); }
render() { return this.props.render(this.state); } }
class Renderprops extends Component { shoewUI = (state) => { const { x, y } = state; return ( <h1> X:{x} Y:{y} </h1> ); };
render() { return <MouseComponent render={this.shoewUI} />; } }
export default Renderprops;
|
高阶组件(HOC)
######高阶函数(形式上):如果一个函数的形参或者返回值也是函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import React, { Component } from "react";
const withCompile = (Fnc) => { return class MouseComponent extends Component { state = { x: 0, y: 0, };
handlerFn = (e) => { this.setState({ x: e.x, y: e.y }); };
componentDidMount() { window.addEventListener("mousemove", this.handlerFn, false); }
componentWillUnmount() { window.removeEventListener("mousemove", this.handlerFn); }
render() { return <Fnc {...this.state} {...this.props} />; } }; };
function Fnc(props) { return ( <div> title:{props.title} <h1> X:{props.x}Y:{props.y} </h1> </div> ); }
const Result = withCompile(Fnc);
class Renderprops extends Component { render() { return <Result title="数据" />; } }
export default Renderprops;
|
所以组件封装是为了复用 state 和 操作 state 的方法 (组件状态逻辑 )