代码适用于 react-router-dom 4.3.1 但不适用于 5.2.0

Code works on react-router-dom 4.3.1 but not on 5.2.0

tl;dr:下面的代码不适用于 react-router-dom5.2.0 版本,但适用于 4.3.1

上下文:我正在使用 CodeSandBox 在线修补一些客户端路由代码,特别是利用 react-router-dom 模块。以下是应用程序的一些相关片段:

index.js

import React from "react";
import ReactDOM from "react-dom";

import { Link, BrowserRouter } from "react-router-dom";
import StyledMenuItem from "./StyledMenuItem";

function App() {
  return (
    <React.Fragment>
      <StyledMenuItem component={Link} to={"/hello"}>
        <span>Hello Link</span>
      </StyledMenuItem>

      <br />
      <br />

      <Link to={"/world"}>World Link</Link>
    </React.Fragment>
  );
}

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.querySelector("#app")
);

StyledMenuItem.jsx

import React, { Component } from "react";
export default class StyledMenuItem extends Component {
  render() {
    let WrapperComponent = this.props.component;
    if (WrapperComponent === undefined) {
      WrapperComponent = React.Fragment;
    }

    return (
      <WrapperComponent {...this.props}>{this.props.children}</WrapperComponent>
    );
  }
}

基本上,我是在修补并试图模仿 Material-UI 的 MenuItem API 的 component 道具的行为.

让我感到困惑的问题:to '/hello' 的 LinkCodeSandBox 上不起作用,但 它在我的本地环境中起作用。我对 react & react-dom 的相同版本使用完全相同的代码,即 16.13.1.

根据我的调查:我的本地环境 react-router-dom 没有更新。在 CodeSandBox 上,我使用的是 react-router-dom 5.2.0;在我的本地环境中,我使用 react-router-dom 4.3.1

为此,回到 CodeSandBox 我尝试在不同版本上测试它(CodeSandBox 有一个很酷的功能,可以让您更改包版本)。


我已经在两个版本上进行了测试,我可以确认这个问题肯定与我的软件包版本有关。

现在,我的问题是:react-router-dom 5.2.0 包的代码更改是什么停止支持我正在 react-router-dom 4.3.1 上运行的代码?

你可以很容易地比较源代码,但只要快速浏览一下你的代码,我猜这与你传递给 Link 的额外道具有关。如果你从 props 中解构 component 那么它似乎可以在你的沙箱中工作。

import React, { Component } from "react";

export default class StyledMenuItem extends Component {
  render() {
    const { component, ...rest } = this.props; // <-- destructure and pass on the rest

    let WrapperComponent = component;
    if (WrapperComponent === undefined) {
      WrapperComponent = React.Fragment;
    }

    return <WrapperComponent {...rest}>{this.props.children}</WrapperComponent>;
  }
}