react hook的学习(该篇只是为了下一篇关于jest对react hook的测试的基础)

https://zh-hans.reactjs.org/docs/hooks-overview.html react官方文档

react hook主要分为state hook和effect hook.

1 state hook

   和class组件里面的this.state类似,都是存储数据的地方,而且可以附上初始值.而且他同时提供了操作数据的行为.如下图,从官网上抄来的:

   

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>
  );
}

在这里我有一个疑问,如果一个页面初始化的数据很多,那么岂不是要写很多userState,先放着,以后再解决

ps:  淦,官网有解决方法,就是放个对象,但是不推荐使用

https://zh-hans.reactjs.org/docs/hooks-faq.html#should-i-use-one-or-many-state-variables

 

2 effect hook

   官网说的也挺清楚地 ,  我们用了函数组件,那么一些生命周期函数就使用不了了,他是componentDidMount,componentDidUpdate,componentWillUnmounted的集合,代码如下:

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

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

  // 相当于 componentDidMount 和 componentDidUpdate:
  useEffect(() => {
    // 使用浏览器的 API 更新页面标题
    document.title = `You clicked ${count} times`;
  });

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

3 自定义hook

  在我看来,这更是hook对函数式编程的体现,很像写一个共有的函数逻辑,给多个组件使用,只是在里面使用了useEffect和UserState.看代码

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

function useFriendStatus(friendID) {
  const [isOnline, setIsOnline] = useState(null);

  function handleStatusChange(status) {
    setIsOnline(status.isOnline);
  }

  useEffect(() => {
    ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
    };
  });

  return isOnline;
}
function FriendStatus(props) {
  const isOnline = useFriendStatus(props.friend.id);

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}
function FriendListItem(props) {
  const isOnline = useFriendStatus(props.friend.id);

  return (
    <li style={{ color: isOnline ? 'green' : 'black' }}>
      {props.friend.name}
    </li>
  );
}

4 hook使用规则

  在最外层调用,不要再条件判断或者函数里面使用.

上一篇:2021-04-12


下一篇:useState原理解析