首頁 web前端 js教程 react hooks是什麼?

react hooks是什麼?

Nov 26, 2020 pm 04:50 PM
react hooks

React hooks是React16.8的新特性,可以讓React函數元件具有狀態,並提供類似componentDidMount和componentDidUpdate等生命週期方法。

react hooks是什麼?

我們大部分 React 類別元件可以保存狀態,而函數元件不能?且類別組件具有生命週期,而函數組件卻不能?

React 早期版本,類別元件可以透過繼承PureComponent來最佳化一些不必要的渲染,相對於函數元件,React 官網沒有提供對應的方法來快取函數元件以減少一些不必要的渲染,直接16.6出來的 React.memo函數。

React 16.8 新出來的Hooks可以讓React 函數元件具有狀態,並提供類似 componentDidMount和componentDidUpdate等生命週期方法。

Hook 這個字的意思是"鉤子"。

React Hooks 的意思是,元件盡量寫成純函數,如果需要外部功能和副作用,就用鉤子把外部程式碼"鉤子"進來。 React Hooks 就是那些鉤子。

你需要什麼功能,就使用什麼鉤子。 React 預設提供了一些常用鉤子,你也可以封裝自己的鉤子。

所有的鉤子都是為函數引入外部功能,所以 React 約定,鉤子一律使用use前綴命名,以便於識別。你要使用 xxx 功能,鉤子就命名為 usexxx。

下面介紹 React 預設提供的四個最常用的鉤子。

  • useState()

  • useContext()

  • useReducer()

#useEffect()

#useState():狀態鉤子

useState()用於為函數組件引入狀態(state)。純函數不能有狀態,所以把狀態放在鉤子裡面。

本文前面那個元件類,使用者點擊按鈕,會導致按鈕的文字改變,文字取決於使用者是否點擊,這就是狀態。使用useState()重寫如下。

import React, { useState } from "react";
export default function  Button()  {
  const  [buttonText, setButtonText] =  useState("Click me,   please");
  function handleClick()  {
    return setButtonText("Thanks, been clicked!");
  }
  return  <button  onClick={handleClick}>{buttonText}</button>;
}
登入後複製

demo位址:https://codesandbox.io/s/nifty-waterfall-4i2dq

上面程式碼中,Button 元件是一個函數,內部使用useState ()鉤子引入狀態。

useState()這個函數接受狀態的初始值,作為參數,上例的初始值為按鈕的文字。此函數傳回一個數組,數組的第一個成員是一個變數(上例是buttonText),指向狀態的目前值。第二個成員是函數,用來更新狀態,約定是set前綴加上狀態的變數名稱(上例是setButtonText)。 useContext():共用狀態鉤子

#如果需要在元件之間共用狀態,可以使用useContext()。

現在有兩個元件 Navbar 和 Messages,我們希望它們之間共用狀態。

<div className="App">
  <Navbar/>
  <Messages/>
</div>
登入後複製

第一步就是使用 React Context API,在元件外部建立一個 Context。

const AppContext = React.createContext({});
登入後複製

元件封裝程式碼如下。

<AppContext.Provider value={{
  username: &#39;superawesome&#39;
}}>
  <div className="App">
    <Navbar/>
    <Messages/>
  </div>
</AppContext.Provider>
登入後複製

上面程式碼中,AppContext.Provider提供了一個 Context 對象,這個對象可以被子元件共用。

Navbar 元件的程式碼如下。

const Navbar = () => {
  const { username } = useContext(AppContext);
  return (
    <div className="navbar">
      <p>AwesomeSite</p>
      <p>{username}</p>
    </div>
  );
}
登入後複製

上面程式碼中,useContext()鉤子函數用來引入 Context 對象,從中取得username屬性。

Message 元件的程式碼也類似。

const Messages = () => {
  const { username } = useContext(AppContext)
  return (
    <div className="messages">
      <h1>Messages</h1>
      <p>1 message for {username}</p>
      <p className="message">useContext is awesome!</p>
    </div>
  )
}
登入後複製

demo:https://codesandbox.io/s/react-usecontext-redux-0bj1v

useReducer():action 鉤子

###React 本身不提供狀態管理功能,通常需要使用外部函式庫。這方面最常用的函式庫是 Redux。 ######Redux 的核心概念是,元件發出 action 與狀態管理器通訊。狀態管理器收到 action 以後,使用 Reducer 函數算出新的狀態,Reducer 函數的形式是(state, action) => newState。 ######useReducers()鉤子用來引入 Reducer 功能。 ###
const [state, dispatch] = useReducer(reducer, initialState);
登入後複製
###上面是useReducer()的基本用法,它接受 Reducer 函數和狀態的初始值作為參數,並傳回一個陣列。陣列的第一個成員是狀態的目前值,第二個成員是發送 action 的dispatch函數。 ######下面是一個計數器的範例。用於計算狀態的 Reducer 函數如下。 ###
const myReducer = (state, action) => {
  switch(action.type)  {
    case(&#39;countUp&#39;):
      return  {
        ...state,
        count: state.count + 1
      }
    default:
      return  state;
  }
}
登入後複製
###元件程式碼如下。 ###
function App() {
  const [state, dispatch] = useReducer(myReducer, { count:   0 });
  return  (
    <div className="App">
      <button onClick={() => dispatch({ type: &#39;countUp&#39; })}>
        +1
      </button>
      <p>Count: {state.count}</p>
    </div>
  );
}
登入後複製
######demo:https://codesandbox.io/s/react-usereducer-redux-xqlet#########由於Hooks 可以提供共享狀態和Reducer 函數,所以它在這些方面可以取代Redux。但是,它沒辦法提供中間件(middleware)和時間旅行(time travel),如果你需要這兩個功能,還是要用 Redux。 ############useEffect():副作用鉤子#############useEffect()用來引入具有副作用的操作,最常見的就是向伺服器請求資料。以前,放在componentDidMount裡面的程式碼,現在可以放在useEffect()。 ######useEffect()的用法如下。 ###
useEffect(()  =>  {
  // Async Action
}, [dependencies])
登入後複製

上面用法中,useEffect()接受两个参数。第一个参数是一个函数,异步操作的代码放在里面。第二个参数是一个数组,用于给出 Effect 的依赖项,只要这个数组发生变化,useEffect()就会执行。第二个参数可以省略,这时每次组件渲染时,就会执行useEffect()。

下面看一个例子。

const Person = ({ personId }) => {
  const [loading, setLoading] = useState(true);
  const [person, setPerson] = useState({});
  useEffect(() => {
    setLoading(true); 
    fetch(`https://swapi.co/api/people/${personId}/`)
      .then(response => response.json())
      .then(data => {
        setPerson(data);
        setLoading(false);
      });
  }, [personId])
  if (loading === true) {
    return <p>Loading ...</p>
  }
  return <div>
    <p>You&#39;re viewing: {person.name}</p>
    <p>Height: {person.height}</p>
    <p>Mass: {person.mass}</p>
  </div>
}
登入後複製

上面代码中,每当组件参数personId发生变化,useEffect()就会执行。组件第一次渲染时,useEffect()也会执行。

demo:https://codesandbox.io/s/react-useeffect-redux-9t3bg

创建自己的 Hooks

上例的 Hooks 代码还可以封装起来,变成一个自定义的 Hook,便于共享。

const usePerson = (personId) => {
  const [loading, setLoading] = useState(true);
  const [person, setPerson] = useState({});
  useEffect(() => {
    setLoading(true);
    fetch(`https://swapi.co/api/people/${personId}/`)
      .then(response => response.json())
      .then(data => {
        setPerson(data);
        setLoading(false);
      });
  }, [personId]);  
  return [loading, person];
};
登入後複製

上面代码中,usePerson()就是一个自定义的 Hook。

Person 组件就改用这个新的钩子,引入封装的逻辑。

const Person = ({ personId }) => {
  const [loading, person] = usePerson(personId);
  if (loading === true) {
    return <p>Loading ...</p>;
  }
  return (
    <div>
      <p>You&#39;re viewing: {person.name}</p>
      <p>Height: {person.height}</p>
      <p>Mass: {person.mass}</p>
    </div>
  );
};
登入後複製

demo:https://codesandbox.io/s/react-useeffect-redux-ghl7c

更多编程相关知识,请访问:编程学习网站!!

以上是react hooks是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C/C在JavaScript口譯員和編譯器中的作用 C/C在JavaScript口譯員和編譯器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

Python vs. JavaScript:比較用例和應用程序 Python vs. JavaScript:比較用例和應用程序 Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

從網站到應用程序:JavaScript的不同應用 從網站到應用程序:JavaScript的不同應用 Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

See all articles