本文从属于React入门与最佳实践中的React组件基础

前文介绍的组件的定义方式主要是声明式组件,其与传统的jQuery中以DOM操作为核心的命令式组件生成相比具有更大的灵活性与可组合性。而实际上随着应用复杂度与所需要的组件数目的持续增加,我们所需要的组件也会被划分为很多的类型。从组件组合的角度或者所谓动态组件的角度来看,常见的即是HOC模式,即将某个组件作为另一个组件的Props或者子组件从而封装出高阶组件。还有另一种偏向函数式的模式即是构造出函数式组件,就好像Arrow Function一样,对于无状态的简单组件,使用函数式组件的方式声明,会使得代码的可读性更好,并且减少冗余代码的数目。在React本身对于界面的抽象可以用View = f(props),即纯粹的界面的渲染函数可以近似看做纯函数。函数式组件与基于Class声明的组件相比,其具有以下特性:

  • 不需要声明类,可以避免大量的譬如extends或者constructor这样的代码

  • 不需要显示声明this关键字,在ES6的类声明中往往需要将函数的this关键字绑定到当前作用域,而因为函数式声明的特性,我们不需要再强制绑定:


onClick={this.sayHi.bind(this)}>Say Hi</a>
onClick={sayHi}>Say Hi</a>
  • 贯彻最佳实践,在React组件复用与组合中我们会提到,应当避免在底层的展示性组件中混入对于状态的管理,而应该将状态托管于某个高阶组件或者其他的状态容器中。利用函数式声明组件可以彻底保证不会在组件中进行状态操作。

  • 易于理解与测试

  • 更佳的性能表现:因为函数式组件中并不需要进行生命周期的管理与状态管理,因此React并不需要进行某些特定的检查或者内存分配,从而保证了更好地性能表现。

最后,通过下图的对比,可以看出函数式组件声明方法的简洁性:

Usage:使用

这里我们定义一个简单的Text组件:


class Text extends React.Component {render() {return <p>{this.props.children}</p>;}}React.render(<Text>Hello World</Text>, document.body);

上面定义的Text组件可以看做典型的Pure Components,或者说是Dummy Components,即好像函数式编程中的纯函数一样,输出完全由输入的Props决定,并且不会产生任何的副作用。这种类型的组件会在我们的应用中占据很大的份额,而在React 0.14之后也允许我们以类似于定义函数的方式来定义这种无状态组件,如下所示:


const Text = (props) =><p>{props.children}</p>;
// ReactDOM is part of the introduction of React 0.14
ReactDOM.render(<Text>Hello World</Text>, document.querySelector('#root')
);

这种模式主要是鼓励在大型项目中尽可能地以简单的写法来分割原本庞大的组件,而未来React也会面向这种无状态的组件在譬如避免无意义的检查或者内存分配领域进行一些专门的优化。这种无状态函数式组件的写法也是支持设置默认的Props类型与值的:


const Text = ({ children }) => <p>{children}</p>
Text.propTypes = { children: React.PropTypes.string };
Text.defaultProps = { children: 'Hello World!' };

我们也可以利用ES6默认函数参数的方式来设置默认值:


const Text = ({ children = 'Hello World!' }) =><p>{children}</p>

另外,在无状态的组件函数中,我们也是可以访问Context的:


const Text = (props, context) =><p style={context}>props.children</p>;
Text.contextTypes = {fontFamily: React.PropTypes.string
};
class App extends React.Component {static childContextTypes = {fontFamily: React.PropTypes.string}getChildContext() {return {fontFamily: 'Helvetica Neue'};}render() {return <Text>Hello World</Text>;}
}

React中函数式声明组件相关推荐

  1. react封装函数_React中函数式声明组件

    前文介绍的组件的定义方式主要是声明式组件,其与传统的jQuery中以DOM操作为核心的命令式组件生成相比具有更大的灵活性与可组合性.而实际上随着应用复杂度与所需要的组件数目的持续增加,我们所需要的组件 ...

  2. 如何在React中从其父组件更改子组件的状态

    by Johny Thomas 约翰尼·托马斯(Johny Thomas) 如何在React中从其父组件更改子组件的状态 (How to change the state of a child com ...

  3. [react] 在react中怎样改变组件状态,以及状态改变的过程是什么?

    [react] 在react中怎样改变组件状态,以及状态改变的过程是什么? 使用this.setState改变组件的状态 改变的过程中,React Fiber Reconciler遍历了整个Fiber ...

  4. [react] 描述下在react中无状态组件和有状态组件的区别是什么?

    [react] 描述下在react中无状态组件和有状态组件的区别是什么? 1,无状态组件主要用来定义模板,接收来自父组件props传递过来的数据,使用{props.xxx}的表达式把props塞到模板 ...

  5. [react] 在react中无状态组件有什么运用场景

    [react] 在react中无状态组件有什么运用场景 适用于逻辑简单的纯展示的场景,如资料卡片等 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主 ...

  6. react中创建一个组件_如何使用React和MomentJS创建一个Countdown组件

    react中创建一个组件 Recently I had to create a Countdown for one of my other projects, and I thought that i ...

  7. React中的纯组件

    React中的纯组件 React提供了一种基于浅比较模式来确定是否应该重新渲染组件的类React.PureComponent,通常只需要继承React.PureComponent就可以定义一个纯组件. ...

  8. react中函数式组件React Hooks

    React Hooks 函数式组件 使用hooks理由 高阶组件为了复用,导致代码层级复杂 生命周期的复杂 写成functional组件,无状态组件,因为需要状态,又改成了class,成本高 在16. ...

  9. 如何在React中使用功能组件

    Have you wondered how to create a component in React? 您是否想过如何在React中创建组件? To answer, it is as simple ...

  10. react中使用angular组件,react中使用定时器

    react native 可以使用typescript开发吗 最近在公司正在用Spacemacs+TypeScript写ReactNative.总体来讲依靠各种补全和纠错,效率还是比不用TypeScr ...

最新文章

  1. [笔记].如何使用Nios II的中断:PIO中断与定时器中断
  2. redis-4.0.1安装配置(CentOS 6.6)
  3. python可以做什么有趣的东西-Python 里itchat 模块能实现什么有趣的东西?
  4. 黄金票据(Golden Ticket)的原理与实践
  5. scrapy爬取汽车之家宝马5系图片
  6. 吐嘈OpenCV的图像旋转功能 _7
  7. 支付宝回应老年版相互宝质疑:5万、10万互助金额度是合理区间
  8. 练习4.1 根据后序和中序遍历输出先序遍历 (25 分)
  9. 在PreferenceScreen加入自定义布局
  10. IDEA的快捷键与qq的冲突了怎么办
  11. 信息系统项目管理师必背核心考点(四十)干系人管理
  12. 【经典算法题】用两个鸡蛋和100层的楼来测鸡蛋硬度
  13. 浅谈光耦电路在开关量采集电路中的设计
  14. 重复读取输入流InputStream
  15. 今日头条怎么赚钱?头条号的赚钱思路
  16. 一个动态ACL的案例
  17. 饥荒机器人怎么用避雷针充电_饥荒科学避雷针怎么合成
  18. Crossed Ladders 计算几何
  19. JAVA扫码点餐(4)-遗留问题
  20. BGP以及BGP对等体之间的交互原则

热门文章

  1. URL提交之前对数据编码
  2. Web.config中用customErrors可以自定义默认的出错页面
  3. swift 高级进阶1:类与结构体(上)
  4. Android Studio .jar 包的引用方式(导入方式)
  5. 2012服务器在IIS部署的SLL(https)网址谷歌浏览器无法访问的问题解决
  6. Nginx笔记总结十一:Nginx重写规则指南
  7. 基于Tight VNC的远程协助功能的实现
  8. 让 Windows 的 R 用上 CUDA
  9. tidyverse —— forcats包
  10. ESP8266—“ICACHE_FLASH_ATTR”宏——解释含义