在React中单击鼠标并在单击一次后输入键盘禁用

Mouse click and enter keyboard disable after one click in React

我想做的是:我想做的是当你用鼠标点击一个按钮或从键盘输入时,你不能再点击它。换句话说,按一次按钮后将其禁用。

第二次用鼠标点击可以,但我不能用回车。

我的代码如下

function HomeFood() {
    const [food, setFood] = useState(null);
    const [calories, setCalories] = useState('');
    const [disabled, setDisabled] = useState(false);

    async function foodData() {
        const result = await axios.get(`link`);
        console.log('DATA RESULTS:', result.data);
        setFood(result.data)
    }

    function handleChange(e) {
        setCalories(e.target.value);
    }

    function handleKeyPress(e) {
        if (e.key === 'Enter') {
            foodData()
        }
    }

    return (
        <div className="container">
            <section className='food'>
                <input
                    type='number'
                    onChange={handleChange}
                    onKeyPress={handleKeyPress}
                />
                <button
                    onClick={() => {
                        foodData();
                        setDisabled(true);
                    }}
                    disabled={disabled}
                >
                    Click here
                </button>
            </section>
            {food && <FoodNutrients mealsData={food}/>}
        </div>
    );
}

我尝试在 onKeyPress 函数中使用禁用状态,但只出现错误。我也试过将它放在 onKeyPress 的输入中,但又出现了更多错误。

就像 onClick 一样,在 handleKeyPress 中调用 setDisabled:

function handleKeyPress(e) {
    if (e.key === 'Enter') {

       if (disabled) { // do nothing if already disabled
           return;
        }

        foodData();
        setDisabled(true);
    }
}

添加第二个禁用状态,即 inputDisabled 并以相同的方式切换它。这允许每个独立于另一个禁用。

function HomeFood() {
  const [food, setFood] = useState(null);
  const [calories, setCalories] = useState('');
  const [disabled, setDisabled] = useState(false);
  const [inputDisabled, setInputDisabled] = useState(false); // <-- new state

  async function foodData() {
      const result = await axios.get(`link`);
      console.log('DATA RESULTS:', result.data);
      setFood(result.data)
  }

  function handleChange(e) {
      setCalories(e.target.value);
  }

  function handleKeyPress(e) {
      if (e.key === 'Enter') {
          foodData();
          setInputDisabled(true); // <-- set input disabled
      }
  }

  return (
      <div className="container">
          <section className='food'>
              <input
                  type='number'
                  onChange={handleChange}
                  onKeyPress={handleKeyPress}
                  disabled={inputDisabled} // <-- attach disabled prop
              />
              <button
                  onClick={() => {
                      foodData();
                      setDisabled(true);
                  }}
                  disabled={disabled}
              >
                  Click here
              </button>
          </section>
          {food && <FoodNutrients mealsData={food}/>}
      </div>
  );
}

如果您希望它们同时被禁用,那么只需对两者使用相同的 disabled 状态和 setter。