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,但从继承到组合,静态构建到动态渲染,都是似懂非懂,索性花时间系统性的整理,如有错误,请轻喷~~ 例子 以下 ...
随机推荐
- Ubu18安装RabbitMQ
RabbitMQ安装 https://www.jianshu.com/p/5c8c4495827f 安装 RabbitMQ基于erlang语言,需要先安装 sudo apt-get install e ...
- 关闭Mac的Microsoft AutoUpdate
最近使用Office 发现AutoUpdate一直会启动.我也不需要里面的更新.每次还要把它推出. 网上看到有两种方法,一种是暴力删除,另一种是通过权限限制. 暴力可不是我喜欢的方式,所以选择后者. ...
- docker基础_docker镜像与分层
docker镜像与分层 docker镜像由一些松耦合的制度镜像层组成 docker负责堆叠这些镜像层并将它们表示为单个统一的对象 当 docker image pull ubuntu:latest 时 ...
- C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解
系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解>最后列出了 Fil ...
- Go汇编语法和MatrixOne使用介绍
目录 MatrixOne数据库是什么? Go汇编介绍 为什么使用Go汇编? 为什么不用CGO? Go汇编语法特点 操作数顺序 寄存器宽度标识 函数调用约定 对写Go汇编代码有帮助的工具 avo tex ...
- java序列回显学习
java反序列化回显 在很多不出网的情况下,一种是写webshell(内存嘛),另一种就是回显,本文先学习回显,回显的主要方式有一下几种. defineClass RMI绑定实例 URLClassLo ...
- CSS预编译器
零.CSS预编译器 CSS预处理器是指对生成CSS前的某一语法的处理.CSS预处理器用一种专门的编程语言,进行Web页面样式设计,然后再编译成正常的CSS文件,供项目使用 CSS预处理器为CSS增加一 ...
- openstack命令创建云主机实例
@ 目录 前言 上传centos镜像 创建实例 创建外网卡 修改安全组规则 创建云主机实例 前言 简单创建云主机实例只需要上传一个测试镜像.创建一张外网卡.创建一个实例类型.修改安全组规则即可 注:这 ...
- 拖动元素调换位置——sortable.js
使用简介: https://github.com/SortableJS/Sortable https://segmentfault.com/a/1190000008209715 /**! * Sort ...
- 一图详解java-class类文件原理
摘要:徒手制作一张超大的类文件解析图,方便通过浏览这个图能马上回忆起class文件的结构以及内部的指令. 本文分享自华为云社区<[读书会第十二期]这可能是全网"最大".&qu ...