Article August 11, 2020

重学React(三)

Words count 4.1k Reading time 4 mins. Read count 0

前言

终于到了期盼已久的HOOK环节了,我最初学react的时候是版本为15.4.2(特地去看了react仓库看了更新日志)算是很早的学习,可惜自己学的东西在工作中实践不了,当时也刚参加工作,又推动不了新技术的落地。无奈过段时间就忘了。计算机技术只有不断敲,看了用不到7天内就会忘得差不多了。当时看到class组件的时候觉得帅呆了,因为那时es6正当时,看到很多人都是使用jsx语法,class声明组件等等,觉得自己赶上了好时机。后来情况就是用不到放弃了,虽然用不到但是平时关注一些新的技术,react HOOK 发布时,也看了一些文章,一些大佬也推荐使用hook的语法写react,到了现在版本16.13.1,我才开始真正接触HOOK

根据官网的介绍:

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性

Hook的三个特性

  • 完全可选的
  • 100%向后兼容的
  • 现在就用

使用Hook的动机

具体介绍
1.在组件之间复用状态逻辑很难

2.复杂组件变得难以理解

3.难以理解的 class

使用State Hook

// demo

import React, { useState } from 'react';

function Example() {
  // 声明一个叫 "count" 的 state 变量
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
};

// 等价class组件

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}

在函数组件中,我们没有 this,所以我们不能分配或读取 this.state。

使用Effect Hook

Effect Hook 可以让你在函数组件中执行副作用操作

import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  // Similar to componentDidMount and componentDidUpdate:
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

有些副作用可能需要清除,所以需要返回一个函数:

useEffect(() => {
  function handleStatusChange(status) {
    setIsOnline(status.isOnline);
  }

  ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
  return () => {
    ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
  };
});

其他的 effect 可能不必清除,所以不需要返回。

useEffect(() => {
  document.title = `You clicked ${count} times`;
});

Hook的规则

1.只在最顶层使用 Hook

不要在循环,条件或嵌套函数中调用 Hook, 确保总是在你的 React 函数的最顶层调用他们。

2.只在 React 函数中调用 Hook

不要在普通的 JavaScript 函数中调用 Hook

可以在:

  • 在 React 的函数组件中调用 Hook
  • 在自定义 Hook 中调用其他 Hook

FAQ

更多

为什么要在 effect 中返回一个函数?
这是 effect 可选的清除机制。每个 effect 都可以返回一个清除函数。如此可以将添加和移除订阅的逻辑放在一起。它们都属于 effect 的一部分。

React 何时清除 effect?
React 会在组件卸载的时候执行清除操作。正如之前学到的,effect 在每次渲染的时候都会执行。

0%