😊

React チェックボックス実装時に uncontrolled input が出た時の対処

に公開2

チェックボックス実装時に uncontrolled input のwarnig が出た

チェックボックスをクリックすると下記の warnig が出た

component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. 

対象コード

 <input
    type='checkbox'
    id={companyId}
    checked={isChecked(companyId)}
    onChange={() => onChangeHandler(companyId)}
/>

調査

エラー内容をそのままググる。

https://blog.mitsuruog.info/2017/09/react-uncontrolled-input

上記記事などを参考に、State の値が、nullかundefinedになってしまうタイミングがないように state へ初期値をもたせたりしたがNGだった。

少し抽象化すると state null か undefined が入ることがNGなのではなく、input の value へ falsy な値が入ることが問題なのでは、と仮説が出てきた。

修正

 <input
    type='checkbox'
    id={companyId}
    checked={isChecked(companyId) || false}
    onChange={() => onChangeHandler(companyId)}
/>

falsy な値が入らないようにした。

感想

  • 正直これが正解なのかわからない
  • input text のエラーに関しての記事は多くあったが、checkbox に関しての記事を見つけることができず苦労した。

Discussion

Honey32Honey32

失礼します。

isChecked の中で console.log を呼び出すことで、その瞬間瞬間の返り値を記録することができます。

たぶん { companyId: <id>, checked: undefined } のようにコンソールに表示される瞬間がどこかにあると思います。(とくに初期値のとき)

const isChecked = (companyId: string): boolean => {
  const checked = ...;

  console.log({ companyId, checked });
  return checked;
}

簡単な回避法として、value ?? false と書いてあげると、value が null か undefined のときは、代わりに undefined が結果となる ようになります。

t_hashit_hashi

度々フィードバックありがとうございます🙏

フィードバックをいただける環境にいないのでとてもありがたいです!!

恥ずかしながら、 ||?? の違いも曖昧でしたので、今 mdn を見て理解しました。。。