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中文网其他相关文章!