【问题标题】:How to return the first 2 objects of an array of 4 objects如何返回由 4 个对象组成的数组的前 2 个对象
【发布时间】:2021-12-15 18:42:24
【问题描述】:

我想返回一个包含 4 个对象的数组的前 2 个对象,然后在 5 秒之间添加另外两个对象。

注意:我将复制的数组 revEventsreverse() 反转,因为项目按日期/时间降序排列,最近的项目排在最前面。

我目前的问题是前两个对象显示正常,然后 5 秒后,它只加载第三个对象并停止。

 useEffect(() => {
   let ms = 3000
   let i = 0
   let displayedEvents = [...props].splice(i, 2)
   setEventsProps(displayedEvents.reverse())
   const interval = setInterval(() => {
     if (++i <= props.length) {
       displayedEvents = props.splice(0, i + 2)
       setEventsProps(displayedEvents.reverse())
      }
    }, ms)
    return () => { clearInterval(interval) }
    }, [])

 //JSX as below
 displayedEvents.map(event () => ...etc

【问题讨论】:

  • 您是否尝试过删除 setInterval 并将其替换为 setTimeout? (包括clearTimeout)那么就不需要return () => {clearInterval(interval)}

标签: javascript arrays reactjs setinterval splice


【解决方案1】:

我想分享一个改进的解决方案。

   useEffect(() => {
        const ms = 5000
        let i = 2
        const displayedEvents: IEventsProps = props.slice(0, 2)
        setEventsProps(displayedEvents.reverse())
        let interval: NodeJS.Timeout = setInterval((): void => {
            if (i < props.length) {
                displayedEvents.push(props[i])
                setEventsProps(displayedEvents.reverse())
                i += 1
            } else {
                clearInterval(interval)
                interval = null
            }
        }, ms)
        return () => { if (interval) { clearInterval(interval) } }
    }, [])

这避免了通过改变同一个数组来创建不必要的新数组,并且在工作完成时也会清除间隔,因此它不会永远运行。

【讨论】:

    【解决方案2】:

    修复了这个问题,而不是使用 splice() 函数,我需要使用 slice() 函数。

    代码保持不变,为找到此代码的任何人添加了打字稿。

       useEffect(() => {
            let ms: number = 5000
            let i: number = 0
            let displayedEvents: IEventsProps = [...props].slice(i, 2)
            setEventsProps(displayedEvents.reverse())
                const interval: NodeJS.Timeout = setInterval((): void => {
                    if (++i <= props.length) {
                        displayedEvents = props.slice(0, i + 2)
                        setEventsProps(displayedEvents.reverse())
                    }
                }, ms)
            return () => { clearInterval(interval) }
        }, [])
    
    

    【讨论】:

    • 不需要通过[...props]复制你的数组,slice已经创建了一个新数组。
    • 此代码将运行间隔永远(直到组件卸载)。完成所有道具后,您应该致电clearInterval。你的条件也错了,多跑了2次,应该是if (++i &lt;= props.length - 2)
    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多