最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中useState的使用方法及注意事項(xiàng)

 更新時(shí)間:2022年08月12日 14:18:14   作者:Ljwen_  
useState通過(guò)在函數(shù)組件里調(diào)用它來(lái)給組件添加一些內(nèi)部state,下面這篇文章主要給大家介紹了關(guān)于React中useState的使用方法及注意事項(xiàng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、基本使用

useState是 react 提供的一個(gè)定義響應(yīng)式變量的 hook 函數(shù),基本語(yǔ)法如下:

const [count, setCount] = useState(initialCount)
  • 它返回一個(gè)狀態(tài)和一個(gè)修改狀態(tài)的方法,狀態(tài)需要通過(guò)這個(gè)方法來(lái)進(jìn)行修改;
  • initialCount 是我們傳入的一個(gè)初始狀態(tài),它是惰性的,我們可以通過(guò)傳一個(gè)函數(shù)來(lái)返回一個(gè)值當(dāng)作初始狀態(tài),并且這個(gè)函數(shù)只會(huì)在初始渲染時(shí)執(zhí)行一次;
const [count, setCount] = useState(() => {
    const initialCount = someExpensiveComputation();
    return initialCount
})

接下來(lái)把定義好的狀態(tài)運(yùn)用到頁(yè)面:

import { useState } from 'react'
function App() {
    const [count, setCount] = useState(0)
    const handleClick = () => {
        setCount(count + 1)
        // 傳入一個(gè)函數(shù),更新的值是基于之前的值來(lái)執(zhí)行
        // setCount(count => count + 1)
    }
    return (
    	<div>
        	<h4>count: {count}</h4>
            <button onClick={ handleClick }>點(diǎn)擊更新?tīng)顟B(tài)</button>
        </div>
    )
}

頁(yè)面渲染完成后,我們可以看到 count的值是 0,當(dāng)我們點(diǎn)擊按鈕時(shí),會(huì)將 count的值加 1,頁(yè)面也同時(shí)更新;

了解完基礎(chǔ)用法后,我們可以思考幾個(gè)問(wèn)題;

  • setCount修改值時(shí)它是同步還是異步?
  • 連續(xù)調(diào)用 setCount會(huì)發(fā)生什么?

第一個(gè)問(wèn)題:setCount修改值時(shí)它是同步還是異步?

const handleClick = () => {
    console.log("value1: ", count)
    setCount(count => count + 1)
    console.log("value2: ", count)
}

從圖中我們可以看出,頁(yè)面的值是更新了,但是控制臺(tái)打印的是之前的值,這是不是也表示 setCount是異步的呢?我們換一種方法,用異步來(lái)修改狀態(tài);

const handleClick = () => {
    console.log("value1: ", count)
    setTimeout(() => {
        setCount(count => count + 1)
        console.log("value2: ", count)
    }, 0)
}

顯然,異步修改狀態(tài)跟同步修改狀態(tài)的結(jié)果是一致的,這也表明了 setCount 是異步更新的;那我們要怎么拿到更新后的值呢,我們可以用另外一個(gè) hook 函數(shù) useRef,代碼如下:

function App() {
  const [count, setCount] = useState(0)
  const countRef = useRef(count)
  countRef.current = count
  const handleClick = () => {
    setCount(count => count + 1)
    console.log("value3: ", count)
    setTimeout(() => {
      console.log(countRef.current)
    }, 0)
  }
  return (
    <div>
      <h4>count: {count}</h4>
      <button onClick={handleClick}>點(diǎn)擊更新?tīng)顟B(tài)</button>
    </div>
  )
}

從圖中我們可以看出,我們已經(jīng)拿到了更新之后的值,useRef不僅可以用于訪問(wèn) DOM 節(jié)點(diǎn),也可以用來(lái)表示一個(gè)容器,current屬性可以保存任何值,而且useRef返回的對(duì)象會(huì)在整個(gè)生命周期內(nèi)保持;

第二個(gè)問(wèn)題:連續(xù)調(diào)用 setCount會(huì)發(fā)生什么?

(1)傳入一個(gè)基于狀態(tài)的值

const handleClick = () => {
    console.log("value1: ", count)
    setCount(count + 1)
    console.log("value2: ", count)
    setCount(count + 1)
    console.log("value3: ", count)
}

從圖片可以看出,如果我們傳入的是一個(gè)普通值,他只會(huì)進(jìn)行最后一次更新;

(2)傳入一個(gè)函數(shù)

const handleClick = () => {
    console.log("value1: ", count)
    setCount(count => count + 1)
    console.log("value2: ", count)
    setCount(count => count + 1)
    console.log("value3: ", count)
}

可以看出,傳入一個(gè)函數(shù)的話,它會(huì)進(jìn)行兩次賦值,因?yàn)樗碌闹凳腔谥暗闹祦?lái)執(zhí)行,所以在開(kāi)發(fā)中推薦使用函數(shù)傳入的形式進(jìn)行修改;

二、注意事項(xiàng)

1、復(fù)雜變量的修改

對(duì)于復(fù)雜類(lèi)型的變量我們修改時(shí)需要重新定義,在原來(lái)數(shù)據(jù)的基礎(chǔ)上修改不會(huì)引起組件的重新渲染,因?yàn)?React 組件的更新機(jī)制只進(jìn)行淺對(duì)比,也就是更新某個(gè)復(fù)雜類(lèi)型數(shù)據(jù)時(shí)只要它的引用地址沒(méi)變,就不會(huì)重新渲染組件;舉個(gè)例子

function App() {
    const [arr, setArr] = useState([1])
    const pushData = () => {
        arr.push(4)
        setArr(arr)
    }
    return (
        <div>
            <h4>{arr.join("-")}</h4>
            <button onClick={pushData}>點(diǎn)擊添加數(shù)組</button>
        </div>
    )
}

上面的代碼在點(diǎn)擊按鈕時(shí),視圖不會(huì)發(fā)生變化,但是 arr的值是變化了,如果想修改這個(gè)數(shù)組,需要重新定義一個(gè)數(shù)組來(lái)修改,在原數(shù)組上的修改不會(huì)引起組件的重新渲染,React 組件的更新機(jī)制對(duì)只進(jìn)行淺對(duì)比,也就是更新某個(gè)復(fù)雜類(lèi)型數(shù)據(jù)時(shí)只要它的引用地址沒(méi)變,就不會(huì)重新渲染組件;

const pushData = () => {
    setArr([...arr, 4])
}

2、異步操作獲取更新的值

在類(lèi)組件里面,修改值時(shí)異步操作可以拿到更新后的值,但是在函數(shù)組件,異步獲取是拿不到更新后的值的,舉個(gè)例子對(duì)比一下:

類(lèi)組件

class App extends React.Component {
    constructor() {
        super()
        this.state = {
            count: 0
        }
    }
    handleClick = () => {
        this.setState({
            count: this.state.count + 1
        })
        console.log(this.state.count)
        setTimeout(() => {
            console.log(this.state.count)
        })
    }
    render() {
        return (
            <>
            <h4>count: {this.state.count}</h4>
            <button onClick={this.handleClick}>點(diǎn)擊更新?tīng)顟B(tài)</button>
            </>
        );
    }
}

函數(shù)組件

function App() {
    const [count, setCount] = useState(0)
    const handleClick = () => {
        setCount(count => count + 1)
        console.log("value1: ", count)
        setTimeout(() => {
            console.log("value2: ", count)
        })
    }
    return (
        <div>
            <h4>count: {count}</h4>
            <button onClick={handleClick}>點(diǎn)擊更新?tīng)顟B(tài)</button>
        </div>
    )
}

顯然,在函數(shù)組件中是不能通過(guò)異步來(lái)獲取更新的值,我們可以通過(guò) useRef來(lái)獲?。?/p>

const countRef = useRef(count)
countRef.current = count
const handleClick = () => {
    setCount(count => count + 1)
    console.log("value1: ", countRef.current)
    setTimeout(() => {
        console.log("value2: ", countRef.current)
    })
}

總結(jié)

到此這篇關(guān)于React中useState使用方法及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)React中useState使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 探究react-native 源碼的圖片緩存問(wèn)題

    探究react-native 源碼的圖片緩存問(wèn)題

    本篇文章主要介紹了探究react-native 源碼的圖片緩存問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • ReactJS?應(yīng)用兼容ios9對(duì)標(biāo)ie11解決方案

    ReactJS?應(yīng)用兼容ios9對(duì)標(biāo)ie11解決方案

    這篇文章主要為大家介紹了ReactJS?應(yīng)用兼容ios9對(duì)標(biāo)ie11解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • react項(xiàng)目中@路徑簡(jiǎn)單配置指南

    react項(xiàng)目中@路徑簡(jiǎn)單配置指南

    這篇文章主要給大家介紹了關(guān)于react項(xiàng)目中@路徑簡(jiǎn)單配置的相關(guān)資料,文中還介紹了React配置@路徑別名的方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 在React中應(yīng)用SOLID原則的方法

    在React中應(yīng)用SOLID原則的方法

    SOLID?是一套原則,它們主要是關(guān)心代碼質(zhì)量和可維護(hù)性的軟件專(zhuān)業(yè)人員的指導(dǎo)方針,本文給大家分享如何在React中應(yīng)用SOLID原則,感興趣的朋友一起看看吧
    2022-07-07
  • react.js 翻頁(yè)插件實(shí)例代碼

    react.js 翻頁(yè)插件實(shí)例代碼

    這篇文章主要介紹了react.js 翻頁(yè)插件實(shí)例代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • 五分鐘教你了解一下react路由知識(shí)

    五分鐘教你了解一下react路由知識(shí)

    本文主要介紹了react路由知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • ReactHooks批量更新state及獲取路由參數(shù)示例解析

    ReactHooks批量更新state及獲取路由參數(shù)示例解析

    這篇文章主要介紹了React Hooks如何實(shí)現(xiàn)批量更新state以及獲取路由參數(shù)的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 在React中實(shí)現(xiàn)Vue的插槽功能的示例代碼

    在React中實(shí)現(xiàn)Vue的插槽功能的示例代碼

    在?Vue?中,插槽(Slots)允許父組件向子組件傳遞?HTML?結(jié)構(gòu),從而實(shí)現(xiàn)更靈活的組件復(fù)用,具名插槽允許父組件向子組件傳遞多個(gè)不同的?HTML?結(jié)構(gòu),在?React?中,我們沒(méi)有直接的插槽概念,但可以通過(guò)?props.children?和函數(shù)作為?props?來(lái)實(shí)現(xiàn)類(lèi)似的功能
    2025-01-01
  • react之組件通信詳解

    react之組件通信詳解

    本篇文章主要介紹了React組件通信詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-10-10
  • React避免子組件無(wú)效刷新的三種解決方案

    React避免子組件無(wú)效刷新的三種解決方案

    這篇文章主要給大家介紹了React三種避免子組件無(wú)效刷新的解決方案,使用React.memo,使用React.useMemo或React.useCallback,將子組件作為children來(lái)傳遞這三種方案,文章通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08

最新評(píng)論

八宿县| 丘北县| 进贤县| 光泽县| 吴江市| 科尔| 海丰县| 木兰县| 黄龙县| 方正县| 东至县| 南漳县| 道孚县| 肃宁县| 宁陵县| 班戈县| 虹口区| 咸宁市| 蒲城县| 出国| 陇川县| 平乡县| 朝阳市| 临安市| 南靖县| 望都县| 安徽省| 卢湾区| 东乡族自治县| 宣化县| 略阳县| 恩施市| 墨江| 景谷| 咸丰县| 哈巴河县| 将乐县| 伽师县| 吴堡县| 泰兴市| 左贡县|