React 非常強大,但掌握它意味著超越基礎知識並學習一些鮮為人知的技巧來簡化開發。以下是我個人最喜歡的 20 個 React 技巧的概述,它們可以提高您的工作效率並幫助您編寫更乾淨、更有效的程式碼。讓我們直接進入範例!
透過短路評估避免使用冗長的 if 語句進行條件渲染。
{isLoading && <Spinner />}
這將呈現
類別名稱庫可以輕鬆有條件地應用類別。
npm install classnames
import classNames from 'classnames'; const buttonClass = classNames({ 'btn': true, 'btn-primary': isPrimary, 'btn-secondary': !isPrimary, }); <button className={buttonClass}>Click Me</button>
如果計算成本很高,請將其儲存起來,這樣 React 就不會進行不必要的重新計算。
const sortedData = useMemo(() => data.sort(), [data]);
僅當資料變更時才重新計算排序資料。
透過消除輸入變更的抖動來避免不斷的重新渲染。
const [value, setValue] = useState(''); const [debouncedValue, setDebouncedValue] = useState(''); useEffect(() => { const handler = setTimeout(() => setDebouncedValue(value), 500); return () => clearTimeout(handler); }, [value]); <input value={value} onChange={(e) => setValue(e.target.value)} />
將邏輯封裝在自訂掛鉤中以跨元件重複使用它。
function useFetch(url) { const [data, setData] = useState(null); useEffect(() => { fetch(url).then(res => res.json()).then(setData); }, [url]); return data; } const Component = () => { const data = useFetch('/api/data'); return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>; };
透過拆分組件來最佳化載入時間。
const LazyComponent = React.lazy(() => import('./LazyComponent')); function App() { return ( <React.Suspense fallback={<div>Loading...</div>}> <LazyComponent /> </React.Suspense> ); }
要存取先前的狀態值,請使用 useRef。
const [count, setCount] = useState(0); const prevCount = useRef(count); useEffect(() => { prevCount.current = count; }, [count]); console.log(`Previous: ${prevCount.current}, Current: ${count}`);
如果某個函數不需要更改,請使用 useCallback 來記憶它。
const increment = useCallback(() => setCount(count + 1), [count]);
在函數參數中解構 props。
const User = ({ name, age }) => ( <div>{name} is {age} years old</div> );
包裹元素而不增加額外的 DOM 節點。
<> <p>Paragraph 1</p> <p>Paragraph 2</p> </>
捕獲子組件中的錯誤以防止整個應用程式崩潰。
class ErrorBoundary extends React.Component { state = { hasError: false }; static getDerivedStateFromError() { return { hasError: true }; } render() { if (this.state.hasError) return <h1>Something went wrong.</h1>; return this.props.children; } }
透過定義 prop 類型儘早發現錯誤。
{isLoading && <Spinner />}
對於複雜的狀態邏輯,useReducer 可以更有效率。
npm install classnames
在 DOM 更新之後、繪製之前運行效果。
import classNames from 'classnames'; const buttonClass = classNames({ 'btn': true, 'btn-primary': isPrimary, 'btn-secondary': !isPrimary, }); <button className={buttonClass}>Click Me</button>
無需道具鑽探即可建立全域狀態。
const sortedData = useMemo(() => data.sort(), [data]);
內嵌定義函數會導致重新渲染。相反,在外部定義它們。
const [value, setValue] = useState(''); const [debouncedValue, setDebouncedValue] = useState(''); useEffect(() => { const handler = setTimeout(() => setDebouncedValue(value), 500); return () => clearTimeout(handler); }, [value]); <input value={value} onChange={(e) => setValue(e.target.value)} />
優雅地處理 null 或未定義的值。
function useFetch(url) { const [data, setData] = useState(null); useEffect(() => { fetch(url).then(res => res.json()).then(setData); }, [url]); return data; } const Component = () => { const data = useFetch('/api/data'); return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>; };
渲染清單時始終使用唯一鍵。
const LazyComponent = React.lazy(() => import('./LazyComponent')); function App() { return ( <React.Suspense fallback={<div>Loading...</div>}> <LazyComponent /> </React.Suspense> ); }
命名匯出讓匯入特定元件變得更加容易。
const [count, setCount] = useState(0); const prevCount = useRef(count); useEffect(() => { prevCount.current = count; }, [count]); console.log(`Previous: ${prevCount.current}, Current: ${count}`);
然後依需求導入:
const increment = useCallback(() => setCount(count + 1), [count]);
用 HOC 包裹組件以添加額外的邏輯。
const User = ({ name, age }) => ( <div>{name} is {age} years old</div> );
掌握這些技巧將幫助你編寫更簡潔、可讀、高效的 React 程式碼!快樂編碼!
以上是每個開發人員都必須知道的基本 React 技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!