react-Hook

Tip: hook使用规则:

1.只能在函数最外层调用 Hook。不要在循环、条件判断或者子函数中调用

2.只能在 React 的函数组件中调用 Hook。不要在其他 JavaScript 函数中调用。(或者自定义hook)

1.useState : [count,setCount] = useState(0);

更新state没次都是合并上一次的数据( 不会自动合并),class类组件中的this.setState更新是替换上一次的数据

改变时不会同步的拿到改变的数据,解决办法:使用useRef(const countRef = useRef(count))取值是获取countRef.current;

定义的state数据如果渲染了一次组件之后就不会重新渲染,可以给组件加key解决

useState使用时可以结合useImmer一起使用效果更佳!

2.useEffect:三种使用方法

useEffect 类似 componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个函数的组合。

而useLayoutEffect更加类似componentDidMount

可以通过return清除操作,每次实行新的Effect的时候会先处理上一次的Effect。

1.useEffect(()=>{})

每次渲染组件或者更新组件都会执行

2.useEffect(()=>{},['变量'])

监听参数变化,有变化执行

3.useEffect(()=>{},[])

组件初次加载执行一次

3.自定义hook:

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

将friendID作为参数返回isOnline

在两个独立的组件中分别使用,两个组件的state是独立的:
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>
  );
}
一般使用名字使用“use”开头并调用其他hook,我们就说这是一个自定义hook

4.useMemo 计算结果是return返回的值, 会缓存结果值 在组件渲染是执行的函数类似 shouldComponentUpdate,不要在里面写更改state和一些副作用(Effect)操作,可能会死循环。

const name_new = useMemo((

return name;

)=>{},[name])

5.useCallBack 计算结果是 func 主要用于缓存函数(同useMemo类似)

const name_new = useCallback((

console.log("name发生变化我才会变")

)=>{},[name])

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。