2019-08-24 07:00:00 文摘资讯 阅读数 1364  收藏
 
 

之前我们已经掌握了useState的使用,在 class 中,我们通过在构造函数中设置 this.state 为 { count: 0 } 来初始化 count state 为 0

  1.  
    class Example extends React.Component {
  2.  
    constructor(props) {
  3.  
    super(props);
  4.  
    this.state = {
  5.  
    count: 0
  6.  
    };
  7.  
    }

在函数组件中,我们没有 this,所以我们不能分配或读取 this.state。我们直接在组件中调用 useState Hook:

  1.  
    import React, { useState } from 'react';
  2.  
     
  3.  
     
  4.  
    function Example() {
  5.  
    // 声明一个叫 “count” 的 state 变量
  6.  
    const [count, setCount] = useState(0);

既然我们知道了 useState 的作用,那么掌握 useEffect 就更容易,函数组件中没有生命周期,那么可以使用 useEffect 来替代。如果你熟悉 React class 的生命周期函数,你可以把 useEffect Hook 看做 componentDidMountcomponentDidUpdate 和 componentWillUnmount 这三个函数的组合。

  1.  
    class Example extends React.Component {
  2.  
    constructor(props) {
  3.  
    super(props);
  4.  
    this.state = {
  5.  
    count: 0
  6.  
    };
  7.  
    }
  8.  
    componentDidMount() {
  9.  
    document.title = `You clicked ${this.state.count} times`;
  10.  
    }
  11.  
    componentDidUpdate() {
  12.  
    document.title = `You clicked ${this.state.count} times`;
  13.  
    }
  14.  
    render() {
  15.  
    return (
  16.  
    <div>
  17.  
    <p>You clicked {this.state.count} times</p>
  18.  
    <button onClick={() => this.setState({ count: this.state.count + 1 })}>
  19.  
    Click me
  20.  
    </button>
  21.  
    </div>
  22.  
    );
  23.  
    }
  24.  
    }

使用 Hook 的示例

  1.  
    import React, { useState, useEffect } from 'react';
  2.  
     
  3.  
     
  4.  
    function Example() {
  5.  
    const [count, setCount] = useState(0);
  6.  
     
  7.  
     
  8.  
    useEffect(() => {
  9.  
    document.title = `You clicked ${count} times`;
  10.  
    });
  11.  
     
  12.  
     
  13.  
    return (
  14.  
    <div>
  15.  
    <p>You clicked {count} times</p>
  16.  
    <button onClick={() => setCount(count + 1)}>
  17.  
    Click me
  18.  
    </button>
  19.  
    </div>
  20.  
    );
  21.  
    }

默认情况下,它在第一次渲染之后和每次更新之后都会执行。你可能会更容易接受 effect 发生在“渲染之后”这种概念,不用再去考虑“挂载”还是“更新”。React 保证了每次运行 effect 的同时,DOM 都已经更新完毕。

数据获取,设置订阅以及手动更改 React 组件中的 DOM 都属于副作用。有些副作用可能需要清除,所以需要返回一个函数,比如挂载时设置定时器,卸载时取消定时器。

  1.  
    class Example extends Component {
  2.  
    constructor (props) {
  3.  
    super(props);
  4.  
    this.state = {
  5.  
    count: 0
  6.  
    }
  7.  
    }
  8.  
    componentDidMount() {
  9.  
    this.id = setInterval(() => {
  10.  
    this.setState({count: this.state.count + 1})
  11.  
    }, 1000);
  12.  
    }
  13.  
    componentWillUnmount() {
  14.  
    clearInterval(this.id)
  15.  
    }
  16.  
    render() {
  17.  
    return <h1>{this.state.count}</h1>;
  18.  
    }
  19.  
    }

使用 Hook 的示例

  1.  
    function Example() {
  2.  
    const [count, setCount] = useState(0);
  3.  
     
  4.  
     
  5.  
    useEffect(() => {
  6.  
    const id = setInterval(() => {
  7.  
    setCount(c => c + 1);
  8.  
    }, 1000);
  9.  
    return () => clearInterval(id);
  10.  
    }, []);
  11.  
     
  12.  
     
  13.  
    return <h1>{count}</h1>
  14.  
    }

你可以通知 React 跳过对 effect 的调用,只要传递数组作为 useEffect 的第二个可选参数即可,如果想执行只运行一次的 effect(仅在组件挂载和卸载时执行),可以传递一个空数组([])作为第二个参数。这就告诉 React 你的 effect 不依赖于 props 或 state 中的任何值,所以它永远都不需要重复执行。

通过跳过 Effect 进行性能优化,在某些情况下,每次渲染后都执行清理或者执行 effect 可能会导致性能问题。在 class 组件中,我们可以通过在 componentDidUpdate 中添加对 prevProps 或 prevState 的比较逻辑解决:

  1.  
    componentDidUpdate(prevProps, prevState) {
  2.  
    if (prevState.count !== this.state.count) {
  3.  
    document.title = `You clicked ${this.state.count} times`;
  4.  
    }
  5.  
    }

这是很常见的需求,所以它被内置到了 useEffect 的 Hook API 中。如果某些特定值在两次重渲染之间没有发生变化,你可以通知 React 跳过对 effect 的调用,只要传递数组作为 useEffect 的第二个可选参数即可:

  1.  
    useEffect(() => {
  2.  
    document.title = `You clicked ${count} times`;
  3.  
    }, [count]); // 仅在 count 更改时更新

你已经学习了 State Hook 和 Effect Hook,将它们结合起来你可以做很多事情了。它们涵盖了大多数使用 class 的用例。

 

React中useEffect使用的更多相关文章

  1. React中useEffect的简单使用

    学习hooks 在 React 的世界中, 组件有函数组件和类组件 UI 组件我们可以使用函数,用函数组件来展示 UI. 而对于容器组件,函数组件就显得无能为力. 我们依赖于类组件来获取数据,处理数据 ...

  2. React 中阻止事件冒泡的问题

    在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...

  3. 哪种方式更适合在React中获取数据?

    作者:Dmitri Pavlutin 译者:小维FE 原文:dmitripavlutin.com 国外文章,笔者采用意译的方式,以保证文章的可读性. 当执行像数据获取这样的I/O操作时,你必须发起获取 ...

  4. React的useEffect与useLayoutEffect执行机制剖析

    引言 useEffect和useLayoutEffect是React官方推出的两个hooks,都是用来执行副作用的钩子函数,名字类似,功能相近,唯一不同的就是执行的时机有差异,今天这篇文章主要是从这两 ...

  5. 解读vue-server-renderer源码并在react中的实现

    前言 ​ 在博客开发的过程中,有这样一个需求想解决,就是在SSR开发环境中,服务端的代码是是直接通过webpack打包成文件(因为里面包含同构的代码,就是服务端与客户端共享前端的组件代码),写到磁盘里 ...

  6. react中使用截图组件Cropper组件

    --最近项目用react,学习react并使用cropper组件裁剪图片. (这里开发组件不够统一有用tsx(TypeScript + xml/html)写的组件,有用jsx(javascript+x ...

  7. React报错之React Hook useEffect has a missing dependency

    正文从这开始~ 总览 当useEffect钩子使用了一个我们没有包含在其依赖数组中的变量或函数时,会产生"React Hook useEffect has a missing depende ...

  8. React报错之React Hook 'useEffect' is called in function

    正文从这开始~ 总览 为了解决错误"React Hook 'useEffect' is called in function that is neither a React function ...

  9. 理解React中es6方法创建组件的this

    首发于:https://mingjiezhang.github.io/(转载请说明此出处). 在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的. 从react中的 ...

随机推荐

  1. Redis内存数据库在Exchange会议室的整体应用架构

    注:本文是别人写的,感觉写得很好就转过来,版权归原作者所有哦,谁知道出处可以告诉我,谢谢. 根据以上的会议室应用现状分析,该架构的核心是把历史发生的会议室申请数据定时同步到Redis内存数据库中,对于 ...

  2. Anaconda创建环境失败,提示无法定位程序输入点

    https://blog.csdn.net/qq_37465638/article/details/100071259 这篇博客写得很清楚,是anaconda下Library下lib下的一个文件和DD ...

  3. 每天学点HTML01

    HTML背景 HTML 又叫超文本标记语言 ,诞生于20世纪90年代初 <html> <head><title>demo1</title> </h ...

  4. openstack在controller节点使用openstack network agent list不显示计算节点

    问题描述: 做完计算节点neutron的相关配置后,在controller节点查看agent列表,结果如下 发现并没有compute节点 在计算节点上查看status显示failed 在查看日志文件/ ...

  5. Eclipse alt+/语法不提示的解决方法

    最近公司电脑上的Eclipse没有了自动提示功能,也不是全部不提示,大多数情况下按下“alt+/”键还会产生提示,但是当我在java项目中邪main方法和syso的时候,“alt+/”则会失效,今天在 ...

  6. 高阶组件&&高阶函数(一)

    antd里面的form表单方面,遇到一个高阶函数,以及高阶组件,于是看了一下这方面内容,前辈们的文章写得也非常详细,这里就稍微kobe一下 高阶函数与高阶组件 高阶函数: 高阶函数,是一种特别的函数, ...

  7. [译]Vulkan教程(29)组合的Image采样器

    [译]Vulkan教程(29)组合的Image采样器 Combined image sampler 组合的image采样器 Introduction 入门 We looked at descripto ...

  8. 《2019年小米春季上海 PHP 实习生招聘面试题》部分答案解析

    1 丶 Nginx 怎么实现负载均衡 这个还是比较简单 1.轮询 这种是默认的策略,把每个请求按顺序逐一分配到不同的 server,如果 server 挂掉,能自动剔除. 2.最少连接 把请求分配到连 ...

  9. nlohmann 最优秀的C++序列化工具库 详细入门教程

    本文首发于个人博客https://kezunlin.me/post/f3c3eb8/,欢迎阅读最新内容! tutorial to use nlohmann json for serializing d ...

  10. 深蓝词库转换2.5发布——支持微软五笔,支持Linux和macOS和更多命令行功能

    最近利用晚上的时间,对很久没有新版本发布的深蓝词库转换进行了版本升级.本次升级主要包含的功能包括: 一.支持Win10自带的微软五笔输入法用户自定义短语的导入导出. 1.在转换输入法词库列表中选择“W ...