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

react使用useState修改對(duì)象或者數(shù)組的值無法改變視圖的問題

 更新時(shí)間:2022年08月05日 12:07:16   作者:coucouxie  
這篇文章主要介紹了react使用useState修改對(duì)象或者數(shù)組的值無法改變視圖的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用useState修改對(duì)象或者數(shù)組的值無法改變視圖

在react中使用useState無法改變視圖,數(shù)據(jù)改變但是視圖未改變

未渲染的代碼如下:

const [needLists,setNeedLists]=useState([])
const pressDownEnter=(e)=>{
? ? if(e.keyCode===13){
? ? ? needLists.push({
? ? ? ? content:e.target.value,
? ? ? ? status:0
? ? ? })
? ? ? setNeedLists(needLists)
? ? ? e.target.value=""
? ? }
? }

未發(fā)生改變的原因可能是因?yàn)閚eedLists本身并沒有變化,因?yàn)閚eedLists變量存儲(chǔ)的地址是不變的

解決辦法

通過數(shù)據(jù)結(jié)構(gòu)讓傳入的新值和原來的數(shù)組指向的不是同一片內(nèi)存,就能觸發(fā)dom的更新

const [needLists,setNeedLists]=useState([])
const pressDownEnter=(e)=>{
? ? if(e.keyCode===13){
? ? ? needLists.push({
? ? ? ? content:e.target.value,
? ? ? ? status:0
? ? ? })
? ? ? setNeedLists([...needLists])
? ? ? e.target.value=""
? ? }
? }

對(duì)于對(duì)象的修改也是同理可以通過{…obj}

關(guān)于useState使用及注意事項(xiàng)

一、基本使用

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

const [count, setCount] = useState(initialCount)

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

const [count, setCount] = useState(() => {
    const initialCount = someExpensiveComputation();
    return initialCount
})

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

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

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

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

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

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

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

從圖中我們可以看出,頁面的值是更新了,但是控制臺(tái)打印的是之前的值,這是不是也表示 setCount是異步的呢?我們換一種方法,用異步來修改狀態(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ài)</button>
    </div>
  )
}

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

第二個(gè)問題:連續(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)樗碌闹凳腔谥暗闹祦韴?zhí)行,所以在開發(fā)中推薦使用函數(shù)傳入的形式進(jìn)行修改;

二、注意事項(xiàng)

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

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

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

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

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

類組件

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à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ài)</button>
        </div>
    )
}

顯然,在函數(shù)組件中是不能通過異步來獲取更新的值,我們可以通過 useRef來獲取;

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • webpack入門+react環(huán)境配置

    webpack入門+react環(huán)境配置

    webpack是一個(gè)前端資源模塊化管理和打包工具,說白了就是方便我們管理自己的常用的一些代碼,比如你開發(fā)中用到sass以及jade同時(shí)用到es6,開發(fā)時(shí)你不可能改動(dòng)某個(gè)地方就挨個(gè)命令去轉(zhuǎn)換再到瀏覽器去看效果,那樣效率是非常低的。所以webpack幫我們省去了那些多余的步驟。
    2017-02-02
  • React事件綁定詳解

    React事件綁定詳解

    這篇文章主要為大家介紹了React事件綁定,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 詳解React?Fiber架構(gòu)原理

    詳解React?Fiber架構(gòu)原理

    Fiber?可以理解為一個(gè)執(zhí)行單元,每次執(zhí)行完一個(gè)執(zhí)行單元,React?Fiber就會(huì)檢查還剩多少時(shí)間,如果沒有時(shí)間則將控制權(quán)讓出去,然后由瀏覽器執(zhí)行渲染操作,這篇文章主要介紹了React?Fiber架構(gòu)原理剖析,需要的朋友可以參考下
    2022-08-08
  • react裝飾器與高階組件及簡單樣式修改的操作詳解

    react裝飾器與高階組件及簡單樣式修改的操作詳解

    這篇文章主要介紹了react裝飾器與高階組件及簡單樣式修改的操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • 基于React-Dropzone開發(fā)上傳組件功能(實(shí)例演示)

    基于React-Dropzone開發(fā)上傳組件功能(實(shí)例演示)

    這篇文章主要介紹了基于React-Dropzone開發(fā)上傳組件,主要講述的是在React-Flask框架上開發(fā)上傳組件的技巧,需要的朋友可以參考下
    2021-08-08
  • React實(shí)現(xiàn)虛擬滾動(dòng)的三種思路詳解

    React實(shí)現(xiàn)虛擬滾動(dòng)的三種思路詳解

    在??web??開發(fā)的過程中,或多或少都會(huì)遇到大列表渲染的場景,為了解決大列表造成的渲染壓力,便出現(xiàn)了虛擬滾動(dòng)技術(shù),本文主要介紹虛擬滾動(dòng)的三種思路,希望對(duì)大家有所幫助
    2024-04-04
  • react如何獲取URL中參數(shù)

    react如何獲取URL中參數(shù)

    這篇文章主要介紹了react如何獲取URL中參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • React?Context原理深入理解源碼示例分析

    React?Context原理深入理解源碼示例分析

    這篇文章主要為大家介紹了React?Context原理深入理解源碼示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 詳解React Hooks是如何工作的

    詳解React Hooks是如何工作的

    React Hooks是在React 16.8版本新增的特性,在我看了React官網(wǎng)和一些博客對(duì)React Hook的講解后還是覺得沒有g(shù)et到本質(zhì)。本篇博客通過手動(dòng)實(shí)現(xiàn)useState()來了解Hook的原理和本質(zhì)。閱讀此篇博客的前提是你要知道一些 React Hooks的基本用法和使用規(guī)則,不然會(huì)看得云里霧里。
    2021-05-05
  • 想用好React的你必須要知道的一些事情

    想用好React的你必須要知道的一些事情

    現(xiàn)在最熱門的前端框架,毫無疑問是 React 。下面這篇文章主要給大家分享了關(guān)于想用好React的你必須要知道的一些事情,文中介紹的非常詳細(xì),對(duì)大家具有一定參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-07-07

最新評(píng)論

怀远县| 德保县| 白朗县| 西平县| 三门县| 怀柔区| 萝北县| 重庆市| 宜兰县| 南江县| 金乡县| 霸州市| 龙口市| 水富县| 玉田县| 昌图县| 连城县| 丹江口市| 静乐县| 邵东县| 江口县| 鄯善县| 和顺县| 平湖市| 卓资县| 孟连| 宁河县| 甘洛县| 新民市| 甘孜| 和田县| 莫力| 鲁甸县| 南丹县| 天镇县| 永宁县| 兴安县| 万载县| 萨嘎县| 石城县| 涿州市|