- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
tldr; 如何模拟 componentDidUpdate
或以其他方式使用带有数组的 key
属性来强制重置我的组件?
我正在实现一个组件,它显示计时器并在计时器达到零时执行回调。回调的目的是更新对象列表。后一个组件由新的 React hooks 制成。 useState
和 useEffect
。
state
包含对计时器启动时间和剩余时间的引用。 effect
设置一个每秒调用的时间间隔来更新剩余时间,并检查是否应该调用回调。
该组件并不意味着重新安排计时器,或者在达到零时保持间隔继续,它应该执行回调并空闲。为了刷新计时器,我希望将一个数组传递给key
,这将导致组件的状态被重置,从而计时器将重新启动。不幸的是 key
必须与字符串一起使用,因此无论我的数组的引用是否更改都不会产生任何效果。
我还尝试通过传递我关心的数组来推送对 props 的更改,但状态得到了维护,因此间隔没有重置。
观察数组中浅层变化以强制仅使用新的 hooks API 更新状态的首选方法是什么?
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
function getTimeRemaining(startedAt, delay) {
const now = new Date();
const end = new Date(startedAt.getTime() + delay);
return Math.max(0, end.getTime() - now.getTime());
}
function RefresherTimer(props) {
const [startedAt, setStartedAt] = useState(new Date());
const [timeRemaining, setTimeRemaining] = useState(getTimeRemaining(startedAt, props.delay));
useEffect(() => {
if (timeRemaining <= 0) {
// The component is set to idle, we do not set the interval.
return;
}
// Set the interval to refresh the component every second.
const i = setInterval(() => {
const nowRemaining = getTimeRemaining(startedAt, props.delay);
setTimeRemaining(nowRemaining);
if (nowRemaining <= 0) {
props.callback();
clearInterval(i);
}
}, 1000);
return () => {
clearInterval(i);
};
});
let message = `Refreshing in ${Math.ceil(timeRemaining / 1000)}s.`;
if (timeRemaining <= 0) {
message = 'Refreshing now...';
}
return <div>{message}</div>;
}
RefresherTimer.propTypes = {
callback: PropTypes.func.isRequired,
delay: PropTypes.number
};
RefresherTimer.defaultProps = {
delay: 2000
};
export default RefresherTimer;
尝试与key
一起使用:
<RefresherTimer delay={20000} callback={props.updateListOfObjects} key={listOfObjects} />
尝试与 Prop 更改一起使用:
<RefresherTimer delay={20000} callback={props.updateListOfObjects} somethingThatChanges={listOfObjects} />
listOfObjects
指的是一个对象数组,其中对象本身不一定会改变,因此该数组应该与 !==
进行比较。通常,该值来自 Redux
,其中 updateListOfObjects
操作会导致数组重新初始化,如下所示:newListOfObjects = [...listOfObjects]
.
最佳答案
useRef
在功能组件中创建一个“实例变量”。它充当一个标志,指示它是处于挂载阶段还是处于更新阶段(没有更新状态)。
const mounted = useRef();
useEffect(() => {
if (!mounted.current) {
// do componentDidMount logic
mounted.current = true;
} else {
// do componentDidUpdate logic
}
});
关于javascript - 相当于使用 React hooks 的 componentDidUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53255951/
您好,我正在调用 componentdidupdate 以便像这样使用新的 ToDos 重新呈现我的页面 this.state = { displayToDos
我收到以下警告,但我不知道它意味着哪个数据更改,你知道吗? Warning: componentWillReceiveProps has been renamed, and is not recomm
当我使用react-router更改路由时,componentDidUpdate是否会触发?我修改了示例代码,但似乎无法使其工作。 我让主页组件记录了一些文本,但它似乎没有触发。感谢任何帮助,谢谢!
我想知道 React 组件的生命周期方法 componentDidUpdate 是否在所有子组件的 render 方法完成后执行,或者在 render 调用该组件的方法。 由于协调器递归地调用 ren
在每个模块的仪表板中,其布局数据(使用react-grid-layout)与模块数据分开存储,并且每个数据都存储在数据库中。当前模块数据和布局数据存储在仪表板组件状态中。每当模块或布局的先前状态与当前
我正在尝试使用componentDidUpdate动态渲染组件集合。这是我的场景: var index = 0; class myComponent extends Component { con
我有一个设置屏幕,我可以在其中获取用户的信息数量,例如年龄、体重和性别,然后根据这些信息计算用户每天应该喝多少水。 我想自动计算这个金额而不需要计算按钮。 Invariant Violation: M
我想测试 componentDidUpdate我尝试传递 {...props} 而不定义它然后 componentDidUpdate 首先记录一个空对象,然后不需要更新这会记录它们两次并显示 prop
我有一个类组件如下: class App extends Component { constructor(props){ super(props); this.
我正在使用带有文本输入的简单表单。当写入内容时,组件的状态会更新,并且由于 this.setState 是异步的,我从 componentDidUpdate 上的 API 获取数据。 问题是我没有找到
这是场景。我有一个父组件和一个子组件。父组件执行 ajax 调用并将数据推送到子组件。 当子组件接收到新数据时,在(子组件)的 componentDidUpdate 中,我将重新设置其内部状态。 co
在我的应用程序中,我有一个 HomePage其中有导航链接的组件。该组件的路由是 。因此该组件有一个导航栏,其中包含指向其“子路线”的 NavLink 链接。例如,导航链接可引导您访问 /browse
我将 Redux 重构到我的代码中,但不知道如何获取之前的状态。我的 componentDidUpdate 生命周期方法需要此状态,以便我可以调用其他方法而不会陷入无限循环。 // when comp
当满足以下条件时,我需要确保输入元素获得焦点: DOM 可用 并且属性已更改 问题:我是否需要将代码同时放入 componentDidUpdate 和 componentDidMount 中,还是仅使
我将一个自调用函数从 App 组件传递到 WeatherForecast 组件的 getBgColor 函数。这会从子组件 WeatherForecast 获取一个值,并将其传递到 App 组件以更新
在这里阅读了大量其他相关问题后。我还找不到答案。我已经改进了我的代码,并且我相信我非常接近解决方案,但我仍然无法实现我的目标。 我是编码和 native react 的新手。我想构建水提醒应用程序,我
我有一个障碍,那就是如果我按下取消订单按钮(batalkan pesanan)就会出现无限循环,为什么我要使用ComponentDidUpdate因为要更新新的显示或者除了ComponentDidUp
我有一个带有 componentDidMount() 方法的组件,该方法调用名为 getData() 的方法,该方法获取初始数据并设置组件的初始状态。 class LogsSettings exten
简单的例子,但不知道为什么我不能让它工作: class Grid extends React.Component { componentDidUpdate = () =>{
我的纯组件中有这段代码: componentDidUpdate(prevProps) { const { scheduleSheet } = this.props; const {
我是一名优秀的程序员,十分优秀!