React中render Props模式
React组件复用
React组件复用的方式有两种:
1.render Props模式
2.高阶组件HOC
上面说的这两种方式并不是新的APi。
而是利用Raect自身的编码特点,演化而来的固定编码写法。
什么是render Props模式
1.把prop是一个函数并且要告诉组件要渲染什么内容的技术,叫做render Props模式。
2.注意的是:并不是该模式叫做render Props就必须使用名为render的props,
实际上可以使用任意的props。
对上面者一句话的详细说明:
子组件向父组件抛出数据的时候使用的是:
this.props.render(数据)中render可以是其他名,如果GiveFather.
render Props的简单使用
现在我们有一个有的需求。
光标放在屏幕上,时时获取当前坐标的位置。
请封装为一个组件。
MoveCom.js 时时获取当前坐标的位置
import React from 'react';
class MoveCom extends React.Component{
  // 提供位置数据
  state = {
    x: 0,
    y:0,
  }
  // 获取鼠标的当前坐标
  moveHandler = e => {
    this.setState({
        x: e.clientX,
        y:e.clientY
    })
  }
  // 监听鼠标的行为
  componentDidMount() {
    // DOM已经渲染完成了;可以进行DOM操作
    window.addEventListener('mousemove',this.moveHandler)
  }
  render() {
    // 将组件中的数据暴露出去this.props.render(数据)
    return this.props.render(this.state)
  }
}
export default MoveCom
父组件展示位置
import React from 'react';
import ReactDOM from 'react-dom';
import ClassCom from "./components/ClassCom"
import MoveCom from './components/MoveCom'
class Father extends React.Component{
  render() {
    return (
      <div>
        <h2> render Props的简单使用</h2>
        { /* 接受子组件向上抛出来的数据*/}
        <MoveCom render={sonGiveData => {
          return (
            <p>当前鼠标的坐标横坐标: {sonGiveData.x }  纵坐标: {sonGiveData.y }</p>
          )
        }}></MoveCom>
      </div>
    )
  }
}
ReactDOM.render(
  <Father></Father>,
  document.getElementById('root')
)

总结
1. 如何将子组件中的数据抛出去
render() {
    return this.props.render(数据)
}
父组件接受数据
<MoveCom render={sonGiveData => {
  return (
    <!-- 渲染的html以及数据 -->
    <p>当前鼠标的坐标横坐标: {sonGiveData } </p>
  )
}}></MoveCom>
我们发现上面这个组件只实现了状态。
并没有实现UI结构的渲染。
UI结构的渲染是交给render函数来决定返回的内容。
小技巧:在React中 left,right,top,bottom是不需要加上px的。
<p style={{ position:'absolute', left:100, top:200 }}> 不需要加上px的 </p>
this.props.render(数据) 可以将数据传递出去
再次说明:上面这个render这个不一定非要叫做render。
只是这样写render了,你页可以叫做Aa,接受的时候使用也用Aa接收。
其实推荐children去代替render。因为这样更加语义化一些的。
在实际写的过程中也是用children。
下面我们来将代码更改一下,children去代替render。
children去代替render语法上的变化
1.使用render子组件向上抛出数据:
this.props.render(数据) 
1.使用children子组件向上抛出数据:
this.props.children(数据)
在向上抛出数据的时候,只是render变为了children。
2.render接受数据:
<MoveCom render={sonGiveData => {
    return (
        <p>当前鼠标的坐标横坐标: {sonGiveData } </p>
    )
}}></MoveCom>
2.children接收数据:
<MoveCom>
  {
    (data) => {
      return (
        <p style={{ position:'absolute', left:data.x, top:data.y }}>
          横坐标: {data.x }  纵坐标: {data.y }
        </p>
      )
    }
  }
</MoveCom>
render接收数据的时候,数据是写在组件上
children接收的时候,将数据写在了里面。
render Props中使用 children去代替render
子组件
import React from 'react';
class MoveCom extends React.Component{
  // 提供位置数据
  state = {
    x: 0,
    y:0,
  }
  // 获取鼠标的当前坐标
  moveHandler = e => {
    this.setState({
      x: e.clientX,
      y:e.clientY
    })
  }
  // 监听鼠标的行为
  componentDidMount() {
    // DOM已经渲染完成了;可以进行DOM操作
    window.addEventListener('mousemove',this.moveHandler)
  }
  render() {
    // 将子组件中的数据暴露出去,render变为了children
    return this.props.children(this.state)
  }
}
export default MoveCom
父组件
import React from 'react';
import ReactDOM from 'react-dom';
import ClassCom from "./components/ClassCom"
import MoveCom from './components/MoveCom'
class Father extends React.Component{
  render() {
    return (
      <div>
        <h2> render Props的简单使用</h2>
        <MoveCom>
          {
            (data) => {
              return (
                <p style={{ position:'absolute', left:data.x, top:data.y }}>
                    横坐标: {data.x }  纵坐标: {data.y }
                </p>
              )
            }
          }
        </MoveCom>
      </div>
    )
  }
}
ReactDOM.render(
  <Father></Father>,
  document.getElementById('root')
)
优化React中render Props模式
1.推荐给render Props添加一个校验。
因为render Props接收的是一个函数并且是必须写的。
// 规则校验
MoveCom.propTypes = {
  // 如果是使用的children
  children: PropTypes.func.isRequired
  // render: PropTypes.func.isRequired 如果使用使用的render
}
2.移出事件绑定
 // 组件即将卸载的时候,移出事件监听
componentWillUnmount() {
  window.removeEventListener('mousemove',this.moveHandler)
}
3.这里为什么要移出事件绑定
而我们在页面中用onClick绑定的事件不需要被移除呢?
因为onClick是借用react来完成的事件绑定,react会自动帮我们移除。
这里我们不是借用React来完成的事件绑定,因此我们应该手动移除
子组件优化后的代码
import React from 'react';
import PropTypes from 'prop-types'
class MoveCom extends React.Component{
  // 提供位置数据
  state = {
    x: 0,
    y:0,
  }
  // 获取鼠标的当前坐标
  moveHandler = e => {
    this.setState({
      x: e.clientX,
      y:e.clientY
    })
  }
  // 监听鼠标的行为
  componentDidMount() {
    // DOM已经渲染完成了;可以进行DOM操作
    window.addEventListener('mousemove',this.moveHandler)
  }
  // 组件即将卸载的时候,移出事件监听-优化的地方
  componentWillUnmount() {
    window.removeEventListener('mousemove',this.moveHandler)
  }
  render() {
    // 将子组件中的数据暴露出去,render变为了children
    return this.props.children(this.state)
  }
}
// 规则校验-优化的地方
MoveCom.propTypes = {
  // 如果是使用的children
  children: PropTypes.func.isRequired
  //  render: PropTypes.func.isRequired 如果使用使用的render
}
export default MoveCom
React中render Props模式的更多相关文章
- React Render Props 模式
		概述 Render Props模式是一种非常灵活复用性非常高的模式,它可以把特定行为或功能封装成一个组件,提供给其他组件使用让其他组件拥有这样的能力,接下来我们一步一步来看React组件中如何实现这样 ... 
- react 中发布订阅模式使用
		react 中发布订阅模式使用 场景 怎么能将设计模式应用到我们的 React 项目中?以前一直在思考这个问题. 场景一 模块 A 模块 B 需要用到同一个数据 data,A 和 B 都会修改这份数据 ... 
- React中super(props)和super()以及不写super()的区别
		一.constructor()和super()的基本含义 constructor() -- 构造方法 这是ES6对类的默认方法,通过new命令生成对象实例自动调用的方法.并且,该方法是类中必须要有的, ... 
- React 之 render props 的理解
		1.基本概念 在调用组件时,引入一个函数类型的 prop,这个 prop定义了组件的渲染方式. 2.回调渲染 回顾组件通信的几种方式 父-> 子 props 子-> 父 回调.消息通道 任 ... 
- react中对props.children进行操作
		之前写的更多的时候是直接使用简写 {props.children} 这样就可以了,但是当有时候需要对传入的子组件进行一些操作的时候需要用到React.Children方法 {React.Childre ... 
- React中this.props的主要属性
		this.props主要包含:history属性.location属性.match属性 ①history属性又包含 ②location属性又包含 ③match属性又包含 
- 可复用 React 的 HOC 以及的 Render Props
		重复是不可能的,这辈子都不可能写重复的代码 当然,这句话分分钟都要被产品(领导)打脸,真的最后一次改需求,我们烦恼于频繁修改的需求 虽然我们不能改变别人,但我们却可以尝试去做的更好,我们需要抽象,封装 ... 
- React中props
		今天让我们开启新的篇章好吧,来搞一搞React,以下所有操作都是我个人的一些理解,如果有错吴还请指出,想要看更全的可以去React官网可能一下子好吧 昨天按摩没到位,导致今天身体不太行,撸码千万别苦了 ... 
- React-代码复用(mixin.hoc.render props)
		前言 最近在学习React的封装,虽然日常的开发中也有用到HOC或者Render Props,但从继承到组合,静态构建到动态渲染,都是似懂非懂,索性花时间系统性的整理,如有错误,请轻喷~~ 例子 以下 ... 
随机推荐
- 在keil中加入DSP库并且使用arm_math.h
			如果不开启硬件FPU,代码设置和编译控制建议二选一,否则会出现宏定义重复定义的报错 
- java高级用法之:在JNA中将本地方法映射到JAVA代码中
			目录 简介 Library Mapping Function Mapping Invocation Mapping 防止VM崩溃 性能考虑 总结 简介 不管是JNI还是JNA,最终调用的都是nativ ... 
- docker基础_Dockerfile
			Dockerfile []: https://docs.docker.com/language/python/build-images/ "docker官方文档" 以python为 ... 
- SpringCloudAlibaba微服务docker容器打包和部署示例实战
			概述 我们使用前面<SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码分析(中)>的两个微服务示例,分别是库存微服务和订单微服务,基于Nacos注册中心和配置 ... 
- 通过Nginx TCP反向代理实现Apache Doris负载均衡
			概述 Nginx能够实现HTTP.HTTPS协议的负载均衡,也能够实现TCP协议的负载均衡.那么,问题来了,可不可以通过Nginx实现Apache Doris数据库的负载均衡呢?答案是:可以.接下来, ... 
- 得到知识服务app原型设计比较与实践
			一.几种原型设计工具的比较 墨刀 优点: 拥有PC端.手机端.网页版,让你随时随地可以进行产品原型设计: 其定位是主要用于设计移动APP原型,其控件的拖拉.大小的调整,都会自然去匹配相应的母版大小,非 ... 
- 使用Typora + 阿里云OSS + PicGo 打造自己的图床
			使用Typora + 阿里云OSS + PicGo 打造自己的图床 为什么要打造图床? 让笔记远走高飞 试问以下场景: 我们要把 markdown 笔记放到某博客上,直接进行复制即可.但因你的图片存储 ... 
- py文件加密打包成exe文件
			python的py.pyc.pyo.pyd文件区别 py是源文件: pyc是源文件编译后的文件: pyo是源文件优化编译后的文件: pyd是其他语言写的python库: 为什么选用Cpython .p ... 
- 常用的Linux 系统备份、恢复命令
			公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 删库跑路的事常常听说,不过,这只能是个调侃的话题,真正的工作中可不能这么干,否则,库是删了,路怕是跑不了了. 所以,备份很重 ... 
- 实战 | Linux根分区扩容
			一个执着于技术的公众号 一个执着于技术的公众号 前言 Linux系统作为服务器操作系统,经常遇到一个问题就是服务器分区磁盘空间不足需要扩容的情况.本文以linux系统最常见的发行版centos7系统为 ... 
