MUIのAutoCompleteに怒られた

MUIのAutoCompleteを実装していたらエラーが出ていたので調査。

エラー内容

MUI: A component is changing the controlled value state of Autocomplete to be uncontrolled.  Elements should not switch from uncontrolled to controlled (or vice versa).  Decide between using a controlled or uncontrolled Autocomplete element for the lifetime of the component.  The nature of the state is determined during the first render.  It's considered controlled if the value is not `undefined`.  More info: https://fb.me/react-controlled-components

エラー日本語訳

MUI: コンポーネントが、Autocomplete の制御された値の状態を非制御に変更しています。要素は非制御から制御に (またはその逆に) 切り替えるべきではありません。コンポーネントの存続期間中、制御された Autocomplete 要素と非制御の Autocomplete 要素のどちらを使用するかを決定します。状態の性質は最初のレンダリング時に決定されます。値が `undefined` でない場合は、制御されていると見なされます。詳細: https://fb.me/react-controlled-components

自分なりに噛み砕く

このエラー文を自分なりに噛み砕いて理解しようと思います。

制御・被制御された値とは

こちらの記事が参考になりました。

フォームの入力値がStateで記述されるかRefで記述されるかの違いのようです。つまり「制御」が入力値がStateで「非制御」がRefのことです。

いつ、要素を非制御から制御に変更した?

いつ非制御から制御に変更したのか(またはその逆)と考えていたら、

状態の性質は最初のレンダリング時に決定されます。値が `undefined` でない場合は、制御されていると見なされます。

とエラー文の最後らへんに書いていまして、初期値がundefinedでなければフォームは制御(つまりState)ということを言っていました。なるほど。

じゃあ、どのように対応するか

対応方法を考えていると、下記のサイトが助かりました。

私と同様にAutoCompleteのValue値にundefinedを入れていたようで、undefinedのときはnullを入れる対応を取られていました。

まとめ

今回のエラーはAutoCompleteの初期値による制御コンポーネントと非制御コンポーネントの変更が問題であり、制御コンポーネントは初期値にStateを持つフォームのことで、非制御コンポーネントは初期値にRefを持つコンポーネントでした。対応としてStateで値を管理する場合はValueの初期値にundefinedを入れない対応をする必要がありました。

以上!


この記事が気に入ったらサポートをしてみませんか?