首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应自定义钩子而不呈现

响应自定义钩子而不呈现
EN

Stack Overflow用户
提问于 2022-05-28 17:19:10
回答 1查看 363关注 0票数 -1

我正在构建一个应用程序,使用Remix,fly.io进行部署。我有一个定制的React useCountdown,它有以下代码:

代码语言:javascript
复制
import { useEffect, useState } from 'react';

const useCountdown = (targetSeconds) => {
    const countDownSeconds = targetSeconds

    const [countDown, setCountDown] = useState(countDownSeconds);

    useEffect(() => {
        const interval = setInterval(() => {
            setCountDown(countDownSeconds);

            return () => clearInterval(interval);
        }, [countDownSeconds]);

        return getReturnValues(countDown);
    }, [])
};

const getReturnValues = (countDown) => {
    const seconds = Math.floor((countDown % (1000 * 60)) / 1000);

    return [seconds];
}

export { useCountdown }

DateTimeDisplay组件具有以下代码,是钩子的组件依赖项:

代码语言:javascript
复制
import React from 'react';

const DateTimeDisplay = ({ value, type, isDanger }) => {
    return (
        <div className={isDanger ? 'countdown danger' : 'countdown'}>
            <p>{value}</p>
            <span>{type}</span>
        </div>
    );
};

export default DateTimeDisplay;

最后,我有一个CountdownTimer组件,它有以下代码:

代码语言:javascript
复制
import React from 'react';
import DateTimeDisplay from './DateTimeDisplay';
import ExpiredNotice from './ExpiredNotice'
import { useCountdown } from '../hooks/useCountdown';


const ShowCounter = ({ seconds }) => {
    return (
        <div className="show-counter">
                <DateTimeDisplay value={seconds} type={'seconds'} isDanger={false} />
        </div>
    );
};

const CountdownTimer = ({ targetSeconds }) => {
    const [seconds] = useCountdown(targetSeconds);

    if (seconds <= 0) {
        return <ExpiredNotice />;
    } else {
        return (
            <ShowCounter
                seconds={seconds}
            />
        );
    }
};

export default CountdownTimer;

在尝试使用useCountdown()钩子时,我得到以下错误:

代码语言:javascript
复制
TypeError: useCountdown is not a function or its return value is not iterable
    at CountdownTimer (/Users/tduke/Desktop/dev/drawesome/app/components/CountdownTimer.jsx:17:23)
    at processChild (/Users/tduke/Desktop/dev/drawesome/node_modules/react-dom/cjs/react-dom-server.node.development.js:3353:14)
    at resolve (/Users/tduke/Desktop/dev/drawesome/node_modules/react-dom/cjs/react-dom-server.node.development.js:3270:5)
    at ReactDOMServerRenderer.render (/Users/tduke/Desktop/dev/drawesome/node_modules/react-dom/cjs/react-dom-server.node.development.js:3753:22)
    at ReactDOMServerRenderer.read (/Users/tduke/Desktop/dev/drawesome/node_modules/react-dom/cjs/react-dom-server.node.development.js:3690:29)
    at renderToString (/Users/tduke/Desktop/dev/drawesome/node_modules/react-dom/cjs/react-dom-server.node.development.js:4298:27)
    at handleRequest (/Users/tduke/Desktop/dev/drawesome/app/entry.server.jsx:10:16)
    at handleDocumentRequest (/Users/tduke/Desktop/dev/drawesome/node_modules/@remix-run/server-runtime/server.js:400:18)
    at requestHandler (/Users/tduke/Desktop/dev/drawesome/node_modules/@remix-run/server-runtime/server.js:49:18)
    at /Users/tduke/Desktop/dev/drawesome/node_modules/@remix-run/express/server.js:39:22

所涉及的问题是:

代码语言:javascript
复制
    const [seconds] = useCountdown(targetSeconds);

  1. 能不能给我解释一下这个错误,以及它到底告诉我什么,所以我完全理解这个错误,以及这个错误的原因是什么?

  1. 如何修复?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-28 17:28:24

useCountdown没有返回语句,所以它隐式地返回undefined。然后,当您试图对undefined进行析构时,您会得到该错误,因为数组析构只对数组(或其他可迭代的,这就是为什么该错误提到“迭代”,而不是数组)。

您确实在useEffect中放置了一个返回语句,但是在useEffect中返回一些内容是为了清除效果。它不会导致useCountdown返回任何东西。要解决这一问题,请将返回语句移动到useCountdown的主体,并将效果清除移动为该效果的返回:

代码语言:javascript
复制
const useCountdown = (targetSeconds) => {
    const countDownSeconds = targetSeconds

    const [countDown, setCountDown] = useState(countDownSeconds);

    useEffect(() => {
        const interval = setInterval(() => {
            setCountDown(countDownSeconds);
        }, [countDownSeconds]);

        return () => clearInterval(interval);
    }, [])

    return getReturnValues(countDown);
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72417748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档