Aentro Personal Blog

Back

react学习笔记react学习笔记

react 基础#

state同步的注意事项#

  import { useState } from 'react';
  
  export default function Clock(props) {
    const [color, setColor] = useState(props.color);
    return (
      <h1 style={{ color: color }}>
        {props.time}
      </h1>
    );
  }
plaintext

React 状态初始化机制:

useState(props.color) 仅在组件 首次渲染时 使用 props.color 的初始值 后续父组件传入的 props.color 变化时,这个初始化代码不会再执行, 造成了color和props的不同步.

可以简单的改为:

import { useState } from 'react';

export default function Clock(props) {
  return (
    <h1 style={{ color: props.color }}>
      {props.time}
    </h1>
  );
}
plaintext

不应该把组件函数的定义嵌套起来#

每次点击按钮,输入框的 state 都会消失!这是因为每次 MyComponent 渲染时都会创建一个 不同 的 MyTextField 函数。 在相同位置渲染的是不同的组件,所以 React 将其下所有的 state 都重置了。

不要在useEffect中改变state#

const [count, setCount] = useState(0);
useEffect(() => {
  setCount(count + 1);
});
plaintext

默认情况下, useEffect会在组件选然后执行, 所以会无限循环。

没看懂#

https://zh-hans.react.dev/learn/manipulating-the-dom-with-refs 深入探讨 如何使用 ref 回调管理 ref 列表

react query#

我们看一个react query的最小实现:

最小实现#

在这个最小实现中, react query实际包装和抽象了一个通用服务器请求的流程, 这个通用的流程是”创建useState, 发起请求并判断请求的状态(isPending, isError等). 如果请求成功, 将请求存入缓存(useState), 并附上一个 时间戳, 之后在这个queryKey对应的请求数据被用到时(组件重新挂载,窗口聚焦等时期)判断缓存是否过期, 如果过期则重新请求并更新缓存; 如果请求失败, 则隔一段时间继续请求;”

如果我们不用react query, 那么这个组件的实现应该是这样的:

显然, react query的实现更简洁, 更易读, 更易维护, 更易扩展(我想谁也不愿意在js里面面对一大堆useState和useEffect). 而且上面不用reactQuery的这一段代码都是复用性很高的, 因此就算不用react query, 我们也应该把这一段逻辑抽象封装起来.

同时, 由于react query的key机制, react query用起来就像一个键值对数据库. 围绕于此, react也提供了很多实用的机制: 比如减少重复的请求(在缓存中有对应key的数据时, 不会发起请求), 垃圾回收(在一条查询缓存过久(超过gcTime)没有被组件使用后, 会被自动删除),

实际使用例子#

react学习笔记
https://entropy622.github.io/blog/react%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0
Author Aentro
Published at 2025年3月28日