react写法实例代码分析

其他教程   发布日期:2023年09月01日   浏览次数:379

这篇文章主要介绍“react写法实例代码分析”,在日常操作中,相信很多人在react写法实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react写法实例代码分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

ref的奇怪用法

这是一段初看让人很困惑的代码:

  1. function App() {
  2. const [dom, setDOM] = useState(null);
  3. return <div ref={setDOM}></div>;
  4. }

让我们来分析下它的作用。

首先,

  1. ref
有两种形式(曾经有3种):
  • 形如

    1. {current: T}
    的数据结构
  • 回调函数形式,会在

    1. ref
    更新、销毁时触发

例子中的

  1. setDOM
  1. useState
  1. dispatch
方法,也有两种调用形式:
  • 直接传递更新后的值,比如

    1. setDOM(xxx)
  • 传递更新状态的方法,比如

    1. setDOM(oldDOM => return /* 一些处理逻辑 */)

在例子中,虽然反常,但

  1. ref
的第二种形式和
  1. dispatch
的第二种形式确实是契合的。

也就是说,在例子中传递给

  1. ref
  1. setDOM
方法,会在div对应DOM更新、销毁时执行,那么
  1. dom
状态中保存的就是div对应DOM的最新值。

这么做一定程度上实现了感知DOM的实时变化,这是单纯使用

  1. ref
无法具有的能力。

useMemo的奇怪用法

通常我们认为

  1. useMemo
用来缓存变量
  1. props
  1. useCallback
用来缓存函数
  1. props

但在实际项目中,如果想通过缓存props的方式达到子组件性能优化的目的,需要同时保证:

  • 所有传给子组件的

    1. props
    的引用都不变(比如通过
    1. useMemo
  • 子组件使用

    1. React.memo

类似这样:

  1. function App({todos, tab}) {
  2. const visibleTodos = useMemo(
  3. () => filterTodos(todos, tab),
  4. [todos, tab]);
  5. return <Todo data={visibleTodos}/>;
  6. }
  7. // 为了达到Todo性能优化的目的
  8. const Todo = React.memo(({data}) => {
  9. // ...省略逻辑
  10. })

既然

  1. useMemo
可以缓存变量,为什么不直接缓存组件的返回值呢?类似这样:
  1. function App({todos, tab}) {
  2. const visibleTodos = useMemo(
  3. () => filterTodos(todos, tab),
  4. [todos, tab]);
  5. return useMemo(() => <Todo data={visibleTodos}/>, [visibleTodos])
  6. }
  7. function Todo({data}) {
  8. return <p>{data}</p>;
  9. }

如此,需要性能优化的子组件不再需要手动包裹

  1. React.memo
,只有当
  1. useMemo
依赖变化后子组件才会重新
  1. render

以上就是react写法实例代码分析的详细内容,更多关于react写法实例代码分析的资料请关注九品源码其它相关文章!