reactjs - 避免使用带有 useEffect 的 react 组件使用 let 和 mutating 值
问题描述
问题。根据我得到的最新信息,我被认为是:
避免在 react 组件中使用 let 和 mutating 值,因为 React Hook useEffect 内部的变量在每次渲染后都会丢失。
所以假设我们有这样一个简单的例子:
import React, { useEffect, useState } from "react";
import "./Timer.scss";
interface ITimerProps {
setValid: (valid: boolean) => void;
}
export const Timer = ({ setValid }: ITimerProps) => {
const [minutes, setMinutes] = useState(0);
const [seconds, setSeconds] = useState(0);
const tokenTTL = 1;
const endTime = new Date();
let min = tokenTTL;
let sec = 0;
useEffect(() => {
const interval = setInterval(() => {
endTime.setMinutes(endTime.getMinutes() + tokenTTL);
sec--;
if (sec === -1) {
sec = 59;
min--;
}
setMinutes(min);
setSeconds(sec);
if (min === 0 && sec === 0) {
clearInterval(interval);
setValid(false);
}
}, 1000);
}, []);
return (
<>
<p className="Timer">
<span className="minutes">{minutes}</span>
<span className="divider">:</span>
<span className="seconds">{seconds}</span>
</p>
</>
);
};
在这里,我使用 let 秒和分钟。基于此,我只是在渲染一个简单的计时器,我必须使用 let 来改变我的值
解决方案
这可能不是他们所说的那种用例,因为您只调用useEffect()
一次,其他所有操作都在一个setInterval()
.
话虽如此,您可以通过将可变变量移动到useEffect()
.
为 React 提供一种在卸载组件时通过返回清理函数来清除间隔的方法也是一个好主意。
推荐阅读
- python - 为什么 strip() 不能处理函数中的输入然后被打印?
- tensorflow - 如何迁移学习或微调 tensorflow lite tflite
- django - Django-fcm如何设置senderId
- node.js - Sequelize - 如何插入数据,然后更新
- javascript - 如何将字符串分成字母然后推入下一个字母?
- azure - Apple 错误“无效的网络重定向 url”。在 Azure B2C 用户登录流程期间
- php - 获取两个不同结构数组的交集
- elasticsearch - 在 K8S 中启动 Elasticsearch 身份验证时如何禁用它?
- javascript - 如何在 Typescript 中从 Axios 返回响应?
- flutter - Flutter Build 失败并出现异常