国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React Hooks解析

這篇具有很好參考價值的文章主要介紹了React Hooks解析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. react使用hook的意義

Hook 是 React 16.8 的新增特性,它可以讓我們在不編寫class的情況下使用state以及其他的React特性(比如生命周期)。
class組件與函數(shù)式組件:
  • class組件可以定義自己的state,用來保存組件自己內(nèi)部的狀態(tài),函數(shù)式組件不可以,因為函數(shù)每次調(diào)用都會產(chǎn)生新的臨時變量;
  • class組件有 自己的生命周期 ,我們可以在 對應的生命周期中完成自己的邏輯, 比如在componentDidMount中發(fā)送網(wǎng)絡請求,并且該生命周期函數(shù)只會執(zhí)行一次,如果在函數(shù)中發(fā)送網(wǎng)絡請求,意味著每次重新渲染都會重新發(fā)送一次網(wǎng)絡請求;
  • class組件可以 在狀態(tài)改變時只會重新執(zhí)行render函數(shù) 以及 我們希望重新調(diào)用的生命周期函數(shù)componentDidUpdate 等,函數(shù)式組件在重新渲染時,整個函數(shù)都會被執(zhí)行,似乎沒有什么地方可以只讓它們調(diào)用一次;

hook的出現(xiàn)就是為了解決函數(shù)式組件中實現(xiàn)class組件的很多特性,它可以讓我們在不編寫class的情況下使用state以及其他的React特性;

2. useState Hook解析

useState來自react,需要從react中導入,它是一個hook
  • 參數(shù):初始化值,如果不設置為undefined;
  • 返回值:數(shù)組,包含兩個元素,元素一: 當前狀態(tài)的值(第一調(diào)用為初始化值) ,元素二: 設置狀態(tài)值的函數(shù)

注意:

  • 只能在函數(shù)最外層調(diào)用 Hook。不要在循環(huán)、條件判斷或者子函數(shù)中調(diào)用;
  • 只能在 React 的函數(shù)組件中調(diào)用 Hook。不要在其他 JavaScript 函數(shù)中調(diào)用;
import { memo, useState } from "react";

// 普通的函數(shù), 里面不能使用hooks
// 在自定義的hooks中, 可以使用react提供的其他hooks: 必須使用use開頭
// function useFoo() {
//   const [ message ] = useState("Hello World")
//   return message
// }

function CounterHook(props) {
  const [counter, setCounter] = useState(0)
  const [name] = useState("why")
  console.log(name)

  // const message = useFoo()

  return (
    <div>
      <h2>當前計數(shù): {counter}</h2>
      <button onClick={e => setCounter(counter+1)}>+1</button>
      <button onClick={e => setCounter(counter-1)}>-1</button>
    </div>
  )
}

3. useEffect Hook解析

  • Effect Hook 可以讓你來完成一些類似于class中生命周期的功能;
  • 類似于 網(wǎng)絡請求、手動更新DOM、一些事件的監(jiān)聽 ,都是 React更新DOM的一些副作用;
  • 對于完成這些功能的Hook被稱之為 Effect Hook;

useEffect的解析:

  • 通過useEffect的Hook,可以告訴React需要在渲染后執(zhí)行某些操作;
  • useEffect 要求我們傳入一個回調(diào)函數(shù) ,在React 執(zhí)行完更新DOM操作之后 ,就 會回調(diào)這個函數(shù);
  • 默認情況下, 無論是第一次渲染之后 ,還是每次更新之后,都會 執(zhí)行這個 回調(diào)函數(shù);

清除Effect:

在class組件的編寫過程中,某些副作用的代碼,我們需要在componentWillUnmount中進行清除;
  • 比如我們之前的事件總線或Redux中手動調(diào)用subscribe;
  • 都需要在 componentWillUnmount有對應的取消訂閱;
useEffect傳入的 回調(diào)函數(shù)A 本身可以有一個返回值,這個返回值是另外一個 回調(diào)函數(shù)B 這是 effect 可選的清除機制 。 每個 effect 都可以返回一個清除函數(shù) 如此可以 將添加和移除訂閱的邏輯放在一起 , 都屬于 effect 的一部分;
  // 負責告知react, 在執(zhí)行完當前組件渲染之后要執(zhí)行的副作用代碼
  useEffect(() => {
    // 1.監(jiān)聽事件
    // const unubscribe = store.subscribe(() => {
    // })
    // function foo() {
    // }

    // 返回值: 回調(diào)函數(shù) => 組件被重新渲染或者組件卸載的時候執(zhí)行
    return () => {

    }
  })
默認情況下,useEffect的回調(diào)函數(shù)會在每次渲染時都重新執(zhí)行,但是這會導致兩個問題:
  • 某些代碼我們只是 希望執(zhí)行一次即可 ,類似于componentDidMount和componentWillUnmount中完成的事情;(比如網(wǎng)絡請求、訂閱和取消訂閱);
  • 多次執(zhí)行也會導致一定的性能問題;

useEffect的解決方式:

useEffect實際上有兩個參數(shù),參數(shù)一: 執(zhí)行的回調(diào)函數(shù), 參數(shù)二:該 useEffect在哪些state發(fā)生變化時,才重新執(zhí)行
如果一個函數(shù)我們不希望依賴任何的內(nèi)容時,也可以傳入一個空的數(shù)組 【】;
  useEffect(() => {
    console.log("修改title:", count)
  }, [count])

  useEffect(() => {
    console.log("監(jiān)聽redux中的數(shù)據(jù)")
    return () => {}
  }, [])

  useEffect(() => {
    console.log("監(jiān)聽eventBus的why事件")
    return () => {}
  }, [])

  useEffect(() => {
    console.log("發(fā)送網(wǎng)絡請求, 從服務器獲取數(shù)據(jù)")

    return () => {
      console.log("會在組件被卸載時, 才會執(zhí)行一次")
    }
  }, [])

?4. useContext Hook解析

在開發(fā)中,要在組件中使用共享的Context有兩種方式:

  • 類組件可以通過 類名.contextType = MyContext方式,在類中獲取context;
  • 多個Context或者在函數(shù)式組件中通過 MyContext.Consumer 方式共享context;
但是多個Context共享時的方式會存在大量的嵌套:
  • Context Hook允許我們通過Hook來直接獲取某個Context的值;

contxt.js

import { createContext } from "react";

const UserContext = createContext()
const ThemeContext = createContext()


export {
  UserContext,
  ThemeContext
}

App.jsx文章來源地址http://www.zghlxwxcb.cn/news/detail-716591.html

import React, { memo, useContext } from 'react'
import { UserContext, ThemeContext } from "./context"

const App = memo(() => {
  // 使用Context
  const user = useContext(UserContext)
  const theme = useContext(ThemeContext)

  return (
    <div>
      <h2>User: {user.name}-{user.level}</h2>
      <h2 style={{color: theme.color, fontSize: theme.size}}>Theme</h2>
    </div>
  )
})

export default App

5. useReducer Hook解析

useReducer僅僅是useState的一種替代方案:
  • 在某些場景下,如果state的處理邏輯比較復雜,我們可以通過useReducer來對其進行拆分;
  • 或者這次修改的state需要依賴之前的state時,也可以使用;
import React, { memo, useReducer } from 'react'

function reducer(state, action) {
  switch(action.type) {
    case "increment":
      return { ...state, counter: state.counter + 1 }
    case "decrement":
      return { ...state, counter: state.counter - 1 }
    case "add_number":
      return { ...state, counter: state.counter + action.num }
    case "sub_number":
      return { ...state, counter: state.counter - action.num }
    default:
      return state
  }
}


const App = memo(() => {
  const [state, dispatch] = useReducer(reducer, { counter: 0, friends: [], user: {} })


  return (
    <div>
      <h2>當前計數(shù): {state.counter}</h2>
      <button onClick={e => dispatch({type: "increment"})}>+1</button>
      <button onClick={e => dispatch({type: "decrement"})}>-1</button>
      <button onClick={e => dispatch({type: "add_number", num: 5})}>+5</button>
      <button onClick={e => dispatch({type: "sub_number", num: 5})}>-5</button>
      <button onClick={e => dispatch({type: "add_number", num: 100})}>+100</button>
    </div>
  )
})

export default App
數(shù)據(jù)是不會共享的,它們只是使用了相同的counterReducer的函數(shù)而已,所以,useReducer只是useState的一種替代品,并不能替代Redux。

6.?useRef Hook解析

useRef返回一個ref對象,返回的ref對象在組件的 整個生命周期保持不 變。
最常用的ref是兩種用法:
  • 用法一:引入DOM(或者組件,但是需要是class組件)元素;
  • 用法二:保存一個數(shù)據(jù),這個對象在整個生命周期中可以保存不變;
import React, { memo, useRef } from 'react'

const App = memo(() => {
  const titleRef = useRef()
  const inputRef = useRef()
  
  function showTitleDom() {
    console.log(titleRef.current)
    inputRef.current.focus()
  }

  return (
    <div>
      <h2 ref={titleRef}>Hello World</h2>
      <input type="text" ref={inputRef} />
      <button onClick={showTitleDom}>查看title的dom</button>
    </div>
  )
})

export default App

到了這里,關于React Hooks解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 前端開發(fā)筆記 | React Hooks子組件和父組件交互

    前端開發(fā)框架目前比較常用的就是react、vue等,其中使用React Hooks 帶來了不少的好處,今天來聊聊React Hooks開發(fā)方式下,子組件和父組件的交互。 子組件定義 父組件調(diào)用子組件 父組件定義 子組件中刷新父組件按鈕文案 實際效果:點擊子組件中“改變父組件按鈕”,父組件中

    2024年02月11日
    瀏覽(15)
  • React學習8 hooks

    1、setState setState更新數(shù)據(jù)是異步的,如果想獲取更新完的數(shù)據(jù),需要通過第二個參數(shù)回調(diào)函數(shù)來獲取 2、lazyLoad,用的時候再調(diào)用,不會預先調(diào)用,需要用suspence包裹注冊路由 3、stateHook userState 函數(shù)組件中使用state,通過調(diào)用React.useState()使用,該數(shù)組兩個變量,第一個存儲狀態(tài)

    2024年02月08日
    瀏覽(16)
  • 【前端知識】React 基礎鞏固(四十四)——其他Hooks(useContext、useReducer、useCallback)

    在類組件開發(fā)時,我們通過 類名.contextType = MyContext 的方式,在類中獲取context,多個Context或者在函數(shù)式組件中通過 MyContext.Consumer 方式共享context: 可以看到,當我們需要使用多個Context時,存在大量繁瑣的嵌套代碼;而Context Hook能夠讓我們通過Hook直接獲取某個Context的值,如

    2024年02月14日
    瀏覽(27)
  • ahooks.js:一款強大的React Hooks庫及其API使用教程(四)

    ahooks是一款由阿里巴巴開發(fā)團隊設計的React Hooks庫,提供了一系列實用的React Hooks,以便開發(fā)者更好地使用React的功能。ahooks的設計原則是“最小API,最大自由”,旨在提供最小的、最易于理解和使用的API,同時保留最大的使用自由度。 使用npm或yarn安裝ahooks: API介紹合集:

    2024年02月11日
    瀏覽(22)
  • ahooks.js:一款強大的React Hooks庫及其API使用教程(二)

    ahooks是一款由阿里巴巴開發(fā)團隊設計的React Hooks庫,提供了一系列實用的React Hooks,以便開發(fā)者更好地使用React的功能。ahooks的設計原則是“最小API,最大自由”,旨在提供最小的、最易于理解和使用的API,同時保留最大的使用自由度。 使用npm或yarn安裝ahooks: 前面的API:aho

    2024年02月12日
    瀏覽(27)
  • ahooks.js:一款強大的React Hooks庫及其API使用教程(一)

    ahooks是一款由阿里巴巴開發(fā)團隊設計的React Hooks庫,提供了一系列實用的React Hooks,以便開發(fā)者更好地使用React的功能。ahooks的設計原則是“最小API,最大自由”,旨在提供最小的、最易于理解和使用的API,同時保留最大的使用自由度。 使用npm或yarn安裝ahooks: 1. useRequest useR

    2024年02月12日
    瀏覽(22)
  • 前端基本功 用 React Hooks + Antd 實現(xiàn)一個 Todo-List

    前端基本功 用 React Hooks + Antd 實現(xiàn)一個 Todo-List

    To-do list(待辦事項列表)是用來記錄和管理要完成的任務、活動或項目的列表。它是一種簡單而常見的工具,用于幫助人們組織和安排日常生活中的任務。每當您有一項任務需要完成或者要記住某些事情時,您可以將它添加到待辦事項列表中。 學習前端的一些新知識時,經(jīng)

    2024年02月17日
    瀏覽(22)
  • 前端(三)React踩坑記錄

    前端(三)React踩坑記錄

    ? ? ? ? 作者最近新的平臺項目是需要用react的,和vue區(qū)別還是比較大的,這里記錄下踩坑和使用經(jīng)驗。 ? ? ? ? 框架:antd ? ? ? ? 依賴: ? ? ? ? 不知道是react本身編譯規(guī)則嚴苛,還是公司的pipline設定,代碼里面編譯的時候不允許有未使用的變量,不允許使用未導入的組

    2024年04月24日
    瀏覽(21)
  • JavaScript 框架比較:Angular、React、Vue.js

    在 Web 開發(fā)領域,JavaScript 提供大量技術??晒┻x擇。其中最典型的三套組合,分別是 MERN、MEAN 和 MEVN。這些首字母相同的選項各自代表不同的技術加工具組合。為了在這些技術棧中做出明智選擇,讓我們先從核心組件聊起,再對各自前端框架(React、Angular 和 Vue)進行簡化比

    2024年01月20日
    瀏覽(36)
  • 從javascript到vue再到react:前端開發(fā)框架的演變

    從javascript到vue再到react:前端開發(fā)框架的演變

    目錄 JavaScript: 動態(tài)語言的基礎 JavaScript:Web開發(fā)的起點 Vue.js: 漸進式框架的興起 Vue.js:簡潔、高效的前端框架 React.js: 聲明式UI的革新 React.js:強大、靈活的前端框架 演變之路與未來展望 演變過程 當提到前端開發(fā)中的框架時,JavaScript、Vue.js和React.js是三個最常見的名詞。它

    2024年02月07日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包