我试图理解新的React钩子及其用例。
我的目标是一个单一的组成部分,计算起来,也每x滴答计数另一个计数器。
我使用useEffect和useState实现了它,主要有两个问题:
1。组件在调用超时之前卸载时发生内存泄漏(使用react router导航时)
2。该组件在每个刻度上渲染两次,因为useEffect和useState都会触发渲染。
我认为解决方案是使用useRef或usemo,但我还没有弄明白。
我的当前组件(带有typescript):
import React from "react";
const Component: React.FC = () => {
const [trigger, setTrigger] = React.useState(0);
const [timer, setTimer] = React.useState({ cycle: 0, count: 0 });
let refTimer = React.useRef({ cycle: 0, count: 0 });
// useRef
// React.useEffect(() => {
// setInterval(() => {
// console.log("tick");
// if (refTimer.current.count % 2 === 0) {
// refTimer.current.cycle++;
// setTimer(refTimer.current);
// }
// refTimer.current.count++;
// setTimer(refTimer.current);
// // console.log(timer);
// }, 1000);
// }, []);
// useState
React.useEffect(() => {
console.log("effect tick");
setTimeout(() => {
console.log("tick");
const count = timer.count + 1;
if (count % 2 === 0) {
const cycle = timer.cycle + 1;
setTimer({ ...timer, count, cycle });
return;
}
setTimer({ ...timer, count });
}, 1000);
}, [timer]);
return (
<div>
<br />
<br />
<br />
<br /> Playground:
<div>Count: {timer.count}</div>
<div>Cycle: {timer.cycle}</div>
<button type="button" onClick={(): void => setTrigger(trigger + 1)}>
Trigger Count: {trigger}
</button>
</div>
);
};
export default Component;
正如我所说,像这样,我有提到的两个问题。我可以完全删除使用效果来修复双重渲染,但是当我点击触发按钮时,刻度会堆积起来,这比双重渲染更糟糕。
注释的useRef部分是我尝试过的,但不知何故它不起作用。
我感谢所有的帮助!
编辑:第三个小问题是,像这样,计数器只在setTimeout下运行,这将触发另一个setTimeout,因此如果该过程需要一些时间,它实际上不会是一个精确的间隔。
因此,我的目标是在一个单独的进程中运行一个时间间隔(我会说在useEffect中),它会在每个滴答声中导致重新渲染,而不会在每次调用或其他事件触发重新渲染时叠加。
问题内容: 随着React 中钩子的引入,现在的主要困惑是何时将函数组件与钩子和类组件一起使用,因为在钩子的帮助下,甚至可以在函数组件中获得和部分使用。所以,我有以下问题 钩子的真正优点是什么? 何时使用带有钩子的函数组件和类组件? 例如,带有钩子的功能组件不能像类组件那样帮助性能。他们没有执行就不能跳过重新渲染。还有其他原因吗? 提前致谢。 问题答案: 引入和其他特性(例如和)的思想是帮助减少必
我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的
问题内容: 当我用酶测试类组件时,我可以设置状态。当我用钩子测试功能组件时,现在该怎么做? 例如,在我的组件中,我有: 我想在测试中进行更改 问题答案: 使用挂钩状态时,您的测试必须忽略诸如状态之类的实现细节,以便对其进行正确测试。您仍然可以确保组件将正确的状态传递到其子级。 您可以在Kent C. Dodds撰写的这篇博客文章中找到一个很好的例子。 这是摘录的代码示例。 依赖状态执行细节的测试-
我有一个类扩展了React。组件类,我将为我希望接收的道具传递我自己的接口。问题是当我使用webstorm linter说有问题,指出类型“typeof SomeComponent”上不存在属性“propTypes”。 我不知道为什么会这样...... 的代码为 当我编写以下代码创建函数组件时,会引发类似的异常: 在本例中,使用
我正在构建一个应用程序(使用TypeScript),我面临一个问题,该解决方案需要识别不同的子组件的可能性。基本上是这样的: 我已经搜索了一段时间,许多,如果不是所有接受的答案(像这里:只允许反应组件中特定类型的子级),都是使用()。不幸的是,也有人说在生产中可能会缩小,所以我不能依赖它。 我发现的唯一方法是“强制”一个自己的显示名称。基本上,我创建了一个接口,然后为每个应该可以识别的组件扩展它。
问题内容: 在带有钩子的React中,更新状态的正确方法是嵌套对象是什么? 一个人怎么会使用到的更新来(附加一个字段)? (改变价值)? 问题答案: 您可以像这样传递新值