react-router 的配置及使用

官方文档:https://reactrouter.com/web/example/basic

一、路由基本配置

安装路由:

cnpm install --save-dev react-router-dom

引入路由:

import { BrowserRouter as Router, Route, Switch, Link, Prompt, useParams, useRouteMatch, Redirect, useHistory, useLocation } from 'react-router-dom'

路由配置:

function App() {
  return (
    <div className="App">
      <Router>
        {/* 路由的入口 */}
        <ul>
          <li> <Link to="/">home</Link></li>
          <li> <Link to="/cart">cart</Link></li>
          <li> <Link to="/my">my</Link></li>
        </ul>
        
        {/* 路由的出口 */}
        <Switch>
          {/* <Route exact path="/" component={Home}></Route>
          <Route path="/cart" component={Cart}></Route>
          <Route path="/my" component={My}></Route> */}
          
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/cart">
            <Cart />
          </Route>
          <Route path="/my">
            <My />
          </Route>
        </Switch>
      </Router>
    </div>
  );
}

exact 可以使路由的匹配更严格一些,防止默认显示第一条路由。

二、路由传值

1、动态传值

(1)在路由路径后直接定义参数 /:id

<Route path="/params/:id">
  <Params></Params>
</Route>

(2)传值,在路径后直接传值:

<Link to="/params/10086">params</Link>

(3)子组件里边接收传过来的值:

  • 如果是函数组件,可以使用 useParams 来接收(引入路由时还要引入useParams)。
function Params() {
  let { id } = useParams();   //使用结构赋值
  return (
    <div className="home">
      动态传值:{id}    //绑定值
    </div>
  )
}

注意:函数组件因为不存在状态和生命周期,它里面可以使用react-hook,如:useStateuseEffect 等;
类组件里边不能使用Hooks。

  • 在类组件中获取动态传值,可以使用this.props.match.params来接收:
    componentDidMount() {
        //在类组件中获取动态传值   
        //使用this.props.match.params
        console.log(this.props.match.params);
    }

注意使用该方法来接收动态传值时,路由配置要写成如下样式:

<Route path="/cart" component={Cart}></Route>

2、get传值

(1)直接路径后边写传值

(2)接收get传值

  • 使用url解析:

引入url模块 :

import url from ‘url’

获取get传值:

    componentDidMount() {
        console.log(url.parse(this.props.location.search,true).query);   {id:10086}
        console.log(this.props.location.search);   //?id=10086
    }
  • 函数组件,可以使用URLSearchParams来获取get传值:
  let query = new URLSearchParams(useLocation().search);
  console.log(query.get('number'));

三、路由嵌套

哪个子组件需要子路由,哪个子组件再来一套<Router></Router>

注意:只有函数组件才可以使用useRouteMatch()获取父级路由的pathurl

子组件:

function Cart() {
  //使用`useRouteMatch()`获取父级路由的`path`和`url`
  let {path,url} =useRouteMatch();
  return (
    <div className="home">
      购物车
      <Router>
        <ul>
          <li><Link to={`${url}/one`}>one</Link></li>
          <li><Link to={`${url}/two`}>two</Link></li>
        </ul>
        <Switch>
          <Route exact path={`${path}/one`}>
            <One />
          </Route>
          <Route path={`${path}/two`}>
            <Two />
          </Route>
        </Switch>
      </Router>
    </div>
  )
}

如果子组件是类组件,如何获取urlpath
this.props.match上获取。

let {path,url} =this.props.match;

四、路由重定向

直接使用Redirect
如果找不到路径,直接重定向到"/"

<Switch>
  <Route exact path="/">
    <Home />
  </Route>
  <Route path="/cart">
    <Cart />
  </Route>
  <Redirect to="/"></Redirect>
</Switch>

五、路由回退、地址相关

函数组件里边使用useHistory()useLocation() 钩子函数;
类组件里边使用this.props.historythis.props.location

六、Prompt 对话框

可以用来做切换路由确认,确认是否跳转。添加在子组件里边。

function Home() {
  let [issub, setsub] = useState(false);

  return (
    <div className="home">
      首页
      <form onSubmit={event => {
        event.stopPropagation();
        event.preventDefault();
        setsub(false);
        return false;
      }}>
        <Prompt when={issub} message={location => `Are you sure you want to go to ${location.pathname}`}></Prompt>
        <input type='text' onChange={event => {
          if (event.target.value.length > 0)
            setsub(true);
        }} />
        <button>按钮</button>
      </form>
    </div>
  )
}

七、路由添加过渡、动画

安装 react-transition-group

cnpm install --save-dev  react-transition-group

新建fade.css文件,写过渡
如:

.fade-enter {
  opacity: 0;
  z-index: 1;
}

.fade-enter.fade-enter-active {
  opacity: 1;
  transition: opacity 250ms ease-in;
}

.fade-exit.fade-exit-active {
  opacity: 0;
  transition: opacity 250ms ease-in;
}

在组件中引入fade.css

import "../../CSS/fade.css";

引入TransitionGroup、CSSTransition


import { TransitionGroup, CSSTransition } from 'react-transition-group'

给switch标签外添加TransitionGroup、CSSTransition 标签:

    <TransitionGroup>
      <CSSTransition key={location.key} classNames="fade" timeout={200}>
        <Switch>
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/cart">
            <Cart />
          </Route>
          <Redirect to="/"></Redirect>
        </Switch>
      </CSSTransition>
    </TransitionGroup>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值