理解React hooks常用方法useState, useEffect, useMemo, useCallback, useContext

所在项目一直使用ReactNative的 0.58, 积累了大量的业务代码, 

因此一直没有使用React和ReactNative推出的hooks方法编写.

现在自己学习理解一下.

useState

  针对每个state的值设置一组value/setValue.
  值不变的set不会重复触发render.

  const [count, setCount] = useState(0);
  <p>You clicked {count} times</p>                 // 获取count值
  <button onClick={() => setCount(count + 1)}>     // 通过setCount设置
    Click Me
  </button>

useEffect

  > 生命周期回调: 
    返回值: 可返回一个函数用于消除副作用.
    以生命周期来解释Effect:
      1. Mount: 运行第一次 effect
      2. Update: 清除上一个 effect, 运行下一个 effect   (update可发生多次)
      3. Unmount: 清除最后一个 effect

  > 第二个参数可填一个数组, 也可以不填.
    表示某几个state中有一个变化, 就触发update的Effect调用.

    useEffect(() => {
      if (!oldTitle) oldTitle = document.title;            // 记下原标题
      document.title = `You clicked ${count} times`;       // 副作用, 更改标题
      return function cleanup() {
        document.title = oldTitle;                         // 消除副作用, 还原标题    
      };
    }, [count]);                                           // count变化才触发, 可不填

useContext

  context可以用于跨越多层传递参数, 
  在多层情况下, 相比props一层一层的传递更有效.

  const themes = {                                                          // 创建两组主题样式
    light: { color: "#000000", background: "#eeeeee" },
    dark: { color: "#ffffff", background: "#222222" }
  };
  const ThemeContext = React.createContext(themes.light);                   // 创建Context的类型
  <ThemeContext.Provider value={count % 2 ? themes.dark : themes.light}>    // 建Context节点
    <ThemedButton />
  </ThemeContext.Provider>
  function ThemedButton() {
    const theme = useContext(ThemeContext);
    return <button style={theme}>styled by context!</button>;
  }

useReducer

  替换useState, 类似redux的用法和功能.

  const initialState = {count: 0};                                  // state初始值
  function reducer(state, action) {                                 // reducer处理dispatch
    switch (action.type) {
      case 'increment': return {count: state.count + 1};            // 生成新的state
      default: throw new Error();
    }
  }
  const [state, dispatch] = useReducer(reducer, initialState);      // userReducer返回state,dispatch
  state.count                                                       // 使用state中的value
  <button onClick={() => dispatch({type: 'decrement'})}>-</button>  // 使用dispatch

useRef

访问节点的ref对象

  function TextInputWithFocusButton() {
    const inputEl = useRef(null);                          // 创建初始null的ref
    return <>
      <input ref={inputEl} type="text" />                  // 获取ref
      <button onClick={() => {
        inputEl.current.focus();                           // 使用ref对象的函数
      }}>Focus</button>
    </>
  }

userCallback

数据变化才更新, 比对第二个参数

  const renderButton = useCallback(
    () => <Button > {xxx} </Button>,
    [xxx]
  );

useMemo

数据变化才做调用, 避免不必要的执行大量计算, 比对第二个参数

  const result = useMemo(
  () => {
    ...         // 大量计算
  }, [xxx]);

参考链接

https://react.docschina.org/docs/hooks-reference.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:在React中,memo是一个高阶组件,用于优化函数组件的性能。它类似于React.PureComponent,通过对内部对象进行浅比较来判断是否重新渲染组件。\[2\]useEffectReact提供的一个Hook函数,用于在函数组件中执行副作用操作。它可以在组件渲染完成后执行一些异步操作,比如发送网络请求、订阅事件等。\[3\]useMemoReact提供的另一个Hook函数,用于在函数组件中进行性能优化。它可以缓存计算结果,避免重复计算,类似于Vue中的computed属性。\[1\]useRef是React提供的一个Hook函数,用于在函数组件中创建一个可变的引用。它可以用来保存组件的状态,或者获取DOM元素的引用。\[1\]useStateReact提供的一个Hook函数,用于在函数组件中创建一个可变的状态。它返回一个数组,第一个元素是当前的状态值,第二个元素是更新状态的函数。 所以,react memo用于优化函数组件的性能,useEffect用于执行副作用操作,useMemo用于缓存计算结果,useRef用于创建可变的引用,useState用于创建可变的状态。 #### 引用[.reference_title] - *1* *2* [useMemo,memo,useRef等相关hooks详解](https://blog.csdn.net/weixin_44441196/article/details/117328033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [一文轻松掌握react-hook(useState、useReducer、useEffectuseCallbackuseMemo、useRef、useContext...)](https://blog.csdn.net/u010074572/article/details/105176653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值