如果在React React路由器中没有匹配,如何获取交换机的状态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果在React React路由器中没有匹配,如何获取交换机的状态相关的知识,希望对你有一定的参考价值。

我正在使用ReactRouter,并希望在命中RouteNotFound组件时执行类似设置状态的操作(最后一个意味着没有其他匹配的匹配)。

我的this.handler做了一个setState,这样我就可以告诉它被调用了。这当然给了我一个错误,说“无法在现有状态转换期间更新,例如在渲染中”。

有没有办法可以设置我的状态告诉我哪些(我真的想知道最后一个)switch语句执行?

render() {
    return (
        <div>
            <Switch>
                <Route exact path="/" component={Home}/>
                <Route exact path="/p1" component={p1}/>
                <Route exact path="/p2" component={p2}/>
                <RouteNotFound action={this.handler} ></RouteNotFound>
            </Switch>
        </div>
    );
}
答案

开始了:

未found.js:

import React from 'react';
import { Route } from 'react-router-dom';

const RouteNoteFound = ({ action }) => (
  <Route
    render={props => (
      <NotFoundPageComponent action={action} />
    )}
  />
);


export default RouteNoteFound;

class NotFoundPageComponent extends React.Component {
  constructor(props) {
    super(props);
  }

  componentWillMount() {
    this.props.action()
  }

  render() {
    return (
      <div>404 not found</div>
    )
  }
}

并在index.js中:

handler = () => {
    alert("alert from app.js but run in not found page")
}

render() {
    return (
      <BrowserRouter>
        <Switch>
          <Route exact path="/" component={Page} />
          <Route path="/page" component={Page} />
          <RouteNoteFound action={this.handler} />
        </Switch>
      </BrowserRouter>
    );
}

这里是stackblitz的DEMO

另一答案

试试这个。

像这样定义未找到的路线:

<Route render={props => <RouteNotFound action={this.handler} />}></Route>

因为,根据Doc

没有路径道具的<Route>或没有来自道具的<Redirect>将始终与当前位置匹配。

检查Doc example的“无路径匹配”。

现在在RouteNotFound组件中使用componentDidMount生命周期方法,每当RouteNotFound将被渲染时,将调用componentDidMount。从componentDidMount调用父函数,如下所示:

componentDidMount(){
   this.props.action();
}

现在在父组件中的action中执行setState。

以上是关于如果在React React路由器中没有匹配,如何获取交换机的状态的主要内容,如果未能解决你的问题,请参考以下文章

React 路由器无法处理路由并返回不匹配的警告

如何使用 React Router 的重定向功能?

react属性之exact

当路由匹配时,React Router 不显示组件(但渲染工作)

React 组件未显示在匹配的路由上(react-router-dom)

React Router匹配对象null响应问题