国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
如何自定義 Hooks
組件之間共享邏輯
自定義 Hooks 允許你共享有狀態(tài)邏輯,而不是狀態(tài)本身
分類
功能型 Hooks
useWindowWidth
useLocalStorage
業(yè)務(wù)型 Hooks
useFetch
useModal
在多個(gè) Hook 之間傳遞信息
將 event handlers 傳遞給自定義 Hooks
開源 React Hooks 庫
總結(jié)
首頁 web前端 js教程 深入理解React的自定義Hook

深入理解React的自定義Hook

Apr 20, 2023 pm 06:22 PM
前端 react.js 代碼規(guī)范

深入理解React的自定義Hook

在 React 項(xiàng)目中,我們經(jīng)常會使用到 React 自帶的幾個(gè)內(nèi)置 Hooks,如 useState,useContext 和useEffect。但有時(shí),我們可能希望有一個(gè)特定目的的 Hook :例如獲取數(shù)據(jù) useData,獲取連接 useConnect 等。雖然在 React 中找不到這些 Hooks,但 React 提供了非常靈活的方式讓你為自己的需求來創(chuàng)建自己的自定義 Hooks。

如何自定義 Hooks

在 React 中你必須遵循以下命名約定:

  • React Component: React 組件名稱必須以大寫字母開頭,如 StatusBar 和 SaveButton。React組件還需要 返回 一些React知道如何渲染的東西,比如 JSX

  • React Hook: Hook 名必須以 use 開頭,后面跟著一個(gè)大寫字母,比如 useState (內(nèi)置)或useStatus (自定義)。與 React 組件不同的是自定義 Hook 可以返回任意值。

這個(gè)命名約定確保你始終可以查看組件,并了解其狀態(tài)、效果以及其他 React 特性可能“隱藏”的位置。例如,如果你在組件中看到 getColor() 函數(shù)調(diào)用,你可以確定它不可能包含 React state,因?yàn)槠涿Q不以use開頭。但是,像 useStatus() 這樣的函數(shù)調(diào)用很可能包含對其他 Hooks 的調(diào)用!

組件之間共享邏輯

The code inside them describes what they want to do rather than how to do it .

自定義 Hooks 的核心是共享組件之間的邏輯。使用自定義 Hooks 能夠減少重復(fù)的邏輯,更重要的是,自定義 Hooks 內(nèi)部的代碼描述了它們想做什么,而不是如何做。當(dāng)你將邏輯提取到自定義Hooks 中時(shí),你可以隱藏如何處理某些"外部系統(tǒng)"或?yàn)g覽器 API 的調(diào)用的細(xì)節(jié),組件的代碼表達(dá)的是你的意圖,而不是實(shí)現(xiàn)細(xì)節(jié)。 下面是一個(gè)簡單的例子:

import { useState } from 'react';
function useCounter(initialValue) {
  const [count, setCount] = useState(initialValue);
  function increment() {
    setCount(count + 1);
  }
  return [count, increment];
}

這個(gè)自定義 Hook 叫做?useCounter,它接受一個(gè)初始值作為參數(shù),并返回一個(gè)數(shù)組,包含當(dāng)前的計(jì)數(shù)值和一個(gè)增加計(jì)數(shù)的函數(shù)。 使用自定義 Hook 非常簡單,只需要在函數(shù)組件中調(diào)用它即可。下面是一個(gè)使用?useCounter?的例子:

import React from 'react';
import useCounter from './useCounter';

function Counter() {
  const [count, increment] = useCounter(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
}

在這個(gè)例子中,我們導(dǎo)入了?useCounter,并在組件中調(diào)用它。我們將返回的數(shù)組解構(gòu)為?count?和?increment,然后在組件中使用它們。

自定義 Hooks 允許你共享有狀態(tài)邏輯,而不是狀態(tài)本身

自定義 Hooks 允許共享有狀態(tài)邏輯,但不能共享狀態(tài)本身。每個(gè)對 Hook 的調(diào)用都完全獨(dú)立于對同一個(gè) Hook 的其他調(diào)用。 以上面的 useCounter 為例:

import useCounter from &#39;./useCounter&#39;;
function Counter() {
	const [count1, increment1] = useCounter(0);
	const [count2, increment2] = useCounter(100);
  return (
    <div>
      <p>Count1: {count1}</p>
      <button onClick={increment1}>Increment1</button>
       <p>Count2: {count2}</p>
      <button onClick={increment2}>Increment2</button>
    </div>
  );
}

當(dāng)我們點(diǎn)擊 Increment2 時(shí),并不會影響 count1 ,因?yàn)槊恳粋€(gè) useCounter 的調(diào)用都是獨(dú)立的,其內(nèi)部狀態(tài)也是獨(dú)立的。

分類

功能型 Hooks

以實(shí)現(xiàn)特定功能或目的,與具體業(yè)務(wù)無關(guān):

useWindowWidth

該 hook 返回窗口寬度的值。

import { useState, useEffect } from &#39;react&#39;;
function useWindowWidth() {
  const [windowWidth, setWindowWidth] = useState(window.innerWidth);
  useEffect(() => {
    const handleResize = () => setWindowWidth(window.innerWidth);
    window.addEventListener(&#39;resize&#39;, handleResize);
    return () => window.removeEventListener(&#39;resize&#39;, handleResize);
  }, []);
  return windowWidth;
}

useLocalStorage

該 hook 允許你在本地存儲中存儲和檢索值。

import { useState } from &#39;react&#39;;

function useLocalStorage(key, initialValue) {
  const [storedValue, setStoredValue] = useState(() => {
    try {
      const item = window.localStorage.getItem(key);
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      console.log(error);
      return initialValue;
    }
  });

  const setValue = (value) => {
    try {
      setStoredValue(value);
      window.localStorage.setItem(key, JSON.stringify(value));
    } catch (error) {
      console.log(error);
    }
  };

  return [storedValue, setValue];
}

業(yè)務(wù)型 Hooks

useFetch

該 hook 允許你從 API 中獲取數(shù)據(jù)。

import { useState, useEffect } from &#39;react&#39;;
function useFetch(url) {
  const [data, setData] = useState(null);
  const [error, setError] = useState(null);
  const [isLoading, setIsLoading] = useState(true);
  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch(url);
        const json = await response.json();
        setData(json);
      } catch (error) {
        setError(error);
      } finally {
        setIsLoading(false);
      }
    };
    fetchData();
  }, [url]);
  return { data, error, isLoading };
}

useModal

該 hook 允許你管理模態(tài)對話框的狀態(tài)。

//useFetch.js
import {useState, useEffect} from &#39;react&#39;
//don&#39;t forget to give a url parameter for the function.
const useFetch = (url)=>{
  const [data, setData] = useState([])
  const getData = async ()=>{
    const response = await fetch(url)
    const userdata = await response.json()
    setData(userdata)
  }
 useEffect(()=>{
    getData()
  },[url])
  //return data that we will need in other components.
  return {data};
}
export default useFetch;

在多個(gè) Hook 之間傳遞信息

由于 Hook 本身就是函數(shù),因此我們可以在它們之間傳遞信息。下面我們以 useUserInfo 獲取用戶信息 為例:

//useUserInfo.jsx
import { useEffect,useState } from &#39;react&#39;
const useUserInfo = (userId) => {
  const [userInfo, setUserInfo] = useState({})
  useEffect(() => {
    fetch(&#39;/user&#39;)
      .then(res => res.json())
      .then(data => setUserInfo(data))
  }, [userId])
  return userInfo
}
//Home.jsx
...
const Home = ()=>{
	const [userId,setUserId] = useState(&#39;103&#39;)
	const useInfo = useUserInfo(userId)
	return (
	  <>
	     <div>name:{userInfo.name}</div>
	     <div>age:{userInfo.age}</div>
	     ...
	  </> 
	)
}

我們將 用戶 id 保存在 userId 狀態(tài)變量中,當(dāng)用戶進(jìn)行某一操作 setUserId 時(shí),由于?useState?為我們提供了?userId?狀態(tài)變量的最新值,因此我們可以將它作為參數(shù)傳遞給自定義的?useUserInfo?Hook:

const [userId,setUserId] = useState(&#39;103&#39;)
const userInfo = useUserInfo(userId)

此時(shí),我們的 userInfo 會隨著 userId ?的改變而更新。

將 event handlers 傳遞給自定義 Hooks

This section describes an experimental API that has not yet been released ?in a stable version of React. 本節(jié)描述了一個(gè)尚未在 React 穩(wěn)定版本中發(fā)布的 實(shí)驗(yàn)性 API。

你可能希望讓組件自定義其行為,而不是完全地將邏輯封裝 Hooks 中,我們可以通過將 event handlers 作為參數(shù)傳遞給 Hooks,下面是一個(gè)聊天室的例子:useChatRoom 接受一個(gè)服務(wù)端 url 和 roomId,當(dāng)調(diào)用這個(gè) Hook 的時(shí)候,會進(jìn)行連接,

export function useChatRoom({ serverUrl, roomId }) {
  useEffect(() => {
    const options = {
      serverUrl: serverUrl,
      roomId: roomId
    };
    const connection = createConnection(options);
    connection.connect();
    connection.on(&#39;message&#39;, (msg) => {
      showNotification(&#39;New message: &#39; + msg);
    });
    return () => connection.disconnect();
  }, [roomId, serverUrl]);
}

假設(shè)當(dāng)連接成功時(shí),你想將此邏輯移回你的組件:

export default function ChatRoom({ roomId }) {
  const [serverUrl, setServerUrl] = useState(&#39;https://localhost:1234&#39;);
  useChatRoom({
    roomId: roomId,
    serverUrl: serverUrl,
    onReceiveMessage(msg) {
      showNotification(&#39;New message: &#39; + msg);
    }
  });
  // ...

要做到這一點(diǎn),改變你的自定義 Hook ,把 onReceiveMessage 作為它的命名選項(xiàng)之一:

export function useChatRoom({ serverUrl, roomId, onReceiveMessage }) {
  useEffect(() => {
    const options = {
      serverUrl: serverUrl,
      roomId: roomId
    };
    const connection = createConnection(options);
    connection.connect();
    connection.on(&#39;message&#39;, (msg) => {
      onReceiveMessage(msg);
    });
    return () => connection.disconnect();
  }, [roomId, serverUrl, onReceiveMessage]); // ? All dependencies declared
}

這可以工作,但是當(dāng)你的自定義 Hook 接受事件處理程序時(shí),你還可以做一個(gè)改進(jìn)。 在 onReceiveMessage 上添加依賴并不理想,因?yàn)樗鼤?dǎo)致每次組件重新渲染時(shí)聊天都重新連接。將此事件處理程序包裝到 EffectEvent 中以將其從依賴項(xiàng)中移除:

import { useEffect, useEffectEvent } from &#39;react&#39;;  
// ...
export function useChatRoom({ serverUrl, roomId, onReceiveMessage }) {
  const onMessage = useEffectEvent(onReceiveMessage);
  useEffect(() => {
    const options = {
      serverUrl: serverUrl,
      roomId: roomId
    };
    const connection = createConnection(options);
    connection.connect();
    connection.on(&#39;message&#39;, (msg) => {
      onMessage(msg);
    });
    return () => connection.disconnect();
  }, [roomId, serverUrl]); // ? All dependencies declared
}

現(xiàn)在不會在每次重新渲染聊天室組件時(shí)進(jìn)行重新連接。

開源 React Hooks 庫

  • ahooks 一套由阿里巴巴開源的 React Hooks 庫,封裝了大量好用的 Hooks。
  • react-use 一個(gè)必不可少的 React Hooks 集合。其包含了傳感器、用戶界面、動畫效果、副作用、生命周期、狀態(tài)這六大類的Hooks。
  • useHooks 一組易于理解的 React Hook集合。
  • react-recipes 一個(gè)包含流行的自定義 Hook 的 React Hooks 實(shí)用程序庫。
  • Rhooks ?一組基本的 React 自定義Hooks。
  • react-hanger 一組有用的 hooks,用于特定于某些基本類型的狀態(tài)更改輔助函數(shù)。
  • Beautiful React Hook 一組漂亮的(希望有用的)React hooks 來加速你的組件和 hooks 開發(fā)。
  • Awesome React Hooks 一個(gè)很棒的 React Hooks 資源集合,該集合包含React Hooks教程、視頻、工具,Hooks列表。其中Hooks列表中包含了眾多實(shí)用的自定義Hooks。
  • SWR 一個(gè)用于獲取數(shù)據(jù)的 React Hooks 庫。只需一個(gè)Hook,就可以顯著簡化項(xiàng)目中的數(shù)據(jù)獲取邏輯。
  • React Hook Form 一個(gè)用于表單狀態(tài)管理和驗(yàn)證的 React Hooks (Web + React Native)。

總結(jié)

自定義 Hooks 可以幫助你遷移到更好的開發(fā)范式。通過將一些通用邏輯封裝在自定義 Hooks 中,你可以使組件代碼保持簡潔專注于核心意圖,這有助于減少重復(fù)性的代碼,并使你的代碼更易于維護(hù)更新,從而使你能夠更快速地開發(fā)新功能。

對于 Effect 而言,這樣可以使數(shù)據(jù)在 Effects 中流動的過程變得非常明確。這讓你的組件能夠專注于意圖,而不是 Effects 的具體實(shí)現(xiàn)。當(dāng) React 添加新功能時(shí),你可以刪除那些 Effects 而不影響任何組件。就像設(shè)計(jì)系統(tǒng)一樣,你可能會發(fā)現(xiàn)從應(yīng)用程序組件中提取常見習(xí)慣用法到自定義 Hooks 中是有非常幫助的。這將使你的組件代碼專注于意圖,并允許你避免頻繁編寫原始 Effects,這也是 React 開發(fā)者所推崇的。

(學(xué)習(xí)視頻分享:編程基礎(chǔ)視頻

以上是深入理解React的自定義Hook的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

PHP與Vue:完美搭檔的前端開發(fā)利器 PHP與Vue:完美搭檔的前端開發(fā)利器 Mar 16, 2024 pm 12:09 PM

PHP與Vue:完美搭檔的前端開發(fā)利器在當(dāng)今互聯(lián)網(wǎng)高速發(fā)展的時(shí)代,前端開發(fā)變得愈發(fā)重要。隨著用戶對網(wǎng)站和應(yīng)用的體驗(yàn)要求越來越高,前端開發(fā)人員需要使用更加高效和靈活的工具來創(chuàng)建響應(yīng)式和交互式的界面。PHP和Vue.js作為前端開發(fā)領(lǐng)域的兩個(gè)重要技術(shù),搭配起來可以稱得上是完美的利器。本文將探討PHP和Vue的結(jié)合,以及詳細(xì)的代碼示例,幫助讀者更好地理解和應(yīng)用這兩

Go語言前端技術(shù)探秘:前端開發(fā)新視野 Go語言前端技術(shù)探秘:前端開發(fā)新視野 Mar 28, 2024 pm 01:06 PM

Go語言作為一種快速、高效的編程語言,在后端開發(fā)領(lǐng)域廣受歡迎。然而,很少有人將Go語言與前端開發(fā)聯(lián)系起來。事實(shí)上,使用Go語言進(jìn)行前端開發(fā)不僅可以提高效率,還能為開發(fā)者帶來全新的視野。本文將探討使用Go語言進(jìn)行前端開發(fā)的可能性,并提供具體的代碼示例,幫助讀者更好地了解這一領(lǐng)域。在傳統(tǒng)的前端開發(fā)中,通常會使用JavaScript、HTML和CSS來構(gòu)建用戶界面

Django是前端還是后端?一探究竟! Django是前端還是后端?一探究竟! Jan 19, 2024 am 08:37 AM

Django是一個(gè)Python編寫的web應(yīng)用框架,它強(qiáng)調(diào)快速開發(fā)和干凈方法。盡管Django是一個(gè)web框架,但是要回答Django是前端還是后端這個(gè)問題,需要深入理解前后端的概念。前端是指用戶直接和交互的界面,后端是指服務(wù)器端的程序,他們通過HTTP協(xié)議進(jìn)行數(shù)據(jù)的交互。在前端和后端分離的情況下,前后端程序可以獨(dú)立開發(fā),分別實(shí)現(xiàn)業(yè)務(wù)邏輯和交互效果,數(shù)據(jù)的交

C#開發(fā)經(jīng)驗(yàn)分享:前端與后端協(xié)同開發(fā)技巧 C#開發(fā)經(jīng)驗(yàn)分享:前端與后端協(xié)同開發(fā)技巧 Nov 23, 2023 am 10:13 AM

作為一名C#開發(fā)者,我們的開發(fā)工作通常包括前端和后端的開發(fā),而隨著技術(shù)的發(fā)展和項(xiàng)目的復(fù)雜性提高,前端與后端協(xié)同開發(fā)也變得越來越重要和復(fù)雜。本文將分享一些前端與后端協(xié)同開發(fā)的技巧,以幫助C#開發(fā)者更高效地完成開發(fā)工作。確定好接口規(guī)范前后端的協(xié)同開發(fā)離不開API接口的交互。要保證前后端協(xié)同開發(fā)順利進(jìn)行,最重要的是定義好接口規(guī)范。接口規(guī)范涉及到接口的命

前端面試官常問的問題 前端面試官常問的問題 Mar 19, 2024 pm 02:24 PM

在前端開發(fā)面試中,常見問題涵蓋廣泛,包括HTML/CSS基礎(chǔ)、JavaScript基礎(chǔ)、框架和庫、項(xiàng)目經(jīng)驗(yàn)、算法和數(shù)據(jù)結(jié)構(gòu)、性能優(yōu)化、跨域請求、前端工程化、設(shè)計(jì)模式以及新技術(shù)和趨勢。面試官的問題旨在評估候選人的技術(shù)技能、項(xiàng)目經(jīng)驗(yàn)以及對行業(yè)趨勢的理解。因此,應(yīng)試者應(yīng)充分準(zhǔn)備這些方面,以展現(xiàn)自己的能力和專業(yè)知識。

前端怎么實(shí)現(xiàn)即時(shí)通訊 前端怎么實(shí)現(xiàn)即時(shí)通訊 Oct 09, 2023 pm 02:47 PM

實(shí)現(xiàn)即時(shí)通訊的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。詳細(xì)介紹:1、WebSocket,它可以在客戶端和服務(wù)器之間建立持久連接,實(shí)現(xiàn)實(shí)時(shí)的雙向通信,前端可以使用 WebSocket API來創(chuàng)建WebSocket連接,并通過發(fā)送和接收消息來實(shí)現(xiàn)即時(shí)通訊;2、Long Polling,是一種模擬實(shí)時(shí)通信的技術(shù)等等

Django:前端和后端開發(fā)都能搞定的神奇框架! Django:前端和后端開發(fā)都能搞定的神奇框架! Jan 19, 2024 am 08:52 AM

Django:前端和后端開發(fā)都能搞定的神奇框架!Django是一個(gè)高效、可擴(kuò)展的Web應(yīng)用程序框架。它能夠支持多種Web開發(fā)模式,包括MVC和MTV,可以輕松地開發(fā)出高質(zhì)量的Web應(yīng)用程序。Django不僅支持后端開發(fā),還能夠快速構(gòu)建出前端的界面,通過模板語言,實(shí)現(xiàn)靈活的視圖展示。Django把前端開發(fā)和后端開發(fā)融合成了一種無縫的整合,讓開發(fā)人員不必專門學(xué)習(xí)

Golang與前端技術(shù)結(jié)合:探討Golang如何在前端領(lǐng)域發(fā)揮作用 Golang與前端技術(shù)結(jié)合:探討Golang如何在前端領(lǐng)域發(fā)揮作用 Mar 19, 2024 pm 06:15 PM

Golang與前端技術(shù)結(jié)合:探討Golang如何在前端領(lǐng)域發(fā)揮作用,需要具體代碼示例隨著互聯(lián)網(wǎng)和移動應(yīng)用的快速發(fā)展,前端技術(shù)也愈發(fā)重要。而在這個(gè)領(lǐng)域中,Golang作為一門強(qiáng)大的后端編程語言,也可以發(fā)揮重要作用。本文將探討Golang如何與前端技術(shù)結(jié)合,以及通過具體的代碼示例來展示其在前端領(lǐng)域的潛力。Golang在前端領(lǐng)域的作用作為一門高效、簡潔且易于學(xué)習(xí)的

See all articles