Cangkuk tindak balas ialah fungsi khas yang membolehkan anda menggunakan ciri React, seperti kaedah keadaan dan kitaran hayat, dalam komponen berfungsi. Mereka telah diperkenalkan dalam React 16.8 untuk memudahkan model komponen dan memudahkan untuk berkongsi logik stateful merentas komponen.
Pengurusan Negeri: Cangkuk seperti useState membolehkan anda menambah dan mengurus keadaan dalam komponen berfungsi tanpa perlu menukarnya kepada komponen kelas.
Kesan Sampingan: Cangkuk useEffect membolehkan anda melakukan kesan sampingan, seperti pengambilan data, langganan atau menukar DOM secara manual, serupa dengan kaedah kitaran hayat dalam komponen kelas.
Kebolehgunaan semula: Cangkuk tersuai membolehkan anda merangkum dan menggunakan semula logik stateful merentas komponen yang berbeza.
Kod Pembersih: Cangkuk membantu mengekalkan komponen o
1 useState
import React, { useState } from 'react'; const Counter = () => { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); };
2 useEffect
import React, { useEffect, useState } from 'react'; const DataFetcher = () => { const [data, setData] = useState(null); useEffect(() => { fetch('https://api.example.com/data') .then(response => response.json()) .then(setData); }, []); return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>; };
3 gunakanKonteks
import React, { useContext } from 'react'; const ThemeContext = React.createContext('light'); const ThemedComponent = () => { const theme = useContext(ThemeContext); return <div className={`theme-${theme}`}>Current theme: {theme}</div>; };
4 useReducer
import React, { useReducer } from 'react'; const initialState = { count: 0 }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; } }; const Counter = () => { const [state, dispatch] = useReducer(reducer, initialState); return ( <div> <p>Count: {state.count}</p> <button onClick={() => dispatch({ type: 'increment' })}>Increment</button> <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button> </div> ); };
5 useMemo
import React, { useMemo, useState } from 'react'; const ExpensiveComputation = ({ number }) => { const compute = (num) => { return num * 1000; // Simulate an expensive computation }; const result = useMemo(() => compute(number), [number]); return <div>Computed Result: {result}</div>; };
6 gunakan Panggilan Balik
import React, { useCallback, useState } from 'react'; const Button = React.memo(({ onClick, children }) => { console.log('Button rendered'); return <button onClick={onClick}>{children}</button>; }); const App = () => { const [count, setCount] = useState(0); const increment = useCallback(() => setCount(c => c + 1), []); return ( <div> <p>Count: {count}</p> <Button onClick={increment}>Increment</Button> </div> ); };
7 useRef
import React, { useRef } from 'react'; const FocusInput = () => { const inputRef = useRef(null); const focusInput = () => { inputRef.current.focus(); }; return ( <div> <input ref={inputRef} type="text" /> <button onClick={focusInput}>Focus Input</button> </div> ); };
8 useLayoutEffect
import React, { useLayoutEffect, useRef } from 'react'; const LayoutEffectExample = () => { const divRef = useRef(); useLayoutEffect(() => { console.log('Height:', divRef.current.clientHeight); }, []); return <div ref={divRef}>This is a div</div>; };
9 gunakanImperativeHandle
import React, { useState } from 'react'; const Counter = () => { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); };
10 useDebugValue
- Penerangan: Memaparkan label untuk cangkuk tersuai dalam React DevTools untuk penyahpepijatan yang lebih mudah.
- Contoh:
import React, { useEffect, useState } from 'react'; const DataFetcher = () => { const [data, setData] = useState(null); useEffect(() => { fetch('https://api.example.com/data') .then(response => response.json()) .then(setData); }, []); return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>; };
11 useFetch
- Penerangan: Cangkuk tersuai untuk mengambil data daripada API.
- Contoh:
import React, { useContext } from 'react'; const ThemeContext = React.createContext('light'); const ThemedComponent = () => { const theme = useContext(ThemeContext); return <div className={`theme-${theme}`}>Current theme: {theme}</div>; };
12 useLocalStorage
- Penerangan: Menyegerakkan keadaan dengan storan setempat untuk mengekalkan data merentas sesi.
- Contoh:
import React, { useReducer } from 'react'; const initialState = { count: 0 }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; } }; const Counter = () => { const [state, dispatch] = useReducer(reducer, initialState); return ( <div> <p>Count: {state.count}</p> <button onClick={() => dispatch({ type: 'increment' })}>Increment</button> <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button> </div> ); };
13 gunakanSebelumnya
- Penerangan: Mengembalikan nilai keadaan atau prop sebelumnya.
- Contoh:
import React, { useMemo, useState } from 'react'; const ExpensiveComputation = ({ number }) => { const compute = (num) => { return num * 1000; // Simulate an expensive computation }; const result = useMemo(() => compute(number), [number]); return <div>Computed Result: {result}</div>; };
14 useDebounce
- Perihalan: Menyahlantunkan nilai atau panggilan fungsi, menangguhkan pelaksanaan sehingga selepas kelewatan yang ditentukan.
- Contoh:
import React, { useCallback, useState } from 'react'; const Button = React.memo(({ onClick, children }) => { console.log('Button rendered'); return <button onClick={onClick}>{children}</button>; }); const App = () => { const [count, setCount] = useState(0); const increment = useCallback(() => setCount(c => c + 1), []); return ( <div> <p>Count: {count}</p> <Button onClick={increment}>Increment</Button> </div> ); };
15 useOnClickOutside
- Penerangan: Mengesan klik di luar elemen tertentu, berguna untuk menutup tetingkap timbul atau lungsur turun.
- Contoh:
import React, { useRef } from 'react'; const FocusInput = () => { const inputRef = useRef(null); const focusInput = () => { inputRef.current.focus(); }; return ( <div> <input ref={inputRef} type="text" /> <button onClick={focusInput}>Focus Input</button> </div> ); };
16 useInterval
- Penerangan: Sediakan selang untuk menjalankan fungsi berulang kali pada selang waktu tertentu.
- Contoh:
import React, { useLayoutEffect, useRef } from 'react'; const LayoutEffectExample = () => { const divRef = useRef(); useLayoutEffect(() => { console.log('Height:', divRef.current.clientHeight); }, []); return <div ref={divRef}>This is a div</div>; };
17 guna masa habis
- Penerangan: Sediakan tamat masa untuk melaksanakan fungsi selepas kelewatan yang ditentukan.
- Contoh:
import React, { useImperativeHandle, forwardRef, useRef } from 'react'; const CustomInput = forwardRef((props, ref) => { const inputRef = useRef(); useImperativeHandle(ref, () => ({ focus: () => { inputRef.current.focus(); } })); return <input ref={inputRef} type="text" />; }); const Parent = () => { const ref = useRef(); return ( <div> <CustomInput ref={ref} /> <button onClick={() => ref.current.focus()}>Focus Input</button> </div> ); };
18 useMediaQuery
- Penerangan: Menyemak sama ada pertanyaan media sepadan, membenarkan logik reka bentuk responsif.
- Contoh:
import { useDebugValue } from 'react'; const useCustomHook = (value) => { useDebugValue(value ? 'Value is true' : 'Value is false'); return value; }; const DebugExample = () => { const isTrue = useCustomHook(true); return <div>Check the React DevTools</div>; };
19 gunakanScrollPosition
- Penerangan: Menjejaki kedudukan skrol semasa tetingkap.
- Contoh:
import { useState, useEffect } from 'react'; const useFetch = (url) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const fetchData = async () => { const response = await fetch(url); const result = await response.json(); setData(result); setLoading(false); }; fetchData(); }, [url]); return { data, loading }; };
20 useKeyPress
- Penerangan: Mengesan sama ada kekunci tertentu ditekan.
- Contoh:
import { useState, useEffect } from 'react'; const useLocalStorage = (key, initialValue) => { const [storedValue, setStoredValue] = useState(() => { try { const item = window.localStorage.getItem(key); return item ? JSON.parse(item) : initialValue; } catch (error) { console.error(error); return initialValue; } }); useEffect(() => { try { window.localStorage.setItem(key, JSON.stringify(storedValue)); } catch (error) { console.error(error); } }, [key, storedValue]); return [storedValue, setStoredValue]; };
Senarai ini kini termasuk penerangan untuk setiap cangkuk, memberikan pemahaman yang lebih jelas tentang tujuan dan kes penggunaannya. Jika anda memerlukan sebarang butiran atau contoh lanjut, sila tanya!
Atas ialah kandungan terperinci Tingkatkan Kemahiran Reaksi Anda: Memahami dan Menggunakan Cangkuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!