龙空技术网

react中的render-props模式

千锋IT小助手 89

前言:

目前同学们对“react直接修改props”大致比较注重,小伙伴们都需要剖析一些“react直接修改props”的相关文章。那么小编同时在网络上收集了一些关于“react直接修改props””的相关知识,希望看官们能喜欢,大家快快来了解一下吧!

前言思考:如果两个组件中的部分功能相似或相同,该如何处理?处理方式:复用相似的功能复用什么?state操作state的方法两种方式:render props模式高阶组件(HOC)注意: 这两种方式不是新的API,而是利用React自身特点的编码技巧,演化而成的固定模式,接下来我们以render-props模式为例,一步一步演示其使用流程。案例分析

我们以鼠标移动获取坐标为例,该案例是未优化过的代码,我们发现ui都限制在了render中。

  import { Component } from 'react'  import PropTypes from 'prop-types'  export default class Mouse extends Component {    static propTypes = {      children: PropTypes.func.isRequired    }    state = {      x: 0,      y: 0    }​    componentDidMount() {      window.addEventListener('mousemove', this.handleMouseMove)    }​    handleMouseMove = e => {      this.setState({        x: e.clientX,        y: e.clientY      })    }    render() {      return (        // ui都限制在了render中        <div>          x: {this.state.x}          y: {this.state.y}        </div>      )    }  }​​
优化思路分析思路:将要复用的state和操作state的方法封装到一个组件中如何拿到该组件中复用的state在使用组件时,添加一个值为函数的prop,通过函数参数来获取
 <Mouse render={(mouse) => {}} /> 

如何渲染到任意的UI使用该函数的返回值作为要渲染的UI内容

 <Mouse render={(mouse) => {     return <p>         x: {mouse.x}         y: {mouse.y}     </p>  }} /> 

使用步骤创建Mouse组件,在组件中提供复用的逻辑代码将要复用的状态作为 props.render(state)方法的参数,暴露到组件外部使用props.render() 的返回值作为要渲染的内容

  render() {    // return (    //   <div>    //     {/* mouse */}    //     x: {this.state.x}    //     y: {this.state.y}    //   </div>    // )    return this.props.render(this.state)  }​
示例demo
class Mouse extends React.Component {    // 鼠标位置状态    state = {        x: 0,        y: 0    }​    // 监听鼠标移动事件    componentDidMount(){        window.addEventListener('mousemove',this.handleMouseMove)    }    handleMouseMove = e => {        this.setState({            x: e.clientX,            y: e.clientY        })    }    render(){        // 向外界提供当前子组件里面的数据        return this.props.render(this.state)    }}class App extends React.Component {    render() {        return (            <div>                App                <Mouse render={mouse => {                    return <p>X{mouse.x}Y{mouse.y}</p>                }}/>            </div>        )    }}ReactDOM.render(<App />,document.getElementById('root'))
children代替render属性注意:并不是该模式叫 render props就必须使用名为render的prop,实际上可以使用任意名称的prop把prop是一个函数并且告诉组件要渲染什么内容的技术叫做: render props模式推荐:使用childre代替render属性
 <Mouse>  {    ({ x, y }) => {      return (        <p>          x: {x}          y: {y}        </p>      )    }  }</Mouse>

Mouse组件内部的render修改为:

  render() {    // return (    //   <div>    //     {/* mouse */}    //     x: {this.state.x}    //     y: {this.state.y}    //   </div>    // )    return this.props.children(this.state)  }
优化代码推荐给render-props模式添加props校验
​  static propTypes = {    children: PropTypes.func.isRequired  }​
当组件移除时候解绑事件
  componentWillUnmount() {    window.removeEventListener('mousemove', this.handleMouseMove)  }

标签: #react直接修改props #react 修改props #react修改props中的值