reactjs - 使用 useState 和 setInterval 反应 useEffect
问题描述
使用以下代码通过组件 DOM 旋转对象数组。问题是状态永远不会更新,我不能锻炼为什么..?
import React, { useState, useEffect } from 'react'
const PremiumUpgrade = (props) => {
const [benefitsActive, setBenefitsActive] = useState(0)
// Benefits Details
const benefits = [
{
title: 'Did they read your message?',
content: 'Get more Control. Find out which users have read your messages!',
color: '#ECBC0D'
},
{
title: 'See who’s checking you out',
content: 'Find your admirers. See who is viewing your profile and when they are viewing you',
color: '#47AF4A'
}
]
// Rotate Benefit Details
useEffect(() => {
setInterval(() => {
console.log(benefits.length)
console.log(benefitsActive)
if (benefitsActive >= benefits.length) {
console.log('................................. reset')
setBenefitsActive(0)
} else {
console.log('................................. increment')
setBenefitsActive(benefitsActive + 1)
}
}, 3000)
}, [])
我得到的输出如下图所示。我可以看到 useState 'setBenefitsActive' 被调用,但 'benefitsActive' 从未更新。
解决方案
您没有传递任何依赖项,useEffect
这意味着它只会运行一次,因此参数 forsetInterval
只会收到benefitsActive
(在本例中为0
)的初始值。
您可以通过使用函数来修改现有状态,而不仅仅是设置值,即
setBenefitsActive(v => v + 1);
推荐阅读
- laravel - 如何在路由之前获取一些数据并将其发送到 laravel 中的路由?
- flutter - 找不到正确的提供者
在此 EditRetailer 小部件上方 - android - 是否可以在编译开始之前知道 LOCAL_SRC_FILES 的值?
- python - DataFrame.info() 与 DataFrame.Series.describe() 不同
- swift - Xcode11,TableView 单元格选择样式不起作用
- angular - 无法绑定到“rangePicker”,因为它不是“mat-date-range-input”的已知属性
- azure-storage - Microsoft.Azure.Storage.Blob v11.1.7 在创建 Queueclient 时抛出异常
- javascript - ngBootstrap typeahead 对象作为输入值
- javascript - 复选框按类型过滤 - ReactJS
- django - Django 查询集过滤掉具有共同成员的对象