React編程中需要注意的兩個錯誤
前言
在React編程中, 我們習慣用useEffect、useState等Hook去進行開發(fā),但是在開發(fā)過程中難免會遇到許多問題,前陣子,我在寫代碼的時候,踩過不少坑,這里先列舉兩個較為常見的,也希望讀者們看完這篇文章能夠避免踩坑!
一. useEffect無限渲染
背景:
- 頁面初始化的時候,我們需要通過useEffect()來進行一些初始化工作。
- 在useEffect()方法中,調用了代碼getData()去后臺調取數(shù)據(jù)。
- 比如頁面所需的userName字段,我們在獲取數(shù)據(jù)后,調用setUserName(userName)來進行賦值。
偽代碼如下:
import React, { useState, useEffect } from 'react';
const App = () => {
const [userName, setUserName] = useState<string>('')
useEffect(() => {
// 調取后臺接口
const data = getData()
// 賦值給對應的State
setUserName(data.userName)
})
return (
<div>
<span>用戶名:{userName}</span>
</div>
)
}
export default App;
這樣的代碼看似沒什么問題,邏輯也很正確,但是實際效果會發(fā)生什么呢?來看下下面的例子:
import React, { useState, useEffect } from 'react';
const App = () => {
const [count, setCount] = useState(0)
useEffect(() => {
setCount(count+1)
})
return (
<div>
<span>{count}</span>
</div>
)
}
export default App;
頁面效果如下:

大家測試一下就會發(fā)現(xiàn),頁面上的數(shù)字是會無限增長的,而且你的電腦內存一下子Up起來(可以聽聽你的電腦風扇是不是吹得更猛了~)。
這個結果說明了什么?說明了useEffect()在無限的調用中。
原因分析如下:
- useEffect()可以理解為初始化,那么初始化中對 有狀態(tài)的變量 進行了值的更新。
- 而通過useState()創(chuàng)建出來的 有狀態(tài)的變量 ,其值一旦發(fā)生改變,又會重新渲染頁面,那么又會重新調用useEffect()方法。
- 因此就成了一個無限循環(huán)。最終造成上述圖片所展示的效果。
解決方案如下:useEffect()的第二個參數(shù)加一個空數(shù)組即可。
import React, { useState, useEffect } from 'react';
const App = () => {
const [count, setCount] = useState(0)
useEffect(() => {
setCount(count+1)
},[])
return (
<div>
<span>{count}</span>
</div>
)
}
export default App;
那么useEffect()就只會執(zhí)行一次:

二. 帶狀態(tài)的變量賦給Input框作為默認值,頁面無法修改內容
廢話不說,直接上案例:
import React, { useState, useEffect } from 'react';
const App = () => {
const [count, setCount] = useState('初始內容')
return (
<div>
<input type="text" value={count} />
</div>
)
}
export default App;
那么頁面的效果是這樣的:

可以發(fā)現(xiàn)我明明嘗試輸入字段,但是Input的內容依舊無法改變。原因如下:
- 我們用帶狀態(tài)的變量作為默認值賦給Input后,頁面會顯示其初始內容。
- Input框的value值代表其內容值,那么竟然和這個帶狀態(tài)的變量進行了綁定,那么要想Input框的內容發(fā)生改變,帶狀態(tài)的變量也必須改變,這樣才能觸發(fā)渲染。
- 但是我們在Input中輸入一些信息,而這個帶狀態(tài)的變量并沒有感知到這個變量的值發(fā)生了改變,所以頁面上的內容也不會發(fā)生改變。
解決方案:給這個Input框增加一個onChange事件,讓其監(jiān)聽到內容的改變,并實時的調用setXXX方法。
代碼如下:
import React, { useState, useEffect } from 'react';
const App = () => {
const [count, setCount] = useState('初始內容')
return (
<div>
<input type="text" value={count} onChange={(event)=>setCount(event.target.value)}/>
</div>
)
}
export default App;
頁面效果如下:

總結
到此這篇關于React編程中需要注意的兩個錯誤的文章就介紹到這了,更多相關React編程錯誤內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
React報錯之Object?is?possibly?null的問題及解決方法
這篇文章主要介紹了React報錯之Object?is?possibly?null的問題,造成 "Object is possibly null"的錯誤是因為useRef()鉤子可以傳遞一個初始值作為參數(shù),而我們傳遞null作為初始值,本文給大家分享詳細解決方法,需要的朋友可以參考下2022-07-07
React實現(xiàn)監(jiān)聽粘貼事件并獲取粘貼板中的截圖
這篇文章主要介紹了React實現(xiàn)監(jiān)聽粘貼事件并獲取粘貼板中的截圖方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
詳解react-router 4.0 下服務器如何配合BrowserRouter
這篇文章主要介紹了詳解react-router 4.0 下服務器如何配合BrowserRouter,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12

