React 进阶 Render Props

react

通过实现一个切换组件我们来深化一下对 React 理解,我们的研究是从一个示例开始,创建一个切换的按钮来切换部分内容显示和隐藏。
创建一个 button 作为操作切换状态的触发器。

<button>显示/隐藏</button>

定义状态 state,页面有两个状态分别是

  • on:true 显示内容
  • on:false 隐藏内容
    通过更新状态 state 来更新界面,状态更新了会更新 dom 。
    state = {
        on:false,
    }

定义 toggle 方法主要用于负责更新 state 中 on 的值来控制页面状态,隐藏/显示界面

    toggle = () => {
        this.setState({
            on:!this.state.on
        })
    }

简单实现

    {
          this.state.on && (
            <h1>Zidea</h1>        
          )
      }
import React, { Component } from 'react'

export default class Toggle extends Component {
    state = {
        on:false,
    }

    toggle = () => {
        this.setState({
            on:!this.state.on
        })
    }
  render() {
    return (
      <div className={toggleStyle}>
      {
          this.state.on && (
            <h1>Zidea</h1>        
          )
      }
        <button onClick={this.toggle}>显示/隐藏</button>
      </div>
    )
  }
}

const toggleStyle = {
    background:"blue"
}

我们的控制要显示或隐藏内容是不是一层不变的,为更灵活的考虑,可能控制内容根据不同情况(场景)会有所不同,我们将这部分内容作为 children 参数传入来提供组件复用性。

  render() {
    return (
      <div className={toggleStyle}>
      {
          this.state.on && (
            this.props.children       
          )
      }
        <button onClick={this.toggle}>显示/隐藏</button>
      </div>
    )
  }
      <div>
        <Toggle>
            <h1>angular basic tut</h1>
        </Toggle>
      </div>

Render props

从字面上不难理解为 render 的属性传入组件,来控制渲染。

  render() {
    return (
      <div>
        <ToggleRenderProps render={()=>(
            <div>
            <h1>tut list</h1>
            <button>隐藏/显示</button>
            </div>
        )}/>
            
      </div>
    )
  }

然后我们通过 props 方法到作为 props 传入的参数来使用,可以调用 render 函数将界面渲染出来。

  render() {
      const { render} = this.props;
    return (
      <div>
        {render()}
      </div>
    )
  }

既然 render 函数,是不是可以将参数参入函数来使用呢?当然没有问题,我们可以尝试在组件内部来控制组件显示。

        <ToggleRenderProps render={(str)=>(
            <div>
            <h1>{str}</h1>
            <button>隐藏/显示</button>
            </div>
        )}/>

这样就顺利将 hello zidea 显示到我们的界面上了。

  render() {
      const { render} = this.props;
    return (
      <div>
        {render('hello zidea')}
      </div>
    )
  }

既然可以可以传参数,那么也可以传入一个对象进入界面。

      <div>
        {render({
            on:this.state.on,
            toggle:this.toggle
        })}
      </div>

这样我们 render 方法就可以接收到组件内部 state 和 toggle 方法来控制行为,这样就将功能和界面成功进行分离来实现更灵活的效果。

  render() {
    return (
      <div>
        <ToggleRenderProps render={({on, toggle})=>(
            <div>
            {
                on && <h1>Hey zidea</h1>
            }
            
            <button onClick={toggle}>隐藏/显示</button>
            </div>
        )}/>
            
      </div>
    )
  }

其实这里 render 我们给其任意名称,render 只是一个名称而已,既然这样我们可以可以用 children ,children 使我们的固有函数

  render() {
      const { children } = this.props;
        return children({
            on:this.state.on,
            toggle:this.toggle
        })
      }
  render() {
    return (
      <div>
        <ToggleRenderRPC>
           { ({on,toggle}) => (
                <div>
                    {on && <h1>Zidea React</h1>}
                    <button onClick={toggle}>显示/隐藏</button>
                </div>
            )}
        </ToggleRenderRPC>
      </div>
    )
  }
import React, { Component,Fragment } from 'react'

在 react 新特性中提供 Fragment 。

  render() {
    return (
      <div>
        <ToggleRenderRPC>
           { ({on,toggle}) => (
                <Fragment>
                    {on && <h1>Zidea React</h1>}
                    <button onClick={toggle}>显示/隐藏</button>
                </Fragment>
            )}
        </ToggleRenderRPC>
      </div>
    )
  }
avascript
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 12,692评论 1 33
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 12,470评论 2 35
  • 1、什么是react React.js 是一个帮助你构建页面 UI 的库。React.js 将帮助我们将界面分成了...
    谷子多阅读 7,309评论 1 13
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 4,693评论 0 1
  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 11,414评论 0 9