React 中, 为什么要用 useRef() 而不直接用一个外部变量?

2022-05-06 14:02:28 +08:00
 FaiChou

除了绑定 DOM, 发现直接找一个外部变量替代 useRef() 更方便呀? 比如:

例子 1:

function Timer() {
  const intervalRef = useRef();
  useEffect(() => {
    const id = setInterval(() => {
      // ...
    });
    intervalRef.current = id;
    return () => {
      clearInterval(intervalRef.current);
    };
  });
  // ...
}

替换成:

let _interval = null;
function Timer() {
  useEffect(() => {
    const id = setInterval(() => {
      // ...
    });
    _interval = id;
    return () => {
      clearInterval(_interval);
    };
  });
  // ...
}

例子 2:

function usePrevious(val) {
  const r = useRef();
  useEffect(() => r.current = val);
  return r.current;
}

替换成:

let _p = null;
function usePrevious(val) {
  useEffect(() => _p = val);
  return _p;
}
2063 次点击
所在节点    React
15 条回复
dengqing
2022-05-06 14:05:38 +08:00
有没有想过组件会在多个地方使用?
shakukansp
2022-05-06 14:06:34 +08:00
那你一个组件里要调 1 万个 timer 呢
ruxuan1306
2022-05-06 14:09:29 +08:00
我猜你家喜欢在楼道换鞋
FaiChou
2022-05-06 14:11:31 +08:00
@dengqing 哈哈 没考虑到 我没怎么写过项目 偶然想到这个问题
westoy
2022-05-06 14:11:56 +08:00
你不怕你写嗨了在外部变量域把这个变量一把梭哈了啊

global variables are evil 啊
FaiChou
2022-05-06 14:14:03 +08:00
@shakukansp 本来想实现一个函数 getAPublicVal() 每次调用来返回一个外部变量, 当相同 component 调用时候返回之前的外部变量. 这时候发现实现了一个 useState ..
gogogo1203
2022-05-06 14:55:29 +08:00
@shakukansp 理论上不存在, React 不推荐超过三百个 DOM Elements.
shakukansp
2022-05-06 15:00:39 +08:00
@gogogo1203
1 万个和 2 个是一样的,只要一个组件内需要多次调用 timer,那么就不能用全局变量
是这意思,和有多少 dom 没关系
gogogo1203
2022-05-06 15:03:25 +08:00
<><Timer/><Timer/></> 你就知道错了.
gogogo1203
2022-05-06 15:04:33 +08:00
@shakukansp 理解了, 我也想表达这个意思。
dany813
2022-05-06 16:35:55 +08:00
全局变量危险啊,万一在其他更改了呢
gogogo1203
2022-05-06 16:58:55 +08:00
还有一个问题就是 stale closure
DKrookie
2022-05-06 17:40:45 +08:00
虽然但是,我还是想说定义在组件外部并不是全局变量吧,模块化了除非显示的使用 window. 来定义变量,好像没法定义全局变量吧。
FaiChou
2022-05-06 21:39:08 +08:00
@DKrookie 这要看打包工具吧.
yazoox
2022-05-07 08:53:06 +08:00
@gogogo1203 有什么方法统计出来,当前打开的页面,项目中有多少个 DOM?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851164

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX