React学习之路由信息

会使用属性来传入相应的组件

## history属性

它不是window.history对象,我们利用该对象进行无刷新跳转地址

**为什么不直接使用window.history对象**

1.React-Router中有两种模式,HashRouter(hash),BrowserRouter(history)如果使用window.history,只能支持一种模式

2.当使用window.history.pushState方法是,没有办法收到通知,将导致React无法知道地址发生了变化,结果导致无法重新渲染组件

 push:将某个新的地址入栈(历史记录栈)

  参数1:新的地址

  参数2:可选,附带的状态

 replace:将某个新的地址替换为当前栈中的地址

  参数1:新的地址

  参数2:可选,附带的状态

 go:与window.history一致

 forward:与window.history一致

 back:与window.history一致

##location属性

 props.history与props.history.location完全一致.但是与window.location不同

 loaction对象中记录的是当前地址信息

 通常使用第三方库“query-string”来进行解析地址栏中的数据

 pathname:路径名

 search:地址参数

 hash:hash值

 state:附加状态

##match属性

保存了路由匹配的相关信息

-isExact:当前路径和路由的配置是否精确匹配

**向某个页面传送数据的方式**

1.使用state:在push页面时,加入state

2.使用search:在地址栏中加入数据(常用)

3.使用hash:把数据填写到hash中

4.使用params:把数据填写到路径中(常用)

-params: <Route path="/a/:year/:mouth/day" component={A} />  props.params.year = yaer

 <Route path="/a/:year/:mouth/day" component={A} /> (可传可不传)

 <Route path="/a/:year(正则表达式)/:mouth?/day?" component={A} /> (用来约束year数据)

 

##非路由组件获取路由信息的方法

1.某些组件,没有放到Route组件中,而是被嵌套在普通组件中,因此它的props中没有路由信息,如果这些组件需要获取到路由信息,可以使用下面两种方式

-将路由信息从父组件一层一层传递下去

-使用react-router自带的高阶组件withRouter,包装要使用的组件,该高阶组件会返回一个新组件,新组件被注入路由信息

import React from 'react';
import './App.css';
import qs from 'query-string'
// 多个路由切换需要用 Switch 
import { BrowserRouter, Route, Redirect, Switch } from 'react-router-dom'
function A(props) {
  console.log("组件A");
  console.log(props);
  return (
    <div>
      组件A的状态:{props.location.state}
      <h1>组件A</h1>
    </div>
  )
}
function B(props) {
  console.log("组件B");
  console.log(props);
  return (
    <div>
      组件B的状态:{props.location.state}
      <h1>组件B</h1>
    </div>
  )
}
function C(props) {
  console.log("组件C");
  console.log(props);
  return (
    <button onClick={e => {
      // console.log(this.props)
      if(props.location.pathname ==="/b"){
        props.history.push("/a", "获得状态A")
      }else{
        props.history.push("/b", "获得状态B")
      }
      

    }}>按钮C</button>
  )
}

function App() {
  return (
    // <>
    <BrowserRouter >
      <Switch>
        <Route path="/a/:year/:mouth/day" component={A} />
        <Route path="/b" component={B} />
      </Switch>
      <Route path="/" component={C} />
    </BrowserRouter>

    // {/* <h1>46489789</h1> */}
    // </>

  );
}

export default App;

 

posted @ 2020-12-24 17:44  漫漫长路上的求知者  阅读(156)  评论(0编辑  收藏  举报