【问题标题】:React (Reakit): How to ask for confirmation, when toggling a checkbox?React(Reakit):切换复选框时如何要求确认?
【发布时间】:2019-12-27 00:45:57
【问题描述】:

我想知道,是否有办法通过Reakit's checkbox 要求确认。我正在使用Reakit,因为我找到了一种快速的方法来让它读取数据库的布尔信息,但我也欢迎其他方法!

我习惯于使用带有asyncwindow.confirm 的按钮进行确认:

<button onClick={async hiStackOverflow => {
  if (window.confirm("Want to do this?")) {
    // saving to database here 
  }
}}>

但我不知道如何使用复选框来做到这一点。简而言之,当用户打开/关闭复选框时,我希望页面确认(然后保存到数据库)。

// personData = database table, with boolean "recurring"
// row = which entity in a table we are talking about

function CheckboxThing ({ row, personData }) {

  const checkbox = useCheckboxState({state: personData[row].recurring});

  return (
    <div className="checkbox-admin-other">
      <Checkbox 
        {...checkbox} 
        // what here?? onClick or something?
      />
    </div>
  );
}

【问题讨论】:

    标签: reactjs checkbox async-await onclick reakit


    【解决方案1】:

    Reakit 的复选框可以这样使用:

    const toggle = () => setChecked(!checked);
    return <Checkbox checked={checked} onChange={toggle} />;
    

    这意味着如果变量 'checked'(需要置于 React 组件的状态)为 true 并且当用户切换复选框时,将调用名为“toggle”的方法。在该方法中,您可以输入将显示确认提示的代码,然后如果用户单击“是”则更改为选中状态,如果用户选中“否”则保持原样。

    【讨论】:

    • 我已经打开和关闭了复选框,从数据库中获取信息(用户是否在队列中重复出现)。我正在尝试找到一种方法,管理员可以通过单击和确认来更改是/否状态。如果我在它旁边放一个按钮并读取复选框值,它可以工作,但它对 UX 没有那么好......我让它更容易理解了吗? :D
    • 如果我理解正确,您从数据库中读取复选框的值,但您希望允许管理员在这些复选框的帮助下更改这些值,但在它们更改之前,应该确认完成了吗?
    • 是的!确认只是为了防止误点击,但我仍然需要保存新值(开/关),我知道如何使用async/await 来做到这一点。我只需要让确认系统以某种方式工作:D
    • 然后您需要将代码放入“toggle”方法中,该方法将显示确认系统,然后如果用户单击“是”则执行某些操作,如果单击“否”则不执行任何操作。要创建类似的东西,您可以使用我们使用的库,例如 'sweetalert2' 或内置的 JavaScript 窗口确认()方法。
    • 目前看起来像这样。它不会进入if,大概是因为它读取const toggle 太快了还是什么?不知道。编辑:格式坏了,我现在把它编辑到主帖。
    【解决方案2】:

    您可以使用React Hooks“观察”checkbox.state 的变化:

    function CheckboxThing({ row, personData }) {
      const checkbox = useCheckboxState({ state: personData[row].recurring });
    
      React.useEffect(() => {
        // checking if state has changed
        if (checkbox.state !== personData[row].recurring) {
          if (window.confirm("Want to do this?")) {
            // saving to database here
          } else {
            // revert checkbox state otherwise
            checkbox.setState(!checkbox.state);
          }
        }
      }, [checkbox.state, checkbox.setState, personData[row].recurring]);
    
      return (
        <div className="checkbox-admin-other">
          <Checkbox {...checkbox} />
        </div>
      );
    }
    

    使用React.useEffect,用户将在window.confirm 打开之前看到复选框被选中。但是,如果您希望在 UI 上的复选框状态更改之前打开它,您可以使用 React.useLayoutEffect

    【讨论】:

      【解决方案3】:

      经过一段时间的编码后,我找到了解决方案!事实证明,您可以将async 放入Reakit Checkbox 中。感谢 Tomislav 和 Diego,他们的回答帮助我尝试了不同的事情并让它变得干净!

      这是完整的功能:

      // admin can edit the right to join back to the queue after getting to the front
      function RecurringBox ({ row, personData }) {
      
        // sets the original values
        const checkbox = useCheckboxState({state: personData[row - 1].recurring});
      
        return (
          <Checkbox {...checkbox} onChange={async checkboxSwitch => {
            if (window.confirm("Change it?")) {
      
              checkboxSwitch.persist();
      
              // saving it to the database
              await put(`${process.env.API_PATH}/person`,
                {
                  "id": personData[row - 1].id,
                  "name": personData[row - 1].name,
                  "recurring": checkboxSwitch.target.checked
                });
              reload(`${process.env.API_PATH}/person`);
      
            } else {
              return null;
            }
          }}/>
        );
      }
      

      【讨论】:

      • 您也可以在此事件处理程序中使用checkboxSwitch.target.checked 而不是checkbox.state。这将具有更新后的值。
      • 感谢@DiegoHaz,效果很好!我编辑了我的答案以添加它,更加干净和专业!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多