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,但从继承到组合,静态构建到动态渲染,都是似懂非懂,索性花时间系统性的整理,如有错误,请轻喷~~ 例子 以下 ...
随机推荐
- 基于Debian搭建Hyperledger Fabric 2.4开发环境及运行简单案例
相关实验源码已上传:https://github.com/wefantasy/FabricLearn 前言 在基于truffle框架实现以太坊公开拍卖智能合约中我们已经实现了以太坊智能合约的编写及部署 ...
- Mybatis注解开发(一对一)
其他代码访问:Mybatis注解开发基础操作 1.添加OrderMapper接口 public interface OrderMapper { // @Select("select *,o. ...
- Kubernetes探针原理详解
前言: 分布式系统和微服务体系结构的挑战之一是自动检测不正常的应用程序,并将请求(request)重新路由到其他可用系统,恢复损坏的组件.健康检查是应对该挑战的一种可靠方法.使用 Kubernetes ...
- MVC:开发模式&&三层架构:软件设计架构
MVC:开发模式 jsp演变历史 早期只有servlet,只能使用response输出标签数据,非常麻烦 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码 ...
- CentOS Nginx的安装与部署
安装工具包 wget.vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc ...
- k8s client-go源码分析 informer源码分析(1)-概要分析
k8s informer概述 我们都知道可以使用k8s的Clientset来获取所有的原生资源对象,那么怎么能持续的获取集群的所有资源对象,或监听集群的资源对象数据的变化呢?这里不需要轮询去不断执行L ...
- Metalama简介4.使用Fabric操作项目或命名空间
使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在编译时进行消除重 ...
- js归并排序实现
let arr = [3,4,2,8,1,1,2,2,3,3,4,5]; const merge = function(L,M,R) { let arr2=[]; let i=0; let p1 = ...
- [洛谷] P2241 统计方形(数据加强版)
点击查看代码 #include<bits/stdc++.h> using namespace std; long long n, m, total, sum1, sum2; int mai ...
- 论文阅读 Dynamic Graph Representation Learning Via Self-Attention Networks
4 Dynamic Graph Representation Learning Via Self-Attention Networks link:https://arxiv.org/abs/1812. ...