最近几个月来,React 社区开始转向一个有趣的方向。到目前为止,我们的示例中的 children 属性都是 React 组件。然而,有一种新的模式越来越受欢迎,children 属性是一个 JSX 表达式。我们先从传入一个简单对象开始。

function UserName({ children }){

return (

{ children.lastName },

{ children.firstName }

);

}

function App(){

const user = {

firstName: 'Krasimir',

lastName: 'Tsonev'

};

return (

{ user }

);

}

这看起来有点怪怪的,但实际上它确实非常强大。例如,当某些父组件所知道的内容不需要传给子组件时。下面的示例是待办事项的列表。App 组件拥有全部的数据,并且它知道如何确定待办事项是否完成。TodoList 组件只是简单地封装了所需的 HTML 标记。

function TodoList({ todos, children }){

return (

  • {

todos.map((todo, i) => (

{ children(todo) }

))

}

);

}

function App(){

const todos = [

{ label: 'Write tests', status: 'done' },

{ label: 'Sent report', status: 'progress' },

{ label: 'Answer emails', status: 'done' }

];

const isCompleted = todo => todo.status === 'done';

return (

{

todo => isCompleted(todo) ?

{ todo.label } :

todo.label

}

);

}

注意观察 App 组件是如何不暴露数据结构的。TodoList 完全不知道 label 和 status 属性。

名为 render prop 的模式与上面所讲的基本相同,除了渲染待办事项使用的是 render 属性,而不是 children 。

function TodoList({ todos, render }){

return (

  • {

todos.map((todo, i) => (

{ render(todo) }

))

}

);

}

return (

todos={ todos }

render={

todo => isCompleted(todo) ?

{ todo.label } : todo.label

} />

);

这两种模式 将函数作为 children 传入 和 render prop 是我最新非常喜欢的。当我们想要复用代码时,它们提供了灵活性和帮助。它们还是抽象命令式代码的强力方式。

class DataProvider extends React.Component{

constructor(props) {

super(props);

this.state = { data: null };

setTimeout(() => this.setState({ data: 'Hey there!' }), 5000);

}

render() {

if (this.state.data === null) return null;

return (

{ this.props.render(this.state.data) }

);

}

}

DataProvider 刚开始不渲染任何内容。5 秒后我们更新了组件的状态并渲染出一个 , 的内容是由 render 属性返回的。可以想象一下同样的组件,数据是从远程服务器获取的,我们只想数据获取后才进行显示。

The data is here!

} />

我们描述了我们想要做的事,而不是如何去做。细节都封装在了 DataProvider 中。最近,我们在工作中使用这种模式,我们必须将某些界面限制只对具有 read:products 权限的用户开放。我们使用的是 render prop 模式。

permissionsInclude={[ 'read:products' ]}

render={ () => } />

这种声明式的方式相当不错,不言自明。Authorize 会进行认证,以检查当前用户是否具有权限。如果用户具有读取产品列表的权限,那么我们便渲染 ProductList 。

结语

你是否对为何还在使用 HTML 感到奇怪?HTML 是在互联网创建之初创建的,直到现在我们仍然在使用它。原因在于它的高度可组合性。React 和它的 JSX 看起来像进化的 HTML ,因此它具备同样的功能。因此,请确保精通组合,因为它是 React 最大的好处之一。

react封装函数_React 模式-将函数作为 children 传入和 render prop - 极客教程相关推荐

  1. react封装函数_react request.js 函数封装

    1.request.js  函数封装 import { Toast } from 'antd-mobile'; import axios from 'axios'; import store from ...

  2. Labview字符串函数——匹配模式(函数)

    匹配模式(函数) 函数介绍 功能介绍 输入.输出 详细信息 例程分析 分析总结 函数介绍 功能介绍 在从偏移量起始的字符串中搜索正则表达式.如函数查找到匹配,它将字符串分隔为三个子字符串.正则表达式为 ...

  3. c语言函数指针封装函数,C语言之函数指针、回调函数的使用

    一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...

  4. react封装函数_React-Router源码解读

    起因 目前负责的项目中有一个微信网页,用的是react技术栈.在该项目中增加了一个微信分享功能后,线上ios出现了问题,经排查,定位到了react的路由系统. 这次线上bug,让我决定,先从react ...

  5. react封装函数_GitHub - daifee/react-component: 用 React 封装一套常用组件

    Daifee-React-Component 用 React 封装一套常用组件 所有组件都是 stateless 组件,但为方便,某些组件提供 API 调用方式的静态方法. [TOC] 使用前须知 源 ...

  6. 封装一个信号量集操作函数的工具

    信号量的概念参见这里. 与消息队列和共享内存一样,信号量集也有自己的数据结构: struct semid_ds { struct ipc_perm sem_perm;  /* Ownership an ...

  7. React Hooks常用的Hooks钩子函数

    React Hooks的作用是对函数型组件进⾏增强,让函数型组件可以存储状态, 可以拥有处理副作⽤的能⼒,可以在不使⽤类组件的情况下, 实现相同的功能. useState实现原理 useState方法 ...

  8. antd 函数组件_React - 组件:函数组件

    目录: 1. 组件名字首字母一定是大写的2. 返回一个jsx3. jsx依赖React,所以组件内部需要引入React4. 组件传参 a. 传递.b. 接收. function Component( ...

  9. Golang之函数选项模式

    仅做记录 /*Functional Options函数选项模式(简称FOP模式)既保持了兼容性,而且每增加1个新属性只需要1个With函数即可,大大减少了修改代码的风险 */ package main ...

最新文章

  1. 爱耳日腾讯天籁行动再升级 助力100位青年听障人才打破“屏障”
  2. Linux下运行C语言程序
  3. 图片转圈实现_如何编辑图片?
  4. ubuntu 设置分辨率 亲测可用 转载的
  5. wordpress如何设置文章置顶以及区分置顶文章与普通文章
  6. 【信息系统项目管理师】第4章-项目整体管理 知识点详细整理
  7. Python3 从零单排27_锁信号量Event定时器
  8. 开关灯(c语言数据结构习题)
  9. APICloud 实现文档下载和预览功能
  10. Hexo-next主题优化篇
  11. 英特尔对手机的几个痛苦领悟
  12. AutoJs UI版
  13. 北斗短报文和北斗定位入门篇
  14. htonl htons ntohl ntohs inet_pton inet_ntop
  15. JS判断字符串中的内容是否为纯数字
  16. Android开发(一)-发展和历史
  17. c罩杯尺码_c罩杯的胸部有多大
  18. 不会论文管理?带你从零开始完成zotero安装,插件配置及使用
  19. ns-3模拟基本流程(附ns-3中的一些概念概述)
  20. 【离散数学】计算主析取范式(基于真值表)

热门文章

  1. python 格式化工具_推荐一个小而美的 Python 格式化工具
  2. 测试工程师python面试常问问题_面试测试工程师一般会问些什么?
  3. linux操作系统基础与实训教程,清华大学出版社-图书详情-《Linux操作系统基础与实训教程》...
  4. mysql连接查询(内联)_MySQL之连接查询
  5. java装饰者模式讲解视频教程_java装饰者模式介绍(图文教程)
  6. Adobe Acrobat Pro DC二次激活失败的解决方案
  7. 笑傲江湖手3D游服务器端文件,新笑傲江湖手游7月2日部分服务器数据互通预告...
  8. js 异步执行_js执行过程你了解多少?
  9. 用sklearn mysql_sklearn 生成随机数据
  10. Java 并发编程之线程池 ExecutorService 接口