英文:
Why does 'useRef' exist? What's it intended for?
问题
I recently ran into a problem in a project I didn't create, where I needed to collect renders from child elements for the purpose of pooling them before querying a server.
The intent was to prevent a full UI refresh, which requires querying the server, after each user interaction. So I pooled them until the user stopped making changes for a short moment and then query the server.
Initially I used useState
because I'm still very new to React and it was all I knew of, besides useEffect
.
So I was quite confused when everything broke afterwards. "Broke" meaning that after any interaction was "pooled" a render happened, and it took quite a while to find out that useState
caused that.
The render was a problem because the parent element didn't have the updated state of the children at that point yet so it rendered them wrong. The child elements rendered themselves fine, which is why I needed to prevent the parent's render.
So I was looking for an alternative that would not cause a render on each update. Which made me eventually run into useRef
.
Except that useRef
not only doesn't cause a render, it also doesn't cause a dependency trigger...
At which point I'm confused and wonder why I should use it at all, because at that point it's a bothersome way of using a normal variable.
<var>.current =
vs <var> =
I thought the whole point of React was the dependency chain, and with useRef
not supporting that I'm at a loss why it exists...
Which is why I'd appreciate if anyone could explain to me or link me an explanation (except the official docs, already read that, still don't get it), why useRef
is that way, and why I shouldn't just use a "normal" variable instead.
PS: I don't need a solution to the initial problem, I've by now worked around the lack of dependency updates. This is just for understanding and the situation that led into the confusion.
英文:
I recently ran into a problem in a project I didn't create, where I needed to collect renders from child elements for the purpose of pooling them before querying a server.
The intent was to prevent a full UI refresh, which requires querying the server, after each user interaction. So I pooled them until the user stopped making changes for a short moment and then query the server.
Initially I used useState
because I'm still very new to React and it was all I knew of, besides useEffect
.
So I was quite confused when everything broke afterwards. "Broke" meaning that after any interaction was "pooled" a render happened, and it took quite a while to find out that useState
caused that.
The render was a problem because the parent element didn't have the updated state of the children at that point yet so it rendered them wrong. The child elements rendered themselves fine, which is why I needed to prevent the parent's render.
So I was looking for an alternative that would not cause a render on each update. Which made me eventually run into useRef
.
Except that useRef
not only doesn't cause a render, it also doesn't cause a dependancy trigger...
At which point I'm confused and wonder why I should use it at all, because at that point it's a bothersome way of using a normal variable.
<var>.current =
vs <var> =
I thought the whole point of React was the dependancy chain, and with useRef
not supporting that I'm at a loss why it exists...
Which is why I'd appreaciate if anyone could explain to me or link me an explaination (except the official docs, already read that, still don't get it), why useRef
is that way, and why I shouldn't just use a "normal" variable instead.
PS: I don't need a solution to the initial problem, I've by now worked around the lack of dependancy updates. This is just for understanding and the situation that led into the confusion.
答案1
得分: 2
useRef
不同于 React 中使用 useState
管理的正常状态变量。useState
用于存储会在更新时引起重新渲染的状态,而 useRef
用于存储可变值,可以在渲染之间保持不变而不引起重新渲染。
useRef
在以下情况下很有用:
-
访问 DOM 元素:通常用于创建对 DOM 元素的引用,以便可以直接与它们交互,例如,聚焦输入元素。
-
存储先前状态:它可以存储变量的先前状态或值,在需要比较当前值与先前值而不引起重新渲染的情况下非常有用。
-
存储不影响渲染的值:有时您可能需要存储不属于组件渲染输出的值,例如计时器、间隔或订阅。在这种情况下,使用
useRef
更合适,因为它不会引起重新渲染。
useRef
存在的主要原因是提供一种在渲染之间管理值而不引起不必要更新的方法。尽管可以使用“正常”变量,但它不会在渲染之间保持不变,因为组件函数会再次执行,变量将被重新初始化。
总之,useRef
用于管理在渲染之间保持不变而不引起重新渲染的值,而 useState
用于管理影响组件输出并在更新时引起重新渲染的状态。它们有不同的用途,了解何时使用其中之一非常重要,以编写高效的 React 组件。
英文:
useRef
is like you said different from normal state variables managed with useState
in React. While useState
is designed to store state that causes re-renders when updated, useRef
is designed to store mutable values that persist across renders without causing a re-render.
useRef
is useful in the following situations:
-
Accessing DOM elements: It is often used to create references to DOM elements so that you can interact with them directly, e.g., focusing an input element.
-
Storing the previous state: It can store the previous state or value of a variable, which is useful in scenarios where you need to compare the current value with the previous value without causing re-renders.
-
Storing values that don't affect rendering: Sometimes you might need to store values that are not part of the component's render output, e.g., timers, intervals, or subscriptions. In this case, using
useRef
is more suitable because it doesn't cause a re-render.
The main reason why useRef
exists is to provide a way to manage values across renders without causing unnecessary updates. Although you can use a "normal" variable, it will not persist across renders as the component function will be executed again, and the variable will be re-initialized.
In summary, useRef
is used for managing values that persist across renders without causing re-renders, while useState
is used for managing state that affects the component's output and should cause re-renders when updated. They serve different purposes, and understanding when to use one over the other is essential for writing efficient React components.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论