React入门八

路由

一、路由

路由的基本使用我们已经讲过了,现在讲讲路由传参。

1.1、路由传参

路由传参完成的是组件之间的数据传递(组件传值)

1)、params

  • ​ 路由配置
<Route path='/Inbox/:id' component={Inbox} />
  • 路由跳转(传值)
//声明式导航:
<NavLink to={'/Inbox/01008'} >铅笔</NavLink>
//编程式导航:
this.props.history.push( '/Inbox/'+'01008' )
  • 取值
this.props.match.params.id 

优缺点:

优势 : 刷新,参数依然存在。

缺点 : 只能传字符串,并且,如果传的值太多的话,url会变的很长。

2)、query

  • 路由配置

​ 不用改变路由配置(类似于vue路由中的query)

<Route path='/Inbox' component={Inbox} />
  • 路由跳转(传值)
//声明式导航:
<Link to={{pathname:'/Inbox',query:{id:'01009'}}} >铅笔</Link>
//编程式导航:
this.props.history.push( {pathname:'/Inbox',query:{id:'01009'}} )
  • 取值
this.props.location.query.id

优缺点:

优势:参数不显示在地址栏,美观;

缺点:刷新地址栏,参数丢失

3)、state

​ 类似于query,只是state传的参数是加密的,query传的参数是公开的,使用方法只需要把query改为state即可

  • 路由配置

​ 不用改变路由配置。

<Route path='/Inbox' component={Inbox} />
  • 路由跳转(传值)
//声明式导航
<Link to={{pathname:'/Inbox',state:{id:'01009'}}} >铅笔</Link>
//编程式导航
this.props.history.push({pathname:'/Inbox',state:{id:"01"}});
  • 取值
this.props.location.state.id

优缺点:

优势:参数不显示在地址栏,美观;

缺点:刷新地址栏,(hash方式会丢失参数,Browser模式不会丢失参数)。

4)、search

  • 路由配置

​ 不用改变路由配置。

<Route path='/Inbox' component={Inbox} />
  • 传值
//声明式导航
<Link to='/Inbox?a=1&b=2' >铅笔</Link>
//编程式导航
this.props.history.push({pathname:'/Inbox',search:'?a=1&b=2'})
  • 取值
this.props.location.search

注意:

用location.search所获取的是查询字符串,所以,还需要进一步的解析,也可以使用第三方模块:qs,或者nodejs里的query-string

1.2、路由上下文

在react-router里面,如果组件是通过路由跳转的,那么它会把路由相关的API挂在了组件的props上(vue-Router使用的 r o u t e r 和 router和 router和route),并且分为history,location,match。

history: 历史,用来跳转的,并做历史记录。
location:  地址,地址栏上路径,并保存着query,state,search等数据。
match: 匹配,匹配到的路径

1.3、非路由跳转的组件获取路由上下文

在这之前,我们先看看组件在页面上展示的两种情况下,props对象的内容

1)、标签名的方式直接展示的组件(没有属性),值为空

2)、路由跳转的方式展示的组件,props会自动增加属性:history,match,location。

那么, 如果用标签名的方式,如何获取到路由上下文?往下看。

  • 通过属性传递

    首先当前组件是路由跳转过来的,然后把路由上下文通过属性的方式传递给子组件。

     <AboutSub02 {...this.props} />
    
  • 通过withRouter包装

    接收路由上下文的组件用withRouter函数(高阶组件)进行包裹

如:

import {withRouter} from 'react-router-dom'

class 组件 extends Component{
    
}

export default withRouter(组件)

1.4、exact属性

react的路由匹配默认是模糊的,包容的,如果想使用严格匹配,那么,把Route组件的exact属性设置为true。

<Route exact={true} path="/" component={App} />

1.5、404

在路由配置里不设置path属性,那么,就总是会匹配上。404页面可以用(结合Switch)

<Route component={Error}/> 总是会匹配

1.6、Switch

​ 排他性匹配

​简单理解:匹配到第一个就不再匹配,除非地址改变。


区分:exact和switch

excat:表示匹配规则,exact={true} 表示地址栏的路径和路由配置中path必须完全相等才能匹配到。

switch:表示排他性,即:一旦匹配成功后,就不再匹配其它路由匹配。

1.7、Redirect

类似于vue中的重定向。(这里是一个组件)

<Redirect exact={true} from="/" to="/Home" />

react路由的一些扩展(了解)

组件及其作用:

组件作用
路由模式BrowserRouter约定模式 为 history,使用 HTML5 提供的 history API 来保持 UI 和 URL 的同步
路由模式HashRouter约定模式 为 hash,使用 URL 的 hash 来保持 UI 和URL 的同步
声明式跳转NavLink声明式跳转 还可以约定 路由激活状态
声明式跳转Link声明式跳转 无激活状态
重定向Redirect重定向 ~~ replace
匹配并展示Route匹配组件,并展示组件。即匹配成功后,组件立即被替换成匹配的组件
排他性匹配Switch排他性匹配。如果不想使用包容性,那么使用Switch。
高阶组件withRouter把不是通过路由切换过来的组件中,将 history、location、match 三个对象传入props对象上(高阶组件)

结构

  • BrowserRouter|HashRouter

    App(或其它组件)

    • NavLink|Link
    • Route
    • Redirect
      • 子组件
        • NavLink|Link
        • Route

BrowserRouter

属性类型作用
basenamestring所有位置的基本URL。如果您的应用是从服务器上的子目录提供的,则需要将其设置为子目录。格式正确的基本名称应以斜杠开头,但不能以斜杠结尾
getUserConfirmationFunction用于确认导航的功能。默认使用window.confirm

Route

属性类型作用
pathstring |object路由匹配路径。没有path属性的Route 总是会 匹配
exactboolean为true时,要求全路径匹配(/home)。路由默认为“包含”的(/和/home都匹配),这意味着多个 Route 可以同时进行匹配和渲染
componentFunction |component在地址匹配的时候React的组件才会被渲染,route props也会随着一起被渲染
renderFunction内联渲染和包装组件,要求要返回目标组件的调用

Link

属性类型作用
tostring | 对象{pathname:,search:,hash:}要跳转的路径或地址
replaceboolean是否替换历史记录

NavLink

属性类型作用
tostring|对象{pathname:,search:,hash:}要跳转的路径或地址
replaceboolean是否替换历史记录
activeClassNamestring当元素被选中时,设置选中样式,默认值为 active
activeStyleobject当元素被选中时,设置选中样式

Switch

该组件用来渲染匹配地址的第一个Route或者Redirect,仅渲染一个路由,排他性路由,默认全匹配(场景:侧边栏,引导选项卡等)

属性类型作用
locationstring object
childrennode

Redirect

该组件用来渲染匹配地址的第一个Route或者Redirect,仅渲染一个路由,排他性路由,默认全匹配(场景:侧边栏和面包屑,引导选项卡等

属性类型作用
fromstring来自
tostring object去向
pushboolean添加历史记录
exactboolean严格匹配
sensitiveboolean区分大小写

二、选择器冲突解决方案

2.1、命名空间 BEM

BEM(Block, Element, Modifier)是由Yandex团队提出的一种前端命名规范。其核心思想是将页面拆分成一个个独立的富有语义的块(blocks),十分有利于代码复用。

    Block:代表块(Block):也是模块的意思
    Element:元素(Element):
    Modifier: 修饰符(Modifier)

2.2、模块化

import 变量  from './css/xx.module.css' 
<jsx className={变量.类名|id}

//step1 (脚手架默认配置了)
webpack配置 "style-loader!css-loader?modules" | module:true


//step2 模块化时
改名xx.css -> xx.module.css 

2.3、scss

  • 安装: node-sass
npm i node-sass -S
  • 引入sass
//1)、普通引入
import 'xx/xx.scss'

   <jsx className="box" />



//2)、模块化
import style form xx.module.scss

   <jsx className={style.box}

  • 引入全局的(公共的)scss
 - 局部scss文件内部: @import './全局.scss'

 - webpack配置一次,局部scss内部直接使用
//1. 安装插件 : sass-resources-loader
//2. 配置修改webpack.config.js

{
  test:sassRegex,
  ...
  use: [
    {loader:'style-loader'},
    {loader:'css-loader'}, 
    {loader:'sass-loader'},
    {
      loader: 'sass-resources-loader',
      options:{
        resources:'./src/xx/全局主题.scss'
      }
    }
  ]
}

注意:

loader:'css-loader?modules'    ?modules 模块化时需要添加
resources 指向作用域在项目环境下

三、async和await

es7用来彻底解决回调地狱的问题。

具体的可以参考

async await

原文地址:https://blog.csdn.net/qq_38256266/article/details/120190387

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom