博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么要使用React Hooks?(5分钟实例)
阅读量:5952 次
发布时间:2019-06-19

本文共 2002 字,大约阅读时间需要 6 分钟。

前言

React Hooks在React v16.8正式稳定版中加入。

Hooks是什么?

  1. React Hooks 就是让你不必写class组件就可以用state和其他的React特性;
  2. 你也可以编写自己的hooks在不同的组件之间复用;

最近很多人都在谈论 React Hooks。当使用React类组件那么久,使用React hooks需要一些观念转变。React官方团队明确表示他们将会据需支持类组件,那为什么还要使用React Hooks呢?

接下来是一个5分钟的例子将你带入hooks,让我们一起了解吧。

例子

我们的例子是 一个按钮带有是否激活状态,当点击的时候切换颜色。

开始

我们有一个简单的按钮组件,我们想让他变的简单,所以写了一个功能函数:

const Button = props => {    return (        
{props.text}
)}复制代码

我们可以传递自定义的 onClick 事件 和 text属性。

但是,如果我们想要当按钮激活改变其颜色要怎么办? 假如,我们已经有100个组件用了这个按钮,我们不想再加其他属性,颜色属性让按钮自己控制也足够简单。

转换到类

唯一的问题是我们将会需要一些状态。假设现在在hooks出现之前,我们只能将其转换成class,才能控制state。

class ButtonWithClass extends React.Component {    state = {        active: false    };        render() {        return (            
onClick={() => { this.setState({active: !this.state.active}); this.props.onClick(); }} > {this.props.text}
) }}复制代码

我们有一个完全重写的组件,加了2倍的代码行,我们想要的只是一点状态。你的代 码 PR 校验人会看到很多红色和绿色的git修改明细。没有人会喜欢圣诞主题的红绿色Pull Request。

Hooks将会拯救你!

添加Hooks

当我们用React Hooks执行完全相同的操作时会发生什么:

import React, {useState} from 'react';        const ButtonWithHooks = props => {      const [active, setActive] = useState(false); // ***            return (        
{ setActive(!active); // *** props.onClick(); }} > {props.text}
) };复制代码

这个组件,我们没有重写任何东西。我们做的就是添加了一点行数 并更新了 onCLick 函数,我们得到了与class版本相同的结果。我们的PR 查看者会开心,添加state只需下面这一行: const [active setActive] = useState(fasle);

重构

但是等等,为什么按钮控制自己的状态?我们改变下,我们想让那个组件简单让我们看起来聪明。 我们让 active 变成一个被父组件控制的prop。没问题,用React Hooks 仅移处带**的两行 和 带号的那一行的一部分。

如此简单,但是class装换成function会更复杂。

当你把组件装换成函数时,你可能很受挫。查看你代码的人又变成另外一个红绿色。即使实际的变化很小你将会感到很沮丧。

总结

React Hooks 让你的功能函数作为一个函数,并挂钩到React 特定功能。这就是他,如此简单如此强大。这是React Hooks的一些好处(大多数已经覆盖到了,我只想分享我认为收益最明显的地方)

  1. 重写不用移处或添加state,仅删除、添加行
  2. 用useEffects不用记生命周期方法
  3. 不像class组件的state可自定义和跨组件重用。
  4. 更干净的代码
  5. 没有重大变化

转载于:https://juejin.im/post/5cfdba4be51d4577596486d1

你可能感兴趣的文章
做错的题目——给Array附加属性
查看>>
Url.Action取消字符转义
查看>>
JQuery选择器大全
查看>>
Gamma阶段第三次scrum meeting
查看>>
python3之装饰器修复技术@wraps
查看>>
[考试]20150606
查看>>
Javascript_备忘录5
查看>>
Can’t create handler inside thread that has not called Looper.prepare()
查看>>
敏捷开发方法综述
查看>>
Hadoop数据操作系统YARN全解析
查看>>
Django 运行报错 ImportError: No module named 'PIL'
查看>>
修改数据库的兼容级别
查看>>
Windows下同时安装两个版本Jdk
查看>>
uoj#228. 基础数据结构练习题(线段树)
查看>>
JS键盘事件监听
查看>>
ios开发周期之--(向上,向下,四舍五入)取整
查看>>
加油!
查看>>
拦截导弹问题(动态规划)
查看>>
iOS 单元测试(Unit Test 和 UI Test)
查看>>
[linux小技巧]
查看>>