您好,登錄后才能下訂單哦!
這篇文章主要介紹“React中的setState/useState怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“React中的setState/useState怎么使用”文章能幫助大家解決問題。
一般是可以正常的把最新的值,傳遞給所需要的函數中的,但是有些情況,需要使用最新數據的函數,不可改動,甚至所需要使用的地方并不是一個函數,那我們如何獲取setState/useState的最新的值呢?
1、setState方法可以接收兩個參數,第一個參數為一個對象,第二個參數為一個函數,即更新成功后執行的回調函數。我們可以在回調函數中獲取更新后的值。
import React, { Component } from 'react' export default class DemoClassComp extends Component { constructor(props) { super(props) this.state = { number: 1, } } inControl = ()=>{ this.setState({number: 1}, () => { console.log('%c ???? DemoClassComp -> inControl -> this.state.number ', 'font-size:16px;background-color:#f31440;color:white;', this.state.number) }) } render() { return ( <div> <button onClick={this.inControl} >點我</button> </div> ) } }
2、使用setTimeout
1、使用另一個Hook,useRef;
function DemoFuncComp() { const [qimingFlag, setQimingFlag] = useState(false); const qimingFlagRef = useRef(false); const handleLine = () => { deleteQimingFieldsData(data, qimingFlagRef?.current); //* 刪除啟明相關字段的數據 } const initData = useCallback(async () => { await commonQuery(basicInfoHeader, { contractId }); const qimingFlagNow = basicInfoHeader.current?.get('qimingFlag'); setQimingFlag(qimingFlagNow); //* 用于出發重新渲染 qimingFlagRef.current = qimingFlagNow; handleLine(); //* 要求 先setQimingFlag }, [contractId]) /**生命周期 */ useEffect(() => { initData(); }, [contractId]); return ( <> <Form dataSet={basicInfoHeader} disabled={true} columns={4}> <Lov name="receiverObj" /> </Form> </> ) }
2、使用setTimeout
只要代碼進入了 react調度流程,那就是異步的。
只要代碼沒有進入 react調度流程,那就是同步的。
setTimeout、setInterval、async中await的后續部分,Promise.then(),以及直接在 DOM 上綁定原生事件等。這些都不會走 React調度流程,在這種情況下調用 setState ,那這次 setState 就是同步的。 否則就是異步的。
連續執行兩個 useState
function DemoFuncComp() { const [a, setA] = useState(0); const [b, setB] = useState(0); console.log('render') function outControl() { Promise.resolve().then(() => { setA((a) => a + 1); setB((b) => b + 1); }) } function inControl() { setA((a) => a + 1); setB((b) => b + 1); } return ( <> <button onClick={outControl} >{a}-{b} 【不受react調度】</button> <button onClick={inControl} >{a}-{b} 【react調度】</button> </> ) } //! 當點擊【不受react調度】按鈕時,render 了兩次 //! 當點擊【react調度】按鈕時,只重新 render 了一次
連續執行兩次同一個 useState
function DemoFuncComp() { const [a, setA] = useState(1) console.log('a', a) function outControl() { Promise.resolve().then(() => { setA((a) => a + 1) setA((a) => a + 1) }) } function inControl() { setA((a) => a + 1) setA((a) => a + 1) } return ( <> <button onClick={outControl} >{a} 【不受react調度】</button> <button onClick={inControl} >{a} 【react調度】</button> </> ) } //! 當點擊【不受react調度】按鈕時,兩次 setA 各自 render 一次,分別打印 2,3 //! 當點擊【react調度】按鈕時,兩次 setA 都執行,但合并 render 了一次,打印 3
連續執行兩個 setState
class DemoClassComp extends React.Component { constructor(props) { super(props) this.state = { a: 1, b: 'b', } } outControl = () => { Promise.resolve().then(() => { this.setState({...this.state, a: 'aa'}) this.setState({...this.state, b: 'bb'}) }) } inControl = () => { this.setState({...this.state, a: 'aa'}) this.setState({...this.state, b: 'bb'}) } render() { console.log('render') return ( <> <button onClick={this.outControl} >【不受react調度】</button> <button onClick={this.inControl} >【react調度】</button> </> ) } } //! 當點擊【不受react調度】按鈕時,render 了兩次 //! 當點擊【react調度】按鈕時,只重新 render 了一次
連續執行兩次同一個 setState
class DemoClassComp extends React.Component { constructor(props) { super(props) this.state = { a: 1, } } outControl = () => { Promise.resolve().then(() => { this.setState({a: this.state.a + 1}) this.setState({a: this.state.a + 1}) }) } inControl = () => { this.setState({a: this.state.a + 1}) this.setState({a: this.state.a + 1}) } render() { console.log('a', this.state.a) return ( <> <button onClick={this.outControl} >【不受react調度】</button> <button onClick={this.inControl} >【react調度】</button> </> ) } } //! 當點擊【不受react調度】按鈕時,兩次 setState 各自 render 一次,分別打印 2,3 //! 當點擊【react調度】按鈕時,兩次 setState 合并,只執行了最后一次,打印 2
關于“React中的setState/useState怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。