路由

334 阅读4分钟

1.前端路由

前端路由的基石是history.js,浏览器的历史记录,是一个栈的结构(先进后出)。他主要分为两种,一种是hash模式,地址栏会带上#,相当于锚点跳转,不会引起页面的刷新,但是可以进行页面跳转,一种是新的形式history模式,它在使用时,需要事先下载(### react-router的原理是只更新变化的部分从而减少DOM性能消耗)。要明确展示区和导航区

1-1.png

1)路由链接(导航区):引起路由的变化

原生的html直接使用a标签就可以进行路由的跳转,在react中我们要在上方用import引入一个Link组件,这个组件由react-router-dom内部定义,用于链接跳转。Link的外边还需要包裹着Router,Router分为BrowerRouter和HashRouter两种。需要明确具体是哪一种Router,此外link里面的to='/XXX' 单引号里面是没有.的。

2)注册路由(展示区):外边也需要包裹着是哪一种Router。

<Route path='/' component={XXX}></Route>

当页面跳转到XXX页面时,展示XXX组件

但是由于整一个应用应该只有一个路由器包裹,所以可以在总的app里面包裹着Router

3)路由组件和一般组件的不同

写法不同:

一般组件:<Demo/>
路由组件:<Route path="/Demo" component={Demo} />

存放文件夹位置不同:

一般组件:components
路由组件:pages

接收到的props不同(根本区别):

一般组件:组件标签写什么值就传什么值
路由组件:会接收到路由的信息(history、location、match等),也可以传自定义的属性值

1-2.png

4)Navlink会在匹配上当前的url的时候给已经渲染的元素添加参数

21-01.png

21-02.png 另外props 是接受属性的,但是标签体内容也属于特殊的属性

5)swtich

Switch匹配到第一个路由就不会继续匹配了,实现单一匹配

6)解决css样式丢失

href='./css.css' 中 引入样式时不写 ./ ,带.是当前路径下的,是相对路径,不带的话就是直接从localhost中

'./css.css' 中 引入样式时不写 ./ 写 %PUBLIC_URL%(绝对路径)

带点的话可以使用改变路由方式的方法,使用HashRouter,但是此方法不常用

7)精准匹配与模糊匹配

精准匹配:extra={true},开启精准匹配

如果路由谁都没有匹配到,就用Redirect,to到具体要到的位置

8)Redirect

跳转式可以用浏览器的回退按钮返回上一级的,而重定向是不可以的。

标签重定向:就是利用<Redirect>标签来进行重定向,业务逻辑不复杂时建议使用这种。

编程式重定向:这种是利用编程的方式,一般用于业务逻辑当中,比如登录成功后跳转到首页

this.props.history.push("/web/home");
    // 返回到上一级页面的几种方法
    //第一种 this.props.history.push("/web/home");
    //第一种 this.props.history.replace("/web/home"); 
    //第三种方法,推荐使用 window.history.back(-1);推荐此方法
    

9)嵌套路由

大概过程就是注册,挂载展示,再注册,继续挂载展示,

1.注册的子路由需要写上父路由的Path值,

2.路由的匹配是按照注册的顺序来的

10)向路由传递参数--Params

刷新页面参数不会消失,参数在地址栏显示,需要在路由页面配置

1.传递参数的几种方法

HTML 带谁就传谁,这里是传递参数

<Link to={ `/路径/${obj.id}/${obj.title} ` }>XXXX</Link>

JS 带谁就传谁,这里是传递参数

this.props.history.push`/路径/${obj.id}/${obj.title} ` )

2.路由表 注册路由(声明接受)

<Route path='/路径/:id/:title' component={candy}>

3.接受参数

通过 this.props.match.params.id

11)向路由传递参数state

页面刷新参数不丢失,state传递的参数是加密的,不支持hashrouter

1.传递参数

<Link to={{pathname: '/路径', state: {key: value}}} /> 

2.声明接受

<Route path="/路径" />

12)向路由中传递参数search

页面刷新后参数丢失

1.传递参数

<Link to={`/路径/?key=${变量}`} />

2.声明接受

<Route path="/路径" />
打印看一下结果
console.log(this.props.location.search) //?key=value&key=value

需要引入querystring会自动解析如上的格式,但开头会带着?可以直接用slice删除
import qs from 'querystring'
const obj = qs.parse(this.props.location.search.slice(1))

13)react中路由跳转push与replace的区别

push 是堆栈的模式,会留下痕迹,可以返回上一级

replace不会返回上一级,是一种替换,一般用于登录成功后

14)Withrouter

可以加工一个组件,使他具有路由组件的所特有的API,它返回的是一个新组件

15) react-router HashRouter和BrowserRouter

1636085934(1).png