You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 1、类组件,需要继承 React.Component,render 函数的执行结果会被作为界面展示内容classClassComponentextendsReact.Component{render(){return(<div><h1>Hello, Class Component</h1></div>);}}// 2、函数组件,本身就是一个函数,函数的执行结果会被作为界面展示内容constFunctionComponent=()=>{return(<div><h1>Hello, Function Component</h1></div>);}constApp=()=>(<div><ClassComponent/><FunctionComponent/></div>)ReactDOM.render(<App/>,root);
前言
本文已收录在
Github
: https://github.com/beichensky/Blog 中,欢迎 Star!Overview
本文共用 19 个例子,详细讲解了 React 基础入门知识,列举了相关 API 的使用方式,并且在每个 API 的说明中给出了详细的使用规则、建议以及注意事项。
对于不熟悉 React 的朋友,可以作为入门文档进行学习
对于已经掌握 React 的朋友,也可以作为 API 参考手册,用来查漏补缺
Index
demo01:
jsx
基本语法demo02:在
jsx
语法中使用js
,条件判断以及循环demo03:类组件以及函数组件声明方式
demo04:在组件中为元素绑定事件
demo05:父子组件的传值方式
props
以及props.children
demo06:类组件如何修改自身状态:
setState
demo07:
setState
详细使用方法demo08:类组件进行网络请求和添加监听事件的时机
componentDidMount
生命周期demo09:类组件生命周期详解
demo10:受控组件的含义,Form 组件的使用和值的获取
demo11:函数组件修改自身状态、发送网络请求、添加事件监听的方式,
useState
、useReducer
以及useEffect
的使用demo12:类组件的错误边界处理:
static getDerivedStateFromError
和componentDidCatch
生命周期demo13:高阶组件
HOC
的声明方式demo14:组件中
Context
上下文的使用,createContext
以及useContext
的基本使用demo15:组件中
ref
转发的使用,createRef
以及useRef
的基本使用demo16:在函数组件中,父组件如何调用子组件中的状态或者函数:
useImperativeHandle
demo17:
React
中传送门createPortal
的使用方式和场景demo18:常用的组件优化方案:
Fragment
、PureComponent
、memo
demo19:函数组件中方法以及变量的缓存方案
useCallback
、useMemo
HTML Template
demo
相关的代码都依赖以下模板Demo01
demo / source
jsx
语法的基本使用类似于
xml
的代码格式,但是可以书写js
逻辑Demo02
demo / source
如何在
jsx
语法中编写js
代码在标签内需要使用
js
语法的时候,使用{}
将js
表达式包裹起来即可{}
中可以是js
基础类型、引用类型(对象,数组等),也可以是js
表达式无论是标签内部还是标签属性,都需要在
{}
内才能使用js
语法使用
{/* */}
可以在jsx
语法中书写注释下面演示在
jsx
中使用js
的循环、条件判断语法Demo03
demo / source
类组件和函数组件的声明和使用
下面的代码演示 React 组件的声明和使用
Demo04
demo / source
如何为函数组件和类组件中的元素添加事件绑定?
在类组件中,为元素绑定事件时,事件函数内可能会用到组件的一些属性或者方法,那么此时
this
指向会出现问题。目前可以使用以下三种解决办法:使用箭头函数代替普通函数
使用
bind
函数绑定this
指向使用匿名函数的方式调用组件的属性或者方法
而函数组件中不存在这个问题
Demo05
demo / source
React
组件中父子组件传值的方式:props
props
属性,包含父组件传递过来的所有参数props
参数,包含父组件传递过来的所有参数props
中会包含一个children
属性,标签内的所有内容都会被存放到children
中。可以是标签、组件或者文本Demo06
demo / source
React 类组件如何控制自身状态变化并触发界面更新?
类组件中通过
state
属性控制自身状态变化,导致组件重新进行渲染(render
)类组件在
state
属性中对数据进行初始化,state
是一个对象通过实例的
setState
函数可以更新state
内容,重新渲染界面setState
接受两个参数,第一个参数是对象或者是函数,第二个参数回调函数callback
state
进行合并,设置为新的state
值state
值,返回值就是希望更新的对象,更新规则同上Demo07
demo / source
类组件中
setState
用法详解React
事件中,多次setState
会被合并setState
不会被合并,会按顺序执行setState
,还是一个定时器中执行setState
)执行setState
,不会被合并,会按照代码顺序执行Demo08
demo / source
在类组件中进行 异步操作 或者 为元素绑定原生事件 的时机:
componentDidMount
Demo09
demo / source
React
类组件各生命周期触发时机更多内容可参考这里:React 类组件生命周期详解
Demo10
demo / source
React 中受控组件的定义和使用
类似于
vue
中的v-model
定义:组件的值受
React
中状态的控制,组件的变化会导致React
中状态的更新Demo11
demo / source
函数组件中控制自身状态的相关
hooks
:useState
和useReducer
函数组件中处理副作用相关的
hooks
:useLayoutEffect
和useEffect
useState: [state, setState] = useState(initState)
initState
可以是函数,也可以是值,函数的话,仅会在组件创建时执行一次,返回值作为state
的初始值组件中可以使用多次
useState
,创建出不同的状态与 类组件中的
setState
不同的地方在于,同一React
事件中,多次setState
会被最后一次的替换,其他逻辑相似useReducer: [state, dispatch] = useState(reducer)
reducer
是一个函数,第一个参数是上一次的 state 值;第二个参数是传入的action
,不传的话则没有。返回值会作为新的state
进行使用useEffect: useEffect(() => doSomething, deps)
useEffect
是副作用执行hook
,第一次组件渲染完毕或依赖的deps
发生变化时,doSomething
逻辑都会被执行deps
是一个数组,发生变化的判断标准是将deps
中的依赖进行前后两次的浅比较useLayoutEffect: useLayoutEffect(() => doSomething, deps)
useLayoutEffect
也是副作用执行hook
,同useEffect
,第一次组件渲染完毕或依赖的deps
发生变化时,doSomething
逻辑都会被执行useEffect
不同的地方在于,组件渲染完毕,会同步执行useLayoutEffect
,而异步执行useEffect
useLayoutEffect
同一帧的
useLayoutEffect
会在useEffect
前执行Demo12
demo / source
React
中错误边界处理组件出现异常,会触发
static getDerivedStateFromError
和componentDidCatch
生命周期static getDerivedStateFromError
的返回值会合并到组件的state
中作为最新的state
值Demo13
demo / source
React 高阶组件(HOC)的两种创建方式
属性代理(
Props Proxy
):类组件和函数组件都可以使用反向继承(
Inheritance Inversion
,缩写II
):只用类组件可以使用Demo14
demo / source
Context
在类组件和函数组件中的使用Context
:const { Provider, Consumer } = React.createContext()
Provider
标签包裹住父组件,则在任意深度的子孙组件中,都可以在Consumer
标签中通过renderProps
的方式获取到对应Context
的值useContext()
获取到对应Context
的值更多
Context
用法可参考这里:React 中 Context 用法详解Demo15
demo / source
作用
DOM
节点或者React
组件的引用创建
ref
:ref = React.createRef()
ref = useRef()
使用:
ref
直接作为元素的ref
属性使用,给子组件设置ref
时,需要配合forwardRef
包裹子组件ref
可以作为元素或者组件的ref
,也可以只作为一个变量使用,将变量随函数组件的创建而创建,销毁而销毁Demo16
demo / source
用法:
useImperativeHandle(ref, createHandle, [deps])
第一个参数是
ref
值,可以通过属性传入,也可以配合forwardRef
使用第二个参数是一个函数,返回一个对象,对象中的属性都会被挂载到第一个参数
ref
的current
属性上第三个参数是依赖的元素集合,同
useEffect
、useCallback
、useMemo
,当依赖发生变化时,第二个参数会重新执行,重新挂载到第一个参数的current
属性上注意事项
第三个参数,依赖必须按照要求填写,少了会导致返回的对象属性异常,多了会导致
createHandle
重复执行一个组件或者
hook
中,对于同一个ref
,只能使用一次useImperativeHandle
,多次的话,后面执行的useImperativeHandle
的createHandle
返回值会替换掉前面执行的useImperativeHandle
的createHandle
返回值Demo17
demo / source
React
中传送门Portals
的使用:可以将指定React
元素挂载到任意的DOM
节点上去, 虽然在层级关系上,看起来实在父组件下,但在界面上是挂载到了指定的DOM
节点上用法:
ReactDOM.createPortal(child, container)
React
元素DOM
元素Portals
的典型用例是当父组件有overflow: hidden
或z-index
样式时, 但你需要子组件能够在视觉上“跳出”其容器。例如,对话框、悬浮卡以及提示框。Demo18
demo / source
优化
React
组件的几种方式Fragment
: 可以作为标签包裹子元素,并不会在DOM
中生成真实节点PureComponent
: 会对类组件的props
和state
做一次浅比较,只有当数据发生变化式,组件才会重新渲染PureComponent
的更多内容可以参考这里:PureComponent 使用注意事项以及源码解析memo
: 作用和PureComponent
类似,只不过是作为高阶组件,作用在函数组件上Demo19
demo / source
提升函数组件性能常用的两个
hooks
:useCallback
、useMemo
useCallback(fn, deps)
: 会对函数进行缓存,当第二个参数依赖项发生变化时,才会重新生成新的函数fn
: 返回的函数deps
: 依赖项集合,是个数组useMemo(fn, deps)
: 会对函数的返回值进行缓存,当第二个参数依赖项发生变化时,才会重新执行,返回新的数据fn
: 需要执行的函数deps
: 依赖项集合,是个数组React
组件写在后面
如果有写的不对或不严谨的地方,欢迎大家能提出宝贵的意见,十分感谢。
如果喜欢或者有所帮助,欢迎 Star,对作者也是一种鼓励和支持。
The text was updated successfully, but these errors were encountered: