91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React中的setState/useState怎么使用

發布時間:2023-05-08 17:20:00 來源:億速云 閱讀:216 作者:iii 欄目:開發技術

這篇文章主要介紹“React中的setState/useState怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“React中的setState/useState怎么使用”文章能幫助大家解決問題。

    一、React如何使用setState/useState的最新的值

    一般是可以正常的把最新的值,傳遞給所需要的函數中的,但是有些情況,需要使用最新數據的函數,不可改動,甚至所需要使用的地方并不是一個函數,那我們如何獲取setState/useState的最新的值呢?

    A.使用setState的最新的值

    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

    B.使用useState的最新的值

    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中setState/useState執行的同步異步問題

    只要代碼進入了 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怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    蒙自县| 江北区| 安宁市| 静乐县| 莱芜市| 始兴县| 舞阳县| 鸡西市| 青海省| 恩施市| 秀山| 松潘县| 阿巴嘎旗| 衡阳市| 韩城市| 蒙阴县| 三亚市| 海伦市| 缙云县| 宜丰县| 杂多县| 嘉定区| 商水县| 镇平县| 邓州市| 西平县| 晋江市| 竹山县| 芜湖县| 藁城市| 延庆县| 泽库县| 渝北区| 大宁县| 丰顺县| 嵊泗县| 晋州市| 邓州市| 伊宁市| 新安县| 察隅县|