【问题标题】:UseState doesnt change button color immediatelyUseState 不会立即更改按钮颜色
【发布时间】:2021-01-28 09:37:57
【问题描述】:

所以我使用 React useState 中的循环创建了按钮

  const [booleanMonth,setMonth]=useState([
    {key:0,value:'January',color:'black'},
    {key:1,value:'February',color:'black'},
    {key:2,value:'March',color:'black'},
    {key:3,value:'April',color:'black'},
    {key:4,value:'May',color:'black'},
    {key:5,value:'June',color:'black'},
    {key:6,value:'July',color:'black'},
    {key:7,value:'August',color:'black'},
    {key:8,value:'September',color:'black'},
    {key:9,value:'October',color:'black'},
    {key:10,value:'November',color:'black'},
    {key:11,value:'December',color:'black'}
    ])

  const createButtonMonth = () =>{
    return (<View style={styles.containerForButtons2}>
            {
              booleanMonth.map((item,key) => 
                <View key={item.key} style={styles.buttonFilter3}><Button key={item.key} title={item.value} color={item.color}  value={item.value} 
                onPress={()=>onPressMonthFilter(item.key)}/></View>)
            }
            </View>)
    }

然后为了改变按钮的颜色,我使用这个函数来切换按钮的颜色

  const onPressMonthFilter = (keymonth) =>{    
    if(booleanMonth[keymonth].color=='black'){
      booleanMonth[keymonth].color='green'
      setMonth(booleanMonth)
    }else{
      booleanMonth[keymonth].color='black'
      setMonth(booleanMonth)
    }
  }

按下按钮的颜色不会立即改变,但是当我关闭一些随机模式或执行我创建的刷新功能时,按钮的颜色就会改变。 我不知道会发生什么,也不知道如何解决。

编辑:我正在使用它,它会立即更改按钮,这很奇怪,而不是我想要的解决方案,我不想循环

const onPressMonthFilter = (keymonth) =>{
    let monthChecked = []
    for(var i = 0 ; i<booleanMonth.length ; i ++){
      if(booleanMonth[i].key == keymonth){
          if(booleanMonth[i].color == 'green'){
            booleanMonth[i].color = 'black'
          }else{
            booleanMonth[i].color = 'green'
          }
        }
        monthChecked.push(booleanMonth[i])
      }
      setMonth(monthChecked)
}

【问题讨论】:

  • 你正在直接改变对象,这意味着 React 不知道更改,因为它只是检查对象是否相等。所有 React 看到的都是和以前一样的对象。因此,在正确更改其他内容之前,它不会重新渲染。每当您更改某些内容时,请使用这些更改创建一个新对象并将其传入。

标签: reactjs react-native button use-state


【解决方案1】:

拥有let monthCheck=booleanMonth 不会创建状态副本。它存储对该状态数组的引用。所以突变monthCheck 会改变状态,这会导致您面临的问题。您最简单的选择是使用.map 方法,因为它返回一个新数组,例如

const onPressMonthFilter = (keymonth) =>{
      setMonth(booleanMonth.map(month => ({
          ...month,
          color: month.key === keymonth ? 'green' : 'black'
      }))
   );
}

【讨论】:

  • 删除了月份检查仍然没有改变
  • 不是解决方案,但无论如何都赞成效率投入
  • @Bzxnaga 好的,这就是您想要的特定行为:每个月都有一个按钮,所有按钮最初都是黑色的。当您单击一个按钮时,它会变为绿色。如果您单击另一个,它将变为绿色,而另一个选定的将变回黑色。等等
  • 是的,除了使用 useState 之外的任何其他解决方案?
  • 好吧,那么我的解决方案确实有效。你可以看到它在这里工作(很少有细微的变化,因为它是反应,而不是本机反应):codesandbox.io/s/nameless-architecture-6lur2?file=/src/App.js 编辑中的新代码仍然会改变状态,不要那样做
猜你喜欢
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 2022-08-14
  • 2021-05-14
  • 2021-12-12
相关资源
最近更新 更多