react之使用react-router-dom

4,200 阅读2分钟

安装

npm install react-router-dom --save-dev 

使用路由前的配置

  1. 在index.js 文件中 根组件中加入路由
import { HashRouter, Route } from 'react-router-dom'
// 根组件
const Root = () => (
      <HashRouter basename="/">
          <Route path={`/`} component={App} />
      </HashRouter>
)
  1. 新建两个组件

分别为WarnMes1和WarnMes2

export default class WarnMes1 extends Component {
    constructor(props) {
        super(props);
        this.state = {
        }
    }

    componentDidUpdate() {

    }

    componentDidMount() {

    }
    
    render() {
        return (
            <div className="WarnMes">
               WarnMes1
            </div>
         )
    }
}

export default class WarnMes2 extends Component {
    constructor(props) {
        super(props);
        this.state = {
        }
    }

    componentDidUpdate() {

    }

    componentDidMount() {

    }
    
    render() {
        return (
            <div className="WarnMes">
               WarnMes2
            </div>
         )
    }
}
  1. 配置路由 可以在App.js中配置,也可以单独新建一个js配置,这里比较简单就直接在App.js中配置
import WarnMes1 from './Pages/WarnMes1'
import WarnMes2 from './Pages/WarnMes2' // 引入对应的组件
... 
// 列表页
class App extends Component {
  render() {
    const {match } = this.props
    const parentPath = match.path
    return(
        <Fragment>
          <Switch>
            {/* <Route exact path={`${parentPath}/`} component={NavigateMonitor} /> */}
            <Route path={`${parentPath}WarnMes1`} component={WarnMes1} ></Route>
            <Route path={`${parentPath}WarnMes2`} component={WarnMes2} ></Route>
          </Switch>
        </Fragment>
    )
  }
}

配置完后,就可以直接访问页面了。

路由跳转的方式

a标签跳转

import React from 'react';
export default class WarnMes1 extends React.Component {
    render() {
        return (
            <div>
                <a href='#/WarnMes2'>去WarnMes2</a>
            </div>
        )
    }
}

通过router提供的history.push跳转

在使用方法之前要先使用router提供的withRouter方法,在暴露路由组件的地方,用withRouter包起来

import { Switch, Route, withRouter } from 'react-router-dom'
class App extends Component {
  ...
}
export default withRouter(App);
// 这样在路由配置的界面就可以在props中调用history.push方法,实现跳转
this.props.history.push(url);  // url为要跳转的链接

注意

如果有子组件没有写在路由中,也要使用路由提供的方法,可以使用@(装饰器,详见这篇文章)引入withRouter,代码如下:

import { withRouter } from 'react-router-dom'   // 引入withRouter
@withRouter   // 使用装饰器
class Forback extends Component {
    constructor(props) {
        super(props);
        this.state = {
            
        }
    }

    pathRepalce() {
        const {url} = this.props;
        if (url === 'null') {

        } else {
            this.props.history.push(url);
        };
       
    }

    render() {
        // const {mes} = this.state;
        return (
            <div>
                <div className="bottomButton">
                    <Icon type="left" size={'lg'}  onClick={() => this.pathRepalce()}/>
                    <span className="right"><Icon type="right" size={'lg'} /></span>
                </div>
            </div>
        )
    }
}

link 方法跳转

import { Link } from 'react-router'
export default React.createClass({
  render() {
    return <Link {...this.props} activeClassName="active"/>
  }
})
// Link组件最终会渲染为 HTML 标签 a,只是对比a,Link组件避免了不必要的重渲染,从而减少DOM性能消耗。所以对比a尽量使用link吧。

url传参

直接在路由界面中url中传参

...
<Route path={`${parentPath}WarnMes1:id`} component={WarnMes1} ></Route> // 有默认
...

使用this.props.match.params获取url传过来的参数:

...
componentDidMount() {
    console.log(this.props.match.params);
}
...

这种方法用的很少

隐式传参(使用push函数)

this.props.history.push({
    pathname: url, 
    query: {
        historyData: historyData,
        val: searchVal
    }
});

在跳转到的界面可以直接获取到值

...
componentDidMount() {
  //console.log(this.props.match.params);
  console.log(this.props.history.location.state);
}
...

react路由的5种模式

  1. BrowserRouter:浏览器的路由方式,也就是在开发中最常使用的路由方式 此模式是最常用的模式,但是在打包后,打开会发现访问不了页面,可以通过配置nginx解决或者后台配置代理

  2. HashRouter:在路径前加入#号成为一个哈希值,Hash模式的好处是,再也不会因为我们刷新而找不到我们的对应路径,但是链接上面会有#/,不好看,实际开发中用这种模式的也少

// 在根组件中 项目中最外面的index.js
import { BrowserRouter, HashRouter, Route } from 'react-router-dom'

// 根组件
const Root = () => (
  <Provider {...Store}>
    <BrowserRouter basename="/">   // 这里换成HashRouter 就是HashRouter模式
        <Route path={`/`} component={App} />
    </BrowserRouter>
  </Provider>
)
  1. MemoryRouter:不存储history,所有路由过程保存在内存里,不能进行前进后退,因为地址栏没有发生任何变化

  2. NativeRouter:经常配合ReactNative使用,多用于移动端

  3. StaticRouter:设置静态路由,需要和后台服务器配合设置,比如设置服务端渲染时使用