React中useState,useEffect使用的幾個(gè)例子

useState,useEffect使用的幾個(gè)例子

  • 國(guó)外react學(xué)習(xí)視頻案例

例子一秸应,需要三次增加的時(shí)候可以使用setCount的回調(diào)函數(shù)獲取上次使用的結(jié)果

這里三次使用 setCount(count + 1)只能獲取一次結(jié)果

import { useState } from 'react'
import './App.css'

function App() {
  const [count, setCount] = useState(0)
  const handleClick = () => {
    // setCount(count + 1)
    // setCount(count + 1)
    // setCount(count + 1)
    setCount((prev) => prev + 1)
    setCount((prev) => prev + 1)
    setCount((prev) => prev + 1)
  }
  return (
    <>
      <button onClick={handleClick}>Click me</button>
      <p>{count}</p>
    </>
  )
}

export default App

例子二虑凛,配合三元表達(dá)式展示UI

function ProductId({ id }) {
  const [something, setSomething] = useState(0)
  useEffect(() => {}, [something])
  // if(!id) {
  //   return 'no id'
  // }
  return (
    <section>
      {!id ? 'no products' : <div>card id: {id}</div>}
    </section>
  )
}

export default ProductId

例子三,多元素的表單软啼,setState直接塞入對(duì)象桑谍,onChange事件作歸納,減少代碼量

import { useEffect, useState } from 'react'
import './App.css'

function App() {
  const [form, setForm] = useState({
    name: '',
    password: '',
    phone: ''
  })
  const handleChange = (e) => {
    setForm((prev) => {
      return {
        ...prev,
        [e.target.name]: e.target.value
      }
    })
    console.log(form)
  }
  return (
    <form>
      <p>name:</p>
      <input type="text" onChange={handleChange} name="name" />
      <p>password:</p>
      <input type="password" onChange={handleChange} name="password" />
      <p>phone:</p>
      <input type="number" onChange={handleChange} name="phone" />
    </form>
  )
}

export default App;

例子四祸挪,購(gòu)物車價(jià)格數(shù)量跟隨

  1. 不適合的案例
import { useEffect, useState } from 'react'
import './App.css'
// 不好的示例锣披,這里price不需要通過(guò)監(jiān)聽(tīng)count來(lái)實(shí)現(xiàn)
function App() {
  const singPrice = 5;
  const [count, setCount] = useState(0)
  const [price, setPrice] = useState(0)
  const handleClick = () => {
    setCount(count + 1)
  }
  useEffect(() => {
    setPrice(count * singPrice)
  }, [count])
  return (
    <div>
      <button onClick={handleClick}>Add +1</button>
      <p>show the price: {price}</p>
    </div>
  )
}
export default App;
  1. 正確使用
import { useState } from 'react'
import './App.css'

function App() {
  const singPrice = 5;
  const [count, setCount] = useState(0)
  const price = singPrice * count
  const handleClick = () => {
    setCount(count + 1)
  }
  return (
    <div>
      <button onClick={handleClick}>Add +1</button>
      <p>show the price: {price}</p>
    </div>
  )
}
export default App;

例子五,useEffect監(jiān)聽(tīng)的參數(shù)贿条,不要監(jiān)聽(tīng)引用類型雹仿,必須監(jiān)聽(tīng)值類型

這里是因?yàn)樵贘avaScript,兩個(gè)引用類型指向的不同的引用地址整以,即使看起來(lái)相同也不是全等的

function App() {
  const [product, setProduct] = useState({
    num: 100,
    totalPrice: 1000
  })
  const handleClick =() => {
    setProduct({
      num: 100,
      totalPrice: 1000
    })
  }

  useEffect(() => {
    
  }, [product.num])

  return (
    <div>
      <button onClick={handleClick}>Add +1</button>
      <p>show the price: {product.totalPrice}</p>
    </div>
  )
}
export default App;

例子六胧辽,發(fā)送ajax請(qǐng)求時(shí),處理loading數(shù)據(jù)和初始參數(shù)的處理

  • useEffect(() => {}, []) 模擬初始化的生命周期
  • 這里例子使用 post?.title,當(dāng)然也可以使用typescript定義數(shù)據(jù)產(chǎn)生的類型
function App() {
  const [post, setPost] = useState(null)
  const [isLoad, setIsLoad] = useEffect(false)

  useEffect(() => {
    fetch("https://dummyjson.com/posts/1")
    .then((res) => res.json())
    .then((data) => {
      setPost(data)
      setIsLoad(true)
    })
  }, [])

  return (
    <div>
      {
        !isLoad ?  "Loading Page ..." : (
          <div>
            <p>{post?.title}</p>
            <p>{post?.body}</p>
          </div>
        )
      }
    </div>
  )
}
export default App;

例子七 卸載掛載的組件

  • useEffect 的return中返回一個(gè)回調(diào)函數(shù)可以卸載事件公黑,類似于組件生命周期中銷毀的生命周期
  • 這里封裝了一個(gè)公用的hooks組件
const useWindowSize = () => {
  const [windowSize, setWindowSize] = useState(1920)
  useEffect(() => {
    const handleWindowSizeChange = () => {
      setWindowSize(window.innerWidth)
    }
    window.addEventListener("resize", handleWindowSizeChange)
    return () => {
      window.removeEventListener("resize", handleWindowSizeChange)
    }
  }, [])
  return windowSize;
}

function component1() {
  const size = useWindowSize()
  return (<p>component1 page</p>)
}

function component2() {
  const size = useWindowSize()
  return (<p>component2 page</p>)
}

例子八 頁(yè)面計(jì)時(shí)器

  1. 頁(yè)面計(jì)時(shí)器的錯(cuò)誤案例,計(jì)時(shí)器是跑的邑商,但是由于閉包的鎖定,每次count值最終值都是1
// 結(jié)果會(huì)反復(fù)橫跳凡蚜,錯(cuò)誤代碼
function App() {
  const [count, setCount] = useState(0)

  useEffect(() => {
    setInterval(() => {
      console.log("Interval run")
      setCount(count + 1)
    }, 1000);
  }, [])

  return (
    <div>
      { count }
    </div>
  )
}
export default App;
  1. 監(jiān)聽(tīng)count的值人断,卸載和加載setInterval
  useEffect(() => {
    const i =  setInterval(() => {
      console.log("Interval run")
      setCount(count + 1)
    }, 1000);
    return () => {
      clearInterval(i)
    }
  }, [count])
  1. 使用set函數(shù)的回調(diào),讀取上次返回的值
  useEffect(() => {
    setInterval(() => {
      console.log("Interval run")
      setCount(prev => prev + 1)
    }, 1000);
  }, [])
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末朝蜘,一起剝皮案震驚了整個(gè)濱河市恶迈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谱醇,老刑警劉巖暇仲,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異枣抱,居然都是意外死亡熔吗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門佳晶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人讼载,你說(shuō)我怎么就攤上這事轿秧≈械” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵菇篡,是天一觀的道長(zhǎng)漩符。 經(jīng)常有香客問(wèn)我,道長(zhǎng)驱还,這世上最難降的妖魔是什么嗜暴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮议蟆,結(jié)果婚禮上闷沥,老公的妹妹穿的比我還像新娘。我一直安慰自己咐容,他們只是感情好舆逃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著戳粒,像睡著了一般路狮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔚约,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天奄妨,我揣著相機(jī)與錄音,去河邊找鬼苹祟。 笑死砸抛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苔咪。 我是一名探鬼主播锰悼,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼团赏!你這毒婦竟也來(lái)了箕般?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舔清,失蹤者是張志新(化名)和其女友劉穎丝里,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體体谒,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杯聚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抒痒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幌绍。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傀广,到底是詐尸還是另有隱情颁独,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布伪冰,位于F島的核電站誓酒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贮聂。R本人自食惡果不足惜靠柑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吓懈。 院中可真熱鬧歼冰,春花似錦、人聲如沸骄瓣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榕栏。三九已至畔勤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扒磁,已是汗流浹背庆揪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妨托,地道東北人缸榛。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像兰伤,于是被迫代替她去往敵國(guó)和親内颗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • react中hook即為鉤子函數(shù)敦腔,react 16.8以上版本方可使用均澳,為了解決函數(shù)式組件,不能像基于類的組件一樣...
    單只蝴蝶_569d閱讀 2,398評(píng)論 0 0
  • 本文已經(jīng)過(guò)原作者 Shadeed 授權(quán)翻譯。 很有可能你已經(jīng)讀過(guò)很多關(guān)于如何使用React Hook 的文章判族。但有...
    涅槃快樂(lè)是金閱讀 1,026評(píng)論 0 1
  • 1.使用 useState() 進(jìn)行狀態(tài)管理 useState()是改變狀態(tài)的開(kāi)關(guān)躺盛,將狀態(tài)添加到函數(shù)組件需要4個(gè)步...
    宋小菜_菜菜閱讀 72,320評(píng)論 9 25
  • 什么是hooks? hooks 是 react 在16.8版本開(kāi)始引入的一個(gè)新功能,它擴(kuò)展了函數(shù)組件的功能形帮,使得函...
    JoeRay61閱讀 557評(píng)論 0 0
  • 1. 引言 工具型文章要跳讀槽惫,而文學(xué)經(jīng)典就要反復(fù)研讀周叮。如果說(shuō) React 0.14 版本帶來(lái)的各種生命周期可以類比...
    黃子毅閱讀 2,075評(píng)論 0 10