玫瑰不香

导航

react - 常用的hook API

1、usestate

1)作用

  定义一个state和一个更新state的函数(setState);

  官网:https://react.docschina.org/docs/hooks-reference.html#usestate

2)用法

const [state, setState] = useState(initialState);
initialState:
  state初始值,只有在组件初始渲染起作用;
  可选,非必填,不填时state默认值为undefined;
  类型多样,布尔Boolean、对象Object、数组Array、数字Number、空值NUll、字符串String、未定义Undefined、函数Function等;
setState:
  更新state的函数,接收一个新的 state 值并将组件的一次重新渲染加入队列。
  setState(newState);
3)备注
  
state为对象时,setState需得进行深拷贝;方法如下:
方案一:
const newState = JSON.parse(JSON.String(state)); newState.params1 = XXXX; newState.params2 = YYYY; newState.params3 = ZZZZ; setState(newState)
方案二:
state.params1 = XXXX; state.params2 = YYYY; state.params3 = ZZZZ; setState(JSON.parse(JSON.String(state)))

2、useEffect

1)作用

可以把 useEffect Hook 看做 componentDidMountcomponentDidUpdate 和 componentWillUnmount 这三个函数的组合,实际不是;

默认情况下,是在每轮渲染结束后执行;

使用场景

数据请求:useEffect(fn, []);模拟生命周期componentDidMount

监听某个props或state更新:useEffect(fn, [state]);模拟生命周期componentDidUpdate 和 componentWillUnmount 

官网:https://react.docschina.org/docs/hooks-reference.html#useeffect

2)用法

useEffect(fn, deps);

fn: 处理函数;

deps:依赖项数组;

不传: 组件的每次更新时,effect都会被重新创建订阅;
空数组[]: 只在执行一次effect,且是在组件挂载和卸载时执行;
数组[val1, val2, val3...]: 可以有单个,也可以有多个值;可以是props的值,也可以是state,同时也只能是props或state;且是在val发生更新后执行;
useEffect(() => {
    // 处理数据
    if (value) {
        doSometings(Array);
    }
}, [Array])

3、useRef

1)作用

react访问DOM的方式;

每次渲染时返回同一个可变的 ref 对象;

官网:https://react.docschina.org/docs/hooks-reference.html#useref

2)用法

const refContainer = useRef(initialValue);

initialValue: 初始值,一般为空、{}、null或undefined,具体根据情况而定;

function TextInputWithFocusButton() {
  const inputEl = useRef(null);
  const onButtonClick = () => {
    // `current` 指向已挂载到 DOM 上的文本输入元素
    inputEl.current.focus();
  };
  return (
    <div>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Focus the input</button>
    </div>
  );
}

4、useImperativeHandle

1)作用

将在使用 ref 时自定义暴露给父组件的实例值;

与 forwardRef 一起使用;

官网:https://react.docschina.org/docs/hooks-reference.html#useimperativehandle

2)用法 

useImperativeHandle(ref, createHandle, [deps]);

createHandle: 暴露给父组件的实例值

 

// 子组件
function
FancyInput(props, preProps) { const inputRef = useRef(); useImperativeHandle(preProps, () => ({ focus: () => { inputRef.current.focus(); },
  getVal: () => {
    return
inputRef.current.getValue();
  }
  }));
  return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);

// 父组件
function ParentCom(props){
  const childRef = useRef(null);
  const [state, setState] = useState();

  useEffect(() => {
    childRef.curret.getVal();
    childRef.current.focus();
  }, [state])

  return (
    <div>
      <
FancyInput ref={childRef} />
    </div>
  );
}

5、useCallback

1)作用

react性能优化,避免非必要渲染

官网:https://react.docschina.org/docs/hooks-reference.html#usecallback

2)用法

const memoizedValue = useCallback(fn, deps); 相当于 useMemo(() => fn, deps)

fn: 处理函数;

deps:依赖项数组;

该回调函数仅在某个依赖项改变时才会更新;

// 参数函数
const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

// 组件
<Component memoizedCallback={memoizedCallback} />

6、useMemo

1)作用

react性能优化,避免非必要渲染;

官网:https://react.docschina.org/docs/hooks-reference.html#usememo

 2)用法

const memoizedValue = useMemo(() => fn, deps);

fn: 处理函数

deps: 依赖项数组

3)与useCallback区别

useCallback:使用在父组件中

useMemo: 使用在子组件中

 

 

posted on 2020-10-09 00:37  布娃娃  阅读(497)  评论(0编辑  收藏  举报