-
3. State Hook
-
4. Ref Hook
-
5. Effect Hook
-
二、路由懒加载 ------ LazyLoad
-
三、Fragment
-
- 1. 使用
-
四、Context
-
- 1. 理解
-
2. 使用
-
3. 注意
-
五、组件优化
-
- 1. Component的问题
-
2. 效率高的做法
-
3. 原因
-
4. 解决
-
- 4.1 办法一:重写shouldComponentUpdate()方法
-
4.2 办法二: 使用PureComponent
-
六、错误边界
-
- 1. 理解
-
2. 特点
-
3. 使用方式
-
4. 示例
-
七、组件通信方式总结
-
- 1. 组件间的关系
-
2. 几种通信方式
-
3. 比较好的搭配方式
=====================================================================
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
==========================================================================
Hook 是 React 16.8 的新增特性。
它可以让你在编写函数式组件时使用 state 以及其他的 React 特性。这里借用阮一峰老师的一句话 —— 钩子(hook)就是 React 函数组件的副效应解决方案,用来为函数组件引入副效应。 函数组件的主体只应该用来返回组件的 HTML 代码,所有的其他操作(副效应)都必须通过钩子引入。
-
State Hook:
React.useState()
-
Effect Hook:
React.useEffect()
-
Ref Hook:
React.useRef()
-
State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作
-
语法:
const [状态, 更改状态的方法] = React.useState(initValue)
- useState()说明:
①useState方法返回的是一个数组[状态,操作状态的方法],因此可以数组结构赋值拿到
②数组的结构赋值,只要顺序一致即可,所以名字可以随便取
- 案例
import React from ‘react’
export default function Plus() {
const [count,setCount] = React.useState(0)
function add() {
setCount(count+1) //写法一
// setCount((count) => {return count+1}) 写法二
}
return (
<>
当前求和为{count}
点我加一
</>
)
}
- 总结
- Plus函数调几次?
答:它和类组件的render
一样,调1+n
次
- 第4行也随Plus调用了
1+n
次,为什么state最终不是0?
答:React底层在执行useState函数之后,把初始状态
保存起来了,
因此后面在调用useState初始状态0不会覆盖更改后的状态
-
Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
-
语法:
const refContainer = useRef()
-
作用:保存标签对象,功能与
React.createRef()
一样 -
代码示例
点击按钮,显示你输入的内容
import React from ‘react’
export default function Plus() {
const myRef = React.useRef()
function show() {
alert(myRef.current.value)
}
return (
<>
点我展示输入内容
</>
)
}
-
上面这些钩子,都是引入某种特定的副效应,而
useEffect()
是通用的副效应钩子 。找不到对应的钩子时,就可以用它。其实,从名字也可以看出来,它跟副效应(side effect)直接相关。 -
它可以用于模拟类组件中的
生命周期钩子
- 语法
React.useEffect(() => {
1.相当于 conponentDidMount()、conponentDidUpdate()
return ()=>{ 2.相当于conponentWillUnmount() }
},[3.监测哪个状态])
- 案例
-
组件挂载,当前求和之后的数字以每秒加1的速度累加
-
当点击卸载组件按钮时,useEffect会在卸载组件之前清除定时器。
import React from ‘react’
import ReactDOM from “react-dom”
export default function Plus() {
const [count, setCount] = React.useState(0)
React.useEffect(() => {
let timer = setInterval(() => {
setCount(count => count+1)
},1000)
return () => {
clearInterval(timer)
}
},[])
//卸载组件
function unMount() {
ReactDOM.unmountComponentAtNode(document.getElementById(“root”))
}
return (
<>
当前求和为{count}
卸载组件
</>
)
}
- 总结
-
useEffect传入的第一个值:这个函数,有可能相当于
componentDidMount
、componentDidUpdate
、componentWillUnmount
(甚至有可能同时相当于componentDidMount和componentDidUpdate!
) -
useEffect传入的第二个值:这个[ ],方括号里面是啥(state),它就监测啥(state)
-
useEffect里的参数:
①同时相当于componentDidMount/componentDidUpdate
:useEffect只传一个参数useEffect( ()=>{} ) ----------> 它等于谁都监测,组件一挂载和任何状态变动,都会回调那个作为参数的函数
②相当于componentDidMount
:useEffect( ()=>{} , [] ) ----------> 第二个参数,[ ]里什么都不写 --------> 相当于谁都不监测
③相当于componentWillUnmout
: useEffect( ()=>{ return ()=>{} } ) --------> 第一个参数的返回值的这个函数相当于componentWillUnmout
==========================================================================================
用的时候才加载,一般是路由组件进行懒加载
如果不用路由懒加载,页面在第一次进入的时候,就请求了所有组件的数据,如果组件过多,过多的请求这就没有必要了,应该是用户按哪个链接再请求哪个组件
-
通过React的lazy函数配合import()函数动态加载路由组件【路由组件代码会被分开打包】
-
通过指定在加载得到路由打包文件前显示一个自定义loading界面
import React, { Component, lazy, Suspense} from ‘react’
import {NavLink,Route} from ‘react-router-dom’
// import Home from ‘./Home’
// import About from ‘./About’
import Loading from ‘./Loading’
const Home = lazy(()=> import(‘./Home’) )
const About = lazy(()=> import(‘./About’))
export default class Demo extends Component {
render() {
return (
React Router Demo
{/* 在React中靠路由链接实现切换组件–编写路由链接 */}
About
Home
<Suspense fallback={}>
{/* 注册路由 */}
)
}
}
=============================================================================
文档碎片
可以不用必须有一个真实的DOM根标签了
import React, { Component,Fragment } from ‘react’
export default class Demo extends Component {
render() {
return (
)
}
}
============================================================================
上下文
一种组件间通信方式, 常用于【祖组件】与【后代组件】间通信
- 创建Context容器对象
const XxxContext = React.createContext()
- 渲染子组时,外面包裹xxxContext.Provider, 通过value属性给后代组件传递数据:
<xxxContext.Provider value={数据}>
子组件
</xxxContext.Provider>
- 后代组件读取数据:
第一种方式:仅适用于类组件
static contextType = xxxContext // 声明接收context
this.context // 读取context中的value数据
第二种方式: 函数组件与类组件都可以
<xxxContext.Consumer>
{
value => ( // value就是context中的value数据
要显示的内容
)
}
</xxxContext.Consumer>
在应用开发中一般不用context, 一般都用它来封装react插件
import React, { Component } from ‘react’
import ‘./index.css’
//创建Context对象
const MyContext = React.createContext()
const { Provider, Consumer } = MyContext
export default class A extends Component {
state = {username:‘tom’,age:18}
render() {
const {username,age} = this.state
return (
我是A组件
我的用户名是:{username}
)
}
}
class B extends Component {
render() {
return (
我是B组件
)
}
}
/* class C extends Component {
//声明接收context
static contextType = MyContext
render() {
const {username,age} = this.context
return (
我是C组件
我从A组件接收到的用户名:{username},年龄是{age}
)
}
} */
function C(){
return (
我是C组件
我从A组件接收到的用户名: # 最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
组件接收到的用户名:{username},年龄是{age}
)
}
} */
function C(){
return (
我是C组件
我从A组件接收到的用户名: # 最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-s65FfROZ-1714950493731)]
[外链图片转存中…(img-qMQGVPgu-1714950493732)]
[外链图片转存中…(img-xz6DSrfr-1714950493732)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!