react 函数子组件(Function ad Child Component)
今天学习了react中的函数子组件的概念,然后在工作中得到了实际应用,很开心,那么好记性不如烂笔头,开始喽~
函数子组件(FaCC )与高阶组件做的事情很相似, 都是对原来的组件进行了加强,类似装饰者。
FaCC,利用了react中children可以是任何元素,包括函数的特性,那么到底是如何进行增强呢?
分两步走
第一步:class FetchDataParent
import * as React from 'react'
import { get } from '../../common/fetch'
import { handleNotificate } from '@hi-ui/hiui/es/notification' export default class WithRangeData extends React.PureComponent {
constructor (props) {
super(props)
this.state = {
data: []
}
}
componentDidMount () {
// 从props中接收url,然后制作data,存入到自己的state中,具体处理逻辑,大家不用看
const { url } = this.props
get(url)
.then(res => {
if (res && res.status === 200) {
const result = []
res.data.forEach(element => {
const { status, value } = element
switch (status) {
case 0:
result.push({
name: value,
id: value
})
break
default:
}
})
this.setState({
data: result
})
} else {
handleNotificate({
type: 'erroe',
autoClose: true,
title: '请求出错',
message: `请求出错,原因:${res.message}`
})
}
})
}
render () {
const { children } = this.props
const { data } = this.state
// 这里是关键,将自己state中的值,传给children,直接执行了children(), 说明children是个函数
return <div>
{children(data)}
</div>
}
}
第二步:使用上面的父组件,
export default class AccessApply extends React.PureComponent {
render(){
// WithRangeData里的children是一个函数,接收父组件给的data,并return出自己想要的任何东西。
return (
<WithRangeData
url={`${encyclopediaUrl.getPermissionDimensionValues}?id=${range.id}`}
>
{
(data) => {
return (
<div>
<span>{range.nickname}</span>
<Select
mode='multiple'
list={data}
onChange={(item) => {
console.log('多选结果', item)
}}
/>
</div>
)
}
}
</WithRangeData>
)
}
}
总结:可以看到,函数子组件模式,也是给他的children传递一些数据,与高阶组件很相似。
然而,FaCC不会再去创建一个新的Component,而HOC会创建一个新的Component然后传递props下去。 同时,FaCC这种模式,父组件与子组件的关系比较明显,代码更易读。
高阶组件优点:有完整的生命周期。FaCC中children直接执行,无生命周期。
最后,展示一下react 函数组件如何写Facc:
const ClassNameWrapper = ({ children }) => children('demo-class')
// 使用
const HeadWithClass = (props) => (
<ClassNameWrapper>
{(class) => <header classNmae={class} ></header>}
</ClassNameWrapper>
)
参考文章:https://segmentfault.com/a/1190000016269347
react 函数子组件(Function ad Child Component)的更多相关文章
- 函数式编程与React高阶组件
相信不少看过一些框架或者是类库的人都有印象,一个函数叫什么creator或者是什么什么createToFuntion,总是接收一个函数,来返回另一个函数.这是一个高阶函数,它可以接收函数可以当参数,也 ...
- React: 有状态组件生成真实DOM结点
上次我们分析了无状态组件生成 DOM 的过程,无状态组件其实就是纯函数,它不维护内部的状态,只是根据外部输入,输出一份视图数据.而今天我们介绍的有状态组件,它有内部的状态,因此在组件的内部,可以自行对 ...
- React jQuery公用组件开发模式及实现
目前较为流行的react确实有很多优点,例如虚拟dom,单向数据流状态机的思想.还有可复用组件化的思想等等.加上搭配jsx语法和es6,适应之后开发确实快捷很多,值得大家去一试.其实组件化的思想一直在 ...
- 聊聊React高阶组件(Higher-Order Components)
使用 react已经有不短的时间了,最近看到关于 react高阶组件的一篇文章,看了之后顿时眼前一亮,对于我这种还在新手村晃荡.一切朝着打怪升级看齐的小喽啰来说,像这种难度不是太高同时门槛也不是那么低 ...
- React——高阶组件
1.在React中higher-order component (HOC)是一种重用组件逻辑的高级技术.HOC不是React API中的一部分.HOC是一个函数,该函数接收一个组件并且返回一个新组件. ...
- React笔记:组件(3)
1. 组件定义 组件是React的核心概念,组件将应用的UI拆分成独立的.可复用的模块. 定义组件的两种方式: (1)类组件:使用ES6 class (2)函数组件:使用函数 使用class定义组件的 ...
- 当初要是看了这篇,React高阶组件早会了
当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...
- React中嵌套组件与被嵌套组件的通信
前言 在React项目的开发中经常会遇到这样一个场景:嵌套组件与被嵌套组件的通信. 比如Tab组件啊,或者下拉框组件. 场景 这里应用一个最简单的Tab组件来呈现这个场景. import React, ...
- react高阶组件
高阶组件 为了提高组件复用性,在react中就有了HOC(Higher-Order Component)的概念.所谓的高阶组件,其本质依旧是组件,只是它返回另外一个组件,产生新的组件可以对属性进行包装 ...
随机推荐
- Mycat对MySQL进行垂直水平分表分库,读写分离
1. MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上.这时集中式数据库系统表现出它的不足: (1)集中 ...
- 1 小时 SQL 极速入门(二)
上篇我们说了 SQL 的基本语法,掌握了这些基本语法后,我们可以对单表进行查询及计算分析.但是一个大的系统,往往会有数十上百张表,而业务关系又错综复杂.我们要查的数据往往在好几张表中,而要从多张表中来 ...
- [Java]LeetCode117. 填充同一层的兄弟节点 II | Populating Next Right Pointers in Each Node II
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- Docker for windows : 安装Redis
一.拉取Redis镜像 docker pull hub.c..com/library/redis: 二.创建并运行Redis docker run -d -it --name redis d4f259 ...
- 本地安装MySQL详细教程
第1章 MySQL的安装与使用 1.1 MySQL安装与配置 1.1.1 MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“set ...
- Linux 的文件权限和目录配置
1.Linux文件属性 用root用户登录linux后,执行 ls -al 命令查看文件.显示如下: 文件属性示意图如下: 第一列代表这个文件的类型和权限 第一个字符代表这个文件是:目录.文件或链接文 ...
- Socket网络编程知识点
静态方法 与类无关,不能访问类里的任何属性和方法类方法 只能访问类变量属性@property 把一个方法变成一个静态属性, flight.status @status.s ...
- SpringBoot+MyBatis+MySQL读写分离
1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是依 ...
- WebApi系列~不支持put和delete请求的解决方法
回到目录 原因 由于安装了webDAV模块引起的,在web.config里的system.webserver节点,将webdav模块移动 将http请求的权限开放 实现 <system.webS ...
- Python编写守护进程程序
Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端 ...