当前位置: 首页 > 面试题库 >

相当于使用React钩子的componentDidUpdate

佘修为
2023-03-14
问题内容

tldr; 如何模拟componentDidUpdate或将keyprop与数组配合使用以强制重置组件?

我正在实现一个显示计时器的组件,并在该组件达到零时执行回调。目的是让回调更新对象列表。后一个组件由新的React钩子 useState和组成useEffect

state包含在该定时器启动时的基准,而剩余的时间。该effect套间隔称为每秒钟更新的剩余时间,并检查是否回调应该叫。

该组件并不是要重新安排计时器的时间,或者在间隔达到零时保持间隔不变,而是应该执行回调和空闲。为了刷新计时器,我希望将一个数组传递给该数组,key这将导致组件状态被重置,因此计时器将重新启动。不幸的是,key必须将其与字符串一起使用,因此数组的引用是否已更改均无效。

我还尝试通过传递我所关注的数组来对道具进行更改,但是状态得以维持,因此间隔未重置。

什么是观察数组中浅层变化以强制仅使用新的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} />

尝试与道具变更配合使用:

<RefresherTimer delay={20000} callback={props.updateListOfObjects} somethingThatChanges={listOfObjects} />

listOfObjects指的是对象数组,其中对象本身不一定会更改,因此应与进行比较!==。通常,该值将来自Redux,该操作将updateListOfObjects导致数组重新初始化,如下所示:newListOfObjects = [...listOfObjects]


问题答案:

所述useRef创建了功能成分的“实例变量”。它充当标志来指示它是处于安装阶段还是处于更新阶段而不处于更新状态。

const mounted = useRef();
useEffect(() => {
  if (!mounted.current) {
    mounted.current = true;
  } else {
    // do componentDidUpate logic
  }
});


 类似资料:
  • 太长,读不下去了如何模拟或使用带有数组的道具强制重置我的组件? 我正在实现一个组件,它显示一个计时器,并在达到零时执行回调。目的是让回调更新对象列表。后一个组件由新的React钩子和组成。 包含对计时器启动时间和剩余时间的引用。设置每秒钟调用一次的间隔,以更新剩余的时间,并检查是否应该调用回调。 该组件并不意味着重新安排计时器,或者在间隔达到零时保持间隔,它应该执行回调并空闲。为了让计时器刷新,我

  • 我发现有几种方法可以用钩子处理用户的文本输入。用钩子处理输入的更好或更合适的方法是什么?你会用哪一种? 1)处理输入的最简单的钩子,但是你有更多的字段,你必须写更多重复的代码。 活动: 2) 与上面的示例类似,但具有动态键名 活动: 3) 作为的替代方案,正如ReactJS文档中所述,通常比更可取。 活动: 4) 将返回一个回调的备忘录版本,该版本仅在其中一个依赖项发生更改时才会更改。 活动:

  • 当类组件的输入道具相同时,可以使用PureComponent或ShouldComponentUpdate来避免呈现。现在,您可以通过将函数组件包装在react.memo中来对它们进行同样的处理。 所期望的: 我希望只有当模态可见时才呈现模态(由this.props.show管理) 对于类组件: 如何在功能组件中使用?在modal.jsx中? 相关代码: 功能组件modal.jsx(我不知道如何检查

  • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

  • 我第一次面对的问题很小。我试图使用一个简单的useState,但出于某种原因,我不明白为什么React会给我一个错误,不管我想做什么--没有什么能修复它。 这是错误的图像:错误描述: 错误:无效的钩子调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一:1.React和呈现器(例如React DOM)2的版本可能不匹配。你可能违反了钩子3的规则。在同一个应用程序中可能有多个React副

  • 在React的官方文件中提到- 如果您熟悉React类生命周期方法,那么可以将useEffect钩子看作componentDidMount、componentDidUpdate和componentWillUnmount的组合。 我的问题是--我们如何在钩子中使用生命周期方法?