当我使用反应钩子实现选择任何复选框时,启用按钮有啥问题? [复制]

Posted

技术标签:

【中文标题】当我使用反应钩子实现选择任何复选框时,启用按钮有啥问题? [复制]【英文标题】:What's wrong with enabling a button when any of checkboxes is selected with my implementation with react hooks? [duplicate]当我使用反应钩子实现选择任何复选框时,启用按钮有什么问题? [复制] 【发布时间】:2020-01-30 09:39:20 【问题描述】:

I have a bug in enabling a button, when any of the checkboxes is selected.目前它在第一次点击时不起作用,但只在第二次点击时起作用。取消选中复选框也适用于第一次单击。我认为这与状态有关,但我并不真正了解导致问题的原因。

我尝试注释掉这一行: checked.length > 0 ? setTaskBtnsEnabled(true) : setTaskBtnsEnabled(false); 它消除了这个问题,所以我确信它与 useState 有关。然而,这条线对我来说很重要,所以我应该想出一个解决办法。我也尝试从相反的布尔值开始,但问题仍然存在。

上层组件:

const checkedBoxes = () => 
    var checkedOnes = [];
    for (
      var i = 0;
      i < document.getElementsByClassName('count-checkboxes').length;
      i++
    ) 
      if (document.getElementsByClassName('count-checkboxes')[i].checked) 
        checkedOnes.push(
          document.getElementsByClassName('count-checkboxes')[i].parentNode
            .id
        );
      
    
    return checkedOnes;
  ;

  const [taskBtnsEnabled, setTaskBtnsEnabled] = useState(false);
  const handleBtnsEnabling = event => 
    var checked = checkedBoxes();
    checked.length > 0 ? setTaskBtnsEnabled(true) : setTaskBtnsEnabled(false);
  ;

上一个里面的组件:

<Button
   disabled=!taskBtnsEnabled
   id="nappi"
>
   OK
</Button>

问题是第一次点击不起作用并且它没有选中复选框。控制台没有错误消息。

【问题讨论】:

【参考方案1】:

尝试创建一个每次单击复选框都会调用的函数。此函数将增加或减少状态变量的值。像

const [numberOfChecked, setNumberOfChecked] = useState(0)

然后添加一个useEffect,它将监视对numberOfChecked 的更改。然后你可以在那个钩子里面做你的

useEffect(() => 
  setTaskBtnsEnabled(numberOfChecked > 0);
, [numberOfChecked]);

【讨论】:

以上是关于当我使用反应钩子实现选择任何复选框时,启用按钮有啥问题? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用反应钩子实现多个复选框

多个复选框以启用/禁用javascript中的一个选择器

反应钩子第一次没有设置状态

使用反应钩子形式进行条件验证

反应表单钩子如何验证选择选项

如何在反应钩子中创建可重用状态?