かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

React-router-dom の <Switch> で React does not recognize the `computedMatch` prop on a DOM element. な警告が出る

React-router-dom を使っナビゲーションを作っていた際に下記の warning が表示されてしまいました。

React does not recognize the `computedMatch` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `computedmatch` instead. If you accidentally passed it from a parent component, remove it from the DOM element.

computedMatch という props は自分では書いてなかったので、🤔となりましたが、どうやら <Switch> で使われているようでした。
警告が表示された コンポーネント

// Navigation.jsx
import { NavLink, Route, Switch } from 'react-router-dom';

export default function Navigation() {
  return (
    <nav>
     <Switch>
       <ul>
         <li><NavLink to="/" exact>HOME</NavLink></li>
         <li><NavLink to="/page" exact>Page</NavLink></li>
         <Route path="/page">
           <li><NavLink to="/page/sub" exact>Sub Page</NavLink></li>
         </Router>
       </ul>
     </Switch>
   </nav>
  );
}

<Switch> の直下は <Route><Redirect> でなければならない

Renders the first child <Route> or <Redirect> that matches the location.
cf. - React Router: Declarative Routing for React.js

<Switch> 直下が <ul> になっていたのが原因なので、下記のように修正すれば警告は表示されなくなりました。

// Navigation.jsx
import { NavLink, Route, Switch } from 'react-router-dom';

export default function Navigation() {
  return (
    <nav>
      <ul>
        <li><NavLink to="/" exact>HOME</NavLink></li>
        <li><NavLink to="/page" exact>Page</NavLink></li>
        <Switch>
          <Route path="/page">
            <li><NavLink to="/page/sub" exact>Sub Page</NavLink></li>
         </Router>
        </Switch>
      </ul>
    </nav>
  );
}

 
間にDOM挟むサブナビゲーションとかだと、都度 <Switch> で囲わないとダメそう…


[参考]

Nintendo Switch Lite イエロー

Nintendo Switch Lite イエロー

  • 発売日: 2019/09/20
  • メディア: Video Game
Switch…持ってないから島にはいけない…