内蒙古建设网站,仁寿建设局网站,广州竞价托管代运营,公司门户最新版下载目录
useState
useEffect
useRef
useContext
useCallback
useMemo useState const [初始值#xff0c;修改值的方法] useState( 初始值 ) 我们用useState定义一个初始值#xff0c;可以打印看一下结果
console.log(useState(10)) // [10, ƒ] 结果是一个数组#xf…目录
useState
useEffect
useRef
useContext
useCallback
useMemo useState const [初始值修改值的方法] useState( 初始值 ) 我们用useState定义一个初始值可以打印看一下结果
console.log(useState(10)) // [10, ƒ] 结果是一个数组第0项就是我们定义的初始值第1项则就是我们修改值的方法
我们用数组接收就是结构出来我们需要的这两项
import React, { useState } from react
import { Button } from antdexport default function Home() {console.log(useState(10))// 定义简单数据类型const [num, setNum] useState(10)// 定义复杂数据类型const [obj, setObj] useState({ age: 25 })// 如果初始化需要进行计算得出我们也可以传入一个函数const [count, setCount] useState(() {let num 100// ...return num})const addNum () {// 修改简单数据类型可以这样直接修改setNum(num 1)}const insertName () {// 修改复杂数据类型1. 可以利用扩展运算符 2. 也可以深拷贝一份再进行修改setObj({ ...obj, name: 张三 })}const changeCount () {setCount(999)}return (divh2 style{{ textAlign: center }}Home/h2pnum的值: {num}/pButton onClick{addNum}num1/Buttonpobj的值: {obj.age} - {obj.name}/pButton onClick{insertName}obj新增name属性/Buttonpcount的值: {count}/pButton onClick{changeCount}修改count的值/Button/div)
}useState()还有一个特性就是如果更新的数据与上次一样React将跳过子组件的渲染及effect的执行
代码验证
父组件
import React, { useEffect, useState } from react
import MusicSon from ./MusicSon
import { Button } from antdexport default function Music() {const [num, setNum] useState(100)const numAdd () {// 我们看一下值没有改变的情况下会不会触发effect和子组件setNum(100)}useEffect(() {console.log(初始化effect执行了)}, [])return (divh2Music/h2Button onClick{numAdd}num不变/ButtonMusicSon toSon{num} //div)
}子组件
import React from reactexport default function MusicSon(props) {console.log(子组件触发执行啦)return (divh5MusicSon/h5p从父组件接收过来的数据:{props.toSon}/p/div)
}发现只有一进来的时候触发了effect和子组件 然后我们点击按钮这时值没有发生改变发现控制台什么都没有输出说明只要更新的数据与上次一样React将跳过子组件的渲染及effect的执行
useEffect
useEffect都是在组件dom渲染更新完毕之后才执行的
利用其副作用执行一些操作那什么是副作用呢 上面是文档给出的副作用看着挺懵逼的其实说简单点函数的副作用就是函数除了返回值外对外界环境造成的其它影响 。不理解也没事其实我也不太理解()
常见的副作用
数据请求 ajax发送手动修改domlocalstorage操作
下面说用法 1.不添加依赖项 组件首次渲染执行一次以及不管是哪个状态更改引起组件更新时都会重新执行 组件初始渲染组件更新 不管是哪个状态引起的更新
useEffect((){console.log(副作用执行了)
})2. 添加空数组 组件只在首次渲染时执行一次
useEffect((){console.log(副作用执行了)
},[])3. 添加特定依赖项 副作用函数在首次渲染时执行在依赖项发生变化时重新执行 组件初始渲染依赖项发生变化时
function App() { const [count, setCount] useState(0) const [name, setName] useState(zs) useEffect(() { console.log(副作用执行了) }, [count]) return ( button onClick{() { setCount(count 1) }}{count}/button button onClick{() { setName(cp) }}{name}/button / )
}注意事项
useEffect 回调函数中用到的数据比如count就是依赖数据就应该出现在依赖项数组中如果不添加依赖项就会有bug出现
清除副作用
在组件被销毁时如果有些副作用操作需要被清除(比如定时器)
语法
useEffect(() { // 副作用操作… return () { // 写清除副作用的代码 }})
eg: 清除定时器案例
父组件
import React from react
import { useState } from react
import Son from ./pages/Sonexport default function App() {const [flag, setFlag] useState(true)return (divh2App/h2button onClick{() setFlag(!flag)}显示/隐藏组件/button{flag Son/Son}/div)
}子组件
import React, { useEffect } from reactexport default function Son() {// 组件进来的时候触发一个定时器useEffect(() {let timer setInterval(() {console.log(定时器执行了)}, 1000)// 组件销毁时清除定时器return () {// 在return里面的函数里写清除操作clearInterval(timer)}}, [])return (divh3Son/h3/div)
}useEffect 发送网络请求
依赖项要是一个空数组因为依赖项为空数组时只会在页面初始化时触发一次
import React from react
import { useEffect } from reactexport default function App() {const getData () {fetch(https://cnodejs.org/api/v1/topics).then((response) response.json()).then((data) console.log(data.data))}useEffect(() {getData()}, [])return (divh2App/h2/div)
}useRef
获取元素的真实Domconst 变量名 useRef(null) 我们用useRef()定义一下然后打印一下看看
console.log(useRef(null)) 可以看到里面是有一个current属性而这个属性里面存放的就是dom元素的内容我们在useRef()中定义什么current里就显示什么。需要获取那个元素的DOM则直接让此元素的ref等于我们useRef()方法接收的变量即可
案例
在输入框中输入我们点击按钮获取到输入的内容
import React, { useRef } from react
import { Button, Input } from antdexport default function Home() {const ipt useRef(null)const getValue () {console.log(ipt)}return (divh2Home/h2Input placeholder请输入内容 ref{ipt} /Button onClick{getValue}提交/Button/div)
}我们可以看到current里面存放了一些属性和方法其中的input里的value才是我们需要的
import React, { useRef } from react
import { Button, Input } from antdexport default function Home() {const ipt useRef(null)const getValue () {console.log(输入的值为, ipt.current.input.value)}return (divh2Home/h2Input placeholder请输入内容 ref{ipt} /Button onClick{getValue}提交/Button/div)
}useContext
一般深层组件传值用类似于Vue的provide和inject
传输的数据是响应式的跨组件传输数据用如果想要传递的数据只在整个应用初始化的时候传递一次就可以则可以在index.js文件中提供数据(静态)如果传递的数据需要状态维护则可以在app.js中提供数据(动态)
使用步骤
创建一个context的文件使用createContext创建Context对象并导出在顶层组件引入通过Provider提供数据在底层组件引入通过useContext函数获取数据
context.js
import { createContext } from reactconst Context createContext()export default Context上层组件
import React, { useState } from react
import Son from ./pages/Son
// 1. 引入Context
import Context from ./utils/context.jsexport default function App() {const [msg] useState(根组件传递的数据)return ({/* 2. 使用Provider包裹上层组件提供数据 */}Context.Provider value{msg}{/* 根组件 */}divh2App/h2Son/Son/div/Context.Provider/)
}下层组件
import React, { useContext } from react
import Context from ../utils/context.jsexport default function Son() {let val useContext(Context)return (divh3Son/h3p从根组件得到的数据 --- {val}/p/div)
}useCallback
是一个带有记忆的函数一般用作优化用
基本写法
const memoizedCallback useCallback(() {doSomething(a, b);},[a, b],
);
接收两个参数
第一个参数是处理函数第二个参数是一个数组用于指定被记忆的函数更新所依赖的值
只有第二个参数数组中的值发生改变了第一个参数的处理函数才会执行 useCallback(fn, deps) 相当于 useMemo(() fn, deps) 代码验证
只有第二个参数中数组中的num变化时才会触发useCallback中的第一个函数。如果第二个参数写一个空数组则只会执行一次
import React, { useCallback, useState } from reactexport default function Home() {const [num, setNum] useState(10)const changeNum useCallback(() {setNum(num 1)}, [num])return (divh2{num}/h2button onClick{changeNum}改变num的值/button/div)
}为什么要使用useCallback() ?
函数式组件中定义在组件内的函数会随着状态值的更新而重新渲染因此函数中定义的函数会被频繁定义在父子组件的通信中这样是非常消耗性能的。使用useCallback()结合memo就可以有效的减少子组件更新频率提高效率和性能。
代码验证
父组件
import React, { useCallback, useState } from react
import HomeSon from ./HomeSonexport default function Home() {const [num, setNum] useState(10)const [toSon, setToSon] useState(999)const changeNum useCallback(() {setNum(num 1)}, [num])const changeToSon useCallback(() {setToSon(toSon 1)}, [toSon])return (divh2{num}/h2button onClick{changeNum}改变num的值/buttonHomeSon toSon{toSon} /button onClick{changeToSon}改变传给子组件的值/button/div)
}子组件
用React.memo()包裹的组件会监听props只有props改变了才会触发此组件的更新
import React from reactexport default React.memo(function HomeSon(props) {const { toSon } propsconsole.log(子组件触发了)return (divh3HomeSon --- 从父组件接收过来的: {toSon}/h3/div)
})这样的话只有1. 初始化的时候以及 2. 子组件接收的数据发生变化时才会触发子组件的渲染
useMemo
基本写法(作用类似于Vue的计算属性只要依赖项不发生改变就不会重新计算)
const memoizedValue useMemo(() computeExpensiveValue(a, b), [a, b]);
接收两个参数
第一个参数是“创建”函数用于处理耗时计算并返回需要记录的值第二个参数是依赖项数组用于指定第一个参数“创建”函数更新所依赖的值
仅会在某个依赖项改变时才重新计算。传入useMemo的函数会在渲染期间执行。但是不要在这个函数内部执行与渲染无关的操作例如副作用副作用这类的操作属于useEffect的使用范畴。
如果没有提供依赖项数组useMemo在每次渲染时都会计算新的值
类似于Vue的计算属性也会进行缓存。计算结果没有改变时函数也不会触发
代码验证
需求c的值为ab我们改变a或者bc都能计算出最新的结果
import React, { useMemo, useState } from reactexport default function Movie() {const [a, setA] useState(0)const [b, setB] useState(0)const aAdd () {setA(a 1)}const bAdd () {setB(b 1)}// 类似于Vue的计算属性const c useMemo(() {return a b}, [a, b])return (divp{a}/pbutton onClick{aAdd}a/buttonp{b}/pbutton onClick{bAdd}b/buttonpa b {c}/p/div)
}useMemo()的第一个函数还可以返回一段DOM
import React, { useMemo, useState } from reactexport default function Movie() {const [a, setA] useState(0)const [b, setB] useState(0)const aAdd () {setA(a 1)}const bAdd () {setB(b 1)}// 类似于Vue的计算属性const c useMemo(() {return h2a b 计算的结果是: {a b}/h2}, [a, b])return (divp{a}/pbutton onClick{aAdd}a/buttonp{b}/pbutton onClick{bAdd}b/buttonp{c}/p/div)
}useMemo()与useCallBack()的区别
useMemo传入的函数内部需要有返回值useMemo只能声明在函数式组件内部不像React.memo()可以用在组件外部
文章转载自: http://www.morning.aowuu.com.gov.cn.aowuu.com http://www.morning.srzhm.cn.gov.cn.srzhm.cn http://www.morning.jlpdc.cn.gov.cn.jlpdc.cn http://www.morning.cpnlq.cn.gov.cn.cpnlq.cn http://www.morning.wfysn.cn.gov.cn.wfysn.cn http://www.morning.rxtxf.cn.gov.cn.rxtxf.cn http://www.morning.fmkbk.cn.gov.cn.fmkbk.cn http://www.morning.gmnmh.cn.gov.cn.gmnmh.cn http://www.morning.qwlml.cn.gov.cn.qwlml.cn http://www.morning.pkrb.cn.gov.cn.pkrb.cn http://www.morning.zxcny.cn.gov.cn.zxcny.cn http://www.morning.tzcr.cn.gov.cn.tzcr.cn http://www.morning.qkpzq.cn.gov.cn.qkpzq.cn http://www.morning.bbxbh.cn.gov.cn.bbxbh.cn http://www.morning.dxsyp.cn.gov.cn.dxsyp.cn http://www.morning.xlztn.cn.gov.cn.xlztn.cn http://www.morning.tsqrc.cn.gov.cn.tsqrc.cn http://www.morning.tnmmp.cn.gov.cn.tnmmp.cn http://www.morning.nsncq.cn.gov.cn.nsncq.cn http://www.morning.chmkt.cn.gov.cn.chmkt.cn http://www.morning.zgpgl.cn.gov.cn.zgpgl.cn http://www.morning.smcfk.cn.gov.cn.smcfk.cn http://www.morning.hzqjgas.com.gov.cn.hzqjgas.com http://www.morning.dbdmr.cn.gov.cn.dbdmr.cn http://www.morning.sfswj.cn.gov.cn.sfswj.cn http://www.morning.ykklw.cn.gov.cn.ykklw.cn http://www.morning.cwwbm.cn.gov.cn.cwwbm.cn http://www.morning.qmbgb.cn.gov.cn.qmbgb.cn http://www.morning.gxtbn.cn.gov.cn.gxtbn.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.qlry.cn.gov.cn.qlry.cn http://www.morning.kwqt.cn.gov.cn.kwqt.cn http://www.morning.lbywt.cn.gov.cn.lbywt.cn http://www.morning.sdamsm.com.gov.cn.sdamsm.com http://www.morning.pymff.cn.gov.cn.pymff.cn http://www.morning.prmyx.cn.gov.cn.prmyx.cn http://www.morning.fwlch.cn.gov.cn.fwlch.cn http://www.morning.xfhms.cn.gov.cn.xfhms.cn http://www.morning.fygbq.cn.gov.cn.fygbq.cn http://www.morning.mlyq.cn.gov.cn.mlyq.cn http://www.morning.qpsxz.cn.gov.cn.qpsxz.cn http://www.morning.nzhzt.cn.gov.cn.nzhzt.cn http://www.morning.pyncx.cn.gov.cn.pyncx.cn http://www.morning.tlzbt.cn.gov.cn.tlzbt.cn http://www.morning.smrty.cn.gov.cn.smrty.cn http://www.morning.drywd.cn.gov.cn.drywd.cn http://www.morning.gcthj.cn.gov.cn.gcthj.cn http://www.morning.ntyanze.com.gov.cn.ntyanze.com http://www.morning.qfrmy.cn.gov.cn.qfrmy.cn http://www.morning.yxyyp.cn.gov.cn.yxyyp.cn http://www.morning.cfccp.cn.gov.cn.cfccp.cn http://www.morning.sgrwd.cn.gov.cn.sgrwd.cn http://www.morning.hlnys.cn.gov.cn.hlnys.cn http://www.morning.ztcwp.cn.gov.cn.ztcwp.cn http://www.morning.wckrl.cn.gov.cn.wckrl.cn http://www.morning.zxwqt.cn.gov.cn.zxwqt.cn http://www.morning.xdlwm.cn.gov.cn.xdlwm.cn http://www.morning.ylrxd.cn.gov.cn.ylrxd.cn http://www.morning.qjrjs.cn.gov.cn.qjrjs.cn http://www.morning.hjwzpt.com.gov.cn.hjwzpt.com http://www.morning.prddj.cn.gov.cn.prddj.cn http://www.morning.zzjpy.cn.gov.cn.zzjpy.cn http://www.morning.zztmk.cn.gov.cn.zztmk.cn http://www.morning.pycpt.cn.gov.cn.pycpt.cn http://www.morning.bpmnc.cn.gov.cn.bpmnc.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.rzbgn.cn.gov.cn.rzbgn.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn http://www.morning.oioini.com.gov.cn.oioini.com http://www.morning.npbnc.cn.gov.cn.npbnc.cn http://www.morning.pmrlt.cn.gov.cn.pmrlt.cn http://www.morning.lbxhy.cn.gov.cn.lbxhy.cn http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn http://www.morning.tcsdlbt.cn.gov.cn.tcsdlbt.cn http://www.morning.qddtd.cn.gov.cn.qddtd.cn http://www.morning.thzgd.cn.gov.cn.thzgd.cn http://www.morning.mnpdy.cn.gov.cn.mnpdy.cn http://www.morning.fglth.cn.gov.cn.fglth.cn http://www.morning.cnxpm.cn.gov.cn.cnxpm.cn http://www.morning.yqtry.cn.gov.cn.yqtry.cn