嘉興秀洲區(qū)全網(wǎng)seo優(yōu)化優(yōu)惠廈門seo關(guān)鍵詞
文章目錄
- 0. 取消批處理合并更新, render 2次
- 1. 合并更新,setCount(異步更新) 3次相當于1次, count值為1
- 2. 如何取消批處理合并,讓值累加?,改為回調(diào)函數(shù)寫法,內(nèi)部會依次執(zhí)行函數(shù), 執(zhí)行3次 count值為3
- 3. 異步更新,獲取異步更新的值?useEffect
- 4.利用擴展運算符的形式來解決對象修改的問題
- 5. 初始值大量計算,優(yōu)化
- 小結(jié)

用于為函數(shù)組件引入狀態(tài)
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style></style><script src="../react.development.js"></script><script src="../react-dom.development.js"></script><script src="../babel.min.js"></script><script src="../lodash.min.js"></script>
</head><body><div id="app"></div><script type="text/babel">let app = document.querySelector('#app');let root = ReactDOM.createRoot(app);let { flushSync } = ReactDOM;let { useState, useEffect } = React;let Welcome = (props)=>{const initCount = () => {console.log('initCount');return 2*2*2;}// 5. 初始需要大量計算的情況,可以寫一個回調(diào)函數(shù),這樣可以惰性加載函數(shù),只讓函數(shù)調(diào)用一次const [count, setCount] = useState(()=>{return initCount();});const [msg, setMsg] = useState('hello');// 4.利用擴展運算符的形式來解決對象修改的問題// const [info, setInfo] = useState({// username: 'xiaoming',// age: 20// })// setInfo({// ...info,// username: 'xiaoqiang'// })const handleClick = () => {//0. 取消批處理合并更新, render 2次// flushSync(()=>{// setCount(count + 1)// })// flushSync(()=>{// setMsg('hi')// })// 1. 合并更新,setCount(異步更新) 3次相當于1次, count值為1// setCount(count + 1)// setCount(count + 1)// setCount(count + 1)// 2. 如何取消批處理合并,讓值累加?,改為回調(diào)函數(shù)寫法,內(nèi)部會依次執(zhí)行函數(shù), 執(zhí)行3次 count值為3// setCount((count)=> count+1)// setCount((count)=> count+1)// setCount((count)=> count+1)// 3. 異步更新,獲取異步更新的值?// 在setCount執(zhí)行后,直接獲取值,發(fā)現(xiàn)是更新前的值.如何修復?// 在類組件中,是通過setState,的第二個參數(shù),在回調(diào)函數(shù)中獲取同步數(shù)據(jù)// 函數(shù)組件中useState,沒有第二個參數(shù)獲取這個同步更新的值, 需要使用useEffect,監(jiān)聽,獲取同步更新的值// 既然要進行自動批處理操作,所以函數(shù)是異步的// useState():對應響應式數(shù)據(jù)的修改函數(shù)是沒有第二個參數(shù)的,所以要監(jiān)聽數(shù)據(jù)改變后的時機,在函數(shù)組件中是通過 useEffect() 來實現(xiàn)的// setCount(count + 1, ()=>{ // ?// console.log(count)// })}console.log(123);return (<div><button onClick={handleClick}>點擊</button><div>hello world, { count }, { msg }</div></div>);}let element = (<Welcome />);root.render(element)</script>
</body></html>
0. 取消批處理合并更新, render 2次
// flushSync(()=>{// setCount(count + 1)// })// flushSync(()=>{// setMsg('hi')// })
1. 合并更新,setCount(異步更新) 3次相當于1次, count值為1
// setCount(count + 1)// setCount(count + 1)// setCount(count + 1)
2. 如何取消批處理合并,讓值累加?,改為回調(diào)函數(shù)寫法,內(nèi)部會依次執(zhí)行函數(shù), 執(zhí)行3次 count值為3
// setCount((count)=> count+1)// setCount((count)=> count+1)// setCount((count)=> count+1)
3. 異步更新,獲取異步更新的值?useEffect
用useEffect監(jiān)聽同步
// 在setCount執(zhí)行后,直接獲取值,發(fā)現(xiàn)是更新前的值.如何修復?
// 在類組件中,是通過setState,的第二個參數(shù),在回調(diào)函數(shù)中獲取同步數(shù)據(jù)// 函數(shù)組件中useState,沒有第二個參數(shù)獲取這個同步更新的值, 需要使用useEffect,監(jiān)聽,獲取同步更新的值// 既然要進行自動批處理操作,所以函數(shù)是異步的// useState():對應響應式數(shù)據(jù)的修改函數(shù)是沒有第二個參數(shù)的,所以要監(jiān)聽數(shù)據(jù)改變后的時機,在函數(shù)組件中是通過 useEffect() 來實現(xiàn)的// setCount(count + 1, ()=>{ // ?// console.log(count)// })
4.利用擴展運算符的形式來解決對象修改的問題
// const [info, setInfo] = useState({// username: 'xiaoming',// age: 20// })// setInfo({// ...info,// username: 'xiaoqiang'// })
5. 初始值大量計算,優(yōu)化
初始需要大量計算的情況,可以寫一個回調(diào)函數(shù),這樣可以惰性加載函數(shù),只讓函數(shù)調(diào)用一次
const [count, setCount] = useState(()=>{return initCount();});const [msg, setMsg] = useState('hello');
小結(jié)
討論了下useState會遇到的一些問題,與優(yōu)化技巧