react使用usestate踩坑

usestate的常規用法
在react框架中,不適用類組件,使用函數式組件又想自定義數據維護業務開發的時候,就需要使用react提供的hook來完成。usestate就是最常見的一種hook。

const [name,setName] = useState('dx');
setName('dx1'

中括號實際是一個解構運算,第一個name是設置的值,第二個setName是隻能用來改變name的方法。

useState遇到的坑
1、useState不適合複雜對象的更改。
因爲useState不能像setState那樣進行合併更新,當使用useState第二個參數進行數據更新的時候,必須傳入一個完整的結構,而不僅僅只是改變的那一部分。

2、useState異步回調的問題
當使用usestate對數據進行更新,並不能立刻獲取到最新的數據。

  const [name, setName] = useState('dx');

  const handleTest = () => {
    console.log(name) // dx
    setName('dx1')
    console.log(name) // dx
  }

解決的辦法。
一、配合useEffect使用

  const [name, setName] = useState('dx');
  const handleTest = () => {
    console.log(name) //dx
    setName('dx1')
    console.log(name)//dx
  }
  
  useEffect(() => {
    console.log(name) //dx1
  },[name])

二、創建一個新的變量保存最新的數據

  const [name, setName] = useState('dx');
  const handleTest = () => {
    console.log(name) //dx
    const newName = "dx1"
    setName(newName)
    console.log(newName) //dx1
  }

三、用一個函數包裹,不推薦使用,因爲函數裏面所有的東西都會全部重新定義

const [name, setName] = useState('dx');
 function text () {
   const handleTest = () => {
     console.log(name) //dx
     const newName = "dx1"
     setName(newName)
     console.log(name) //dx
     console.log(newName) //dx1
   }
   useEffect(() => {
     console.log(name) //dx1
   },[name])

   return (
     <div>
       {name} //點擊之前dx,點擊按鈕之後dx1
      <button type="button" onClick={handleTest }>改變名字</button>
     </div>
   )
 }
console.log(name) //點擊按鈕之前dx,點擊按鈕之後dx1

3、根據hook的規則,使用useState的位置有限制
僅頂層調用 Hook :不能在循環,條件,嵌套函數等中調用useState()。
在多個useState()調用中,渲染之間的調用順序必須相同。
僅從React 函數調用 Hook:必須僅在函數組件或自定義鉤子內部調用useState()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章