Context
提供者与消费者模式
用于组孙组件通讯的场景
1 | import { useState, createContext, useContext } from 'react' |
用于组孙组件通讯的场景
1 | import { useState, createContext, useContext } from 'react' |
React 支持一个特殊的、可以附加到任何组件上的 ref 属性。此属性可以是一个由 React.createRef() 函数创建的对象、或者一个回调函数、或者一个字符串(遗留 API)。当 ref 属性是一个回调函数时,此函数会(根据元素的类型)接收底层 DOM 元素或 class 实例作为其参数。这能够让你直接访问 DOM 元素或组件实例。
谨慎使用 ref。如果你发现自己经常使用 ref 来在应用中“实现想要的功能”,你可以考虑去了解一下自上而下的数据流(状态提升)。
1.配合ref属性,获取DOM对象,进行DOM操作
2.在组件更新期间维持一个值(也就是:可以在每次组件重新渲染时,拿到同一个值)
1.ref对象有一个current属性,可以使用该属性存储任意值
2.修改ref对象current属性的值不会导致组件重新渲染
1 | // React.createRef |
1 | //useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数(initialValue)。返回的 ref 对象在组件的整个生命周期内持续存在。 |
img是一种类似text的标签元素,在结束的时候,会在末尾加上一个空白符(匿名文本),导致下方会多出来3px间距
方法一:
1 | img { |
方法二:
1 | img { |
fixed是相对于浏览器窗口的固定定位,它的位置与文档流无关,因此不占据文档流空间
很多时候,开启了fixed的组件的z-index层级都很高,如固定在底部的TabBar,此时会出现遮挡底部组件的问题。给被遮挡的组件增加padding值就行。
1 | {/* 路由链接,Link和NavLink最终会被转为<a>标签 to被转为href*/} |
1 | // 创建routes目录,一般在src目录下创建 |
使用Link或NavLink方式跳转路由有很多的局限性,如在3秒后路由自动跳转,鼠标滑过图片路由跳转,这些用Link很难实现路由跳转。于是就有了编程式路由导航,不使用Link或NavLink就是编程式路由导航。
1 | // 引入 useNavigate |
1 | import { useHistory } from 'react-router-dom' |
Effect Hook 可以让你在函数组件中执行副作用操作,什么是副作用:有时候,我们只想在 React 更新 DOM 之后运行一些额外的代码。比如发送网络请求,手动变更 DOM,记录日志,这些都是常见的无需清除的副作用。还有一些副作用是需要清除的。例如订阅外部数据源。这种情况下,清除工作是非常重要的,可以防止引起内存泄露!
1 | componentDidMount() |
1 | import { useEffect, useState } from 'react' |
1 | import { useEffect, useState } from 'react' |
1 | import { useEffect, useState } from 'react' |
1 | useEffect(() => { |
在组件中,可以使用useEffect Hook来发送请求(side effect)获取数据
注意:effect只能时一个同步函数,不能使用async
因为如果effect时async的,此时返回值时Promise对象。这样的话,就无法保证函数被立即调用
为了使用async/awair语法,可以在effect内部创建async函数,并调用
核心代码:
1 | // 错误演示:不要给effect添加async |
pubsub-js使用消息订阅发布机制用于组件之间传递数据,
理解订阅发布机制
1 | // 导入包 |
1 | // A组件发布 |
1 | // setState方法更新状态是同步的,但是表现为延迟更新状态(注意:非异步更新状态) |
类是对象的模板,定义了对象的属性和方法
1 | // 最基本的类 |
1 | class MyClass{ |
1 | class Parent{ |
1 | // 直接通过类调用的属性和方法被称为静态属性和静态方法(类属性,类方法) |
React Router 以三个不同的包发布到 npm 上,它们分别为:
<BrowserRouter>
等 。<NativeRouter>
等。与React Router 5.x 版本相比,改变了什么?
内置组件的变化:移除<Switch/>
,新增 <Routes/>
等。
语法的变化:component={About}
变为 element={<About/>}
等。
新增多个hook:useParams
、useNavigate
、useMatch
等。
官方明确推荐函数式组件了!!!
……
<BrowserRouter>
说明:<BrowserRouter>
用于包裹整个应用。
示例代码:
1 | import React from "react"; |
<HashRouter>
<BrowserRouter>
一样,但<HashRouter>
修改的是地址栏的hash值。<HashRouter>
、<BrowserRouter>
的用法与 5.x 相同。<Routes/> 与 <Route/>
v6版本中移出了先前的<Switch>
,引入了新的替代者:<Routes>
。
<Routes>
和 <Route>
要配合使用,且必须要用<Routes>
包裹<Route>
。
<Route>
相当于一个 if 语句,如果其路径与当前 URL 匹配,则呈现其对应的组件。
<Route caseSensitive>
属性用于指定:匹配时是否区分大小写(默认为 false)。
当URL发生变化时,<Routes>
都会查看其所有子 <Route>
元素以找到最佳匹配并呈现组件 。
<Route>
也可以嵌套使用,且可配合useRoutes()
配置 “路由表” ,但需要通过 <Outlet>
组件来渲染其子路由。
示例代码:
1 | <Routes> |
<Link>
作用: 修改URL,且不发送网络请求(路由链接)。
注意: 外侧需要用<BrowserRouter>
或<HashRouter>
包裹。
示例代码:
1 | import { Link } from "react-router-dom"; |
<NavLink>
作用: 与<Link>
组件类似,且可实现导航的“高亮”效果。
示例代码:
1 | // 注意: NavLink默认类名是active,下面是指定自定义的class |
<Navigate>
作用:只要<Navigate>
组件被渲染,就会修改路径,切换视图。
replace
属性用于控制跳转模式(push 或 replace,默认是push)。
示例代码:
1 | import React,{useState} from 'react' |
1 | // 网页重定向 |
<Outlet>
当<Route>
产生嵌套时,渲染其对应的后续子路由。
示例代码:
1 | //根据路由表生成对应的路由规则 |
useRoutes
ReactRouter6支持路由表形式来统一管理路由,只能在函数式组件中使用useRoutes
1 | import { useRoutes } from 'react-router-dom' // useRoutes |
作用:根据路由表,动态创建<Routes>
和<Route>
。
示例代码:
1 | //路由表配置:src/routes/index.js |
作用:返回一个函数用来实现编程式导航。
示例代码:
1 | import React from 'react' |
作用:回当前匹配路由的params
参数,类似于5.x中的match.params
。
示例代码:
1 | import React from 'react'; |
作用:用于读取和修改当前位置的 URL 中的查询字符串。
返回一个包含两个值的数组,内容分别为:当前的seaech参数、更新search的函数。
示例代码:
1 | import React from 'react' |
作用:获取当前 location 信息,对标5.x中的路由组件的location
属性。
示例代码:
1 | import React from 'react' |
作用:返回当前匹配信息,对标5.x中的路由组件的match
属性。
示例代码:
1 | <Route path="/login/:page/:pageSize" element={<Login />}/> |
作用:如果组件在 <Router>
的上下文中呈现,则 useInRouterContext
钩子返回 true,否则返回 false。
POP
、PUSH
、REPLACE
。POP
是指在浏览器中直接打开了这个路由组件(刷新页面)。作用:用来呈现当前组件中渲染的嵌套路由。
示例代码:
1 | const result = useOutlet() |