LoginSignup
3
0

More than 1 year has passed since last update.

【React】 `value` prop on `input` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components.の対処法

Last updated at Posted at 2021-12-23

症状

ReactでMaterialUIのAPPbarを使用したときに以下の警告が表示されました。

翻訳すると、「inputvaluepropはnullであってはなりません。空の文字列を使用してコンポーネントをクリアするか、制御されていないコンポーネントの場合は「未定義」を使用することを検討してください。」でした。
わかりやすい。。。

warn
 `value` prop on `input` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components.

以下ソースです。(元ソースは色々入れてしまったので、MaterialUIのApp Bar with a primary search fieldから一部抜粋で)
searchfieldで関係ありそうなところのみ

App.js
export default function PrimarySearchAppBar() {
  const SessionUserState = useContext(SessionState);
  const SessionUserDispatch = useContext(SessionDispatch);
  const [searchValue, setSearchValue] = useState(SessionUserState.searchWord);

  return (
    <div className={classes.search}>
      <div className={classes.searchIcon}
        <SearchIcon />
      </div>
      <InputBase
        placeholder="Search foods…"
        value={searchValue}
        onKeyPress={(event) =>
          onKeyPressSerchWord(event)
        }
        onChange={(event) => {
          setSearchValue(event.target.value)
        }
        }
        classes={{
          root: classes.inputRoot,
          input: classes.inputInput,
        }}
        inputProps={{ 'aria-label': 'search' }}
      />
    </div>
  )
}

解決策

このwarnではinputにnullが入ってしまう瞬間があったため、発生したようです。
今回の例だと、Reducerから値を受け取るまでにinputにnullが入る瞬間があったため、nullの時は空文字が入るように修正して解決しました。

App.js
export default function PrimarySearchAppBar() {
  const SessionUserState = useContext(SessionState);
  const SessionUserDispatch = useContext(SessionDispatch);
  const [searchValue, setSearchValue] = useState(SessionUserState.searchWord === null ? "" : SessionUserState.searchWord);

  return (
    <div className={classes.search}>
      <div className={classes.searchIcon}
        <SearchIcon />
      </div>
      <InputBase
        placeholder="Search foods…"
        value={searchValue}
        onKeyPress={(event) =>
          onKeyPressSerchWord(event)
        }
        onChange={(event) => {
          setSearchValue(event.target.value)
        }
        }
        classes={{
          root: classes.inputRoot,
          input: classes.inputInput,
        }}
        inputProps={{ 'aria-label': 'search' }}
      />
    </div>
  )
}

参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0