ホームページ > ウェブフロントエンド > jsチュートリアル > すべての開発者が知っておくべき React の重要なトリック

すべての開発者が知っておくべき React の重要なトリック

Mary-Kate Olsen
リリース: 2024-11-03 12:58:02
オリジナル
996 人が閲覧しました

React は信じられないほど強力ですが、これをマスターするには、基本を超えて、開発を効率化するためのあまり知られていないトリックを学ぶ必要があります。ここでは、生産性を向上させ、よりクリーンで効果的なコードを作成するのに役立つ、私が個人的に気に入っている React の 20 のテクニックをまとめました。早速例を見ていきましょう!


1. 条件付きレンダリングのショート評価

短絡評価による条件付きレンダリングでは、冗長な if ステートメントを避けてください。

{isLoading && <Spinner />}
ログイン後にコピー
ログイン後にコピー

これにより、 がレンダリングされます。 isLoading が true の場合にのみ、JSX をクリーンな状態に保ちます。


2. クラス名ライブラリを使用した動的クラス名

クラス名ライブラリを使用すると、条件付きでクラスを簡単に適用できます。

npm install classnames
ログイン後にコピー
ログイン後にコピー
import classNames from 'classnames';

const buttonClass = classNames({
  'btn': true,
  'btn-primary': isPrimary,
  'btn-secondary': !isPrimary,
});

<button className={buttonClass}>Click Me</button>
ログイン後にコピー
ログイン後にコピー

3. useMemo を使用して高価な計算をメモする

計算にコストがかかる場合は、React が不必要に再計算しないように計算をメモ化します。

const sortedData = useMemo(() => data.sort(), [data]);
ログイン後にコピー
ログイン後にコピー

これは、データが変更された場合にのみ、sortedData を再計算します。


4. useEffect による入力のデバウンス

入力変更をデバウンスすることで、定期的な再レンダリングを回避します。

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)} />
ログイン後にコピー
ログイン後にコピー

5. 再利用可能なロジック用のカスタムフック

ロジックをカスタム フックにカプセル化し、コンポーネント間で再利用します。

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>;
};
ログイン後にコピー
ログイン後にコピー

6. React.lazy によるコンポーネントの遅延読み込み

コンポーネントを分割して読み込み時間を最適化します。

const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <React.Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </React.Suspense>
  );
}
ログイン後にコピー
ログイン後にコピー

7. useRef を使用した前の Props または State へのアクセス

以前の状態値にアクセスするには、useRef を使用します。

const [count, setCount] = useState(0);
const prevCount = useRef(count);

useEffect(() => {
  prevCount.current = count;
}, [count]);

console.log(`Previous: ${prevCount.current}, Current: ${count}`);
ログイン後にコピー
ログイン後にコピー

8. 関数を useCallback に渡して再レンダリングを回避します

関数を変更する必要がない場合は、useCallback を使用してメモ化します。

const increment = useCallback(() => setCount(count + 1), [count]);
ログイン後にコピー
ログイン後にコピー

9. よりクリーンなコードのための小道具の構造化

関数パラメータ内でプロパティを直接構造化します。

const User = ({ name, age }) => (
  <div>{name} is {age} years old</div>
);
ログイン後にコピー
ログイン後にコピー

10. 余分な div を使用せずに要素をグループ化するための React.Fragment

余分な DOM ノードを追加せずに要素をラップします。

<>
  <p>Paragraph 1</p>
  <p>Paragraph 2</p>
</>
ログイン後にコピー

11. JavaScript エラーを検出するためのエラー境界

子コンポーネントのエラーをキャッチして、アプリ全体のクラッシュを防ぎます。

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;
  }
}
ログイン後にコピー

Essential React Tricks Every Developer Must Know

Jagroup2001 (ジャグループ) · GitHub

?‍?フルスタック開発者 | ?機械学習開発者 | ?開発関係プロ – ?レンタル可能 - Jagroup2001

Essential React Tricks Every Developer Must Know github.com

12. PropType を使用した Prop 検証

プロップタイプを定義することでバグを早期に発見します。

{isLoading && <Spinner />}
ログイン後にコピー
ログイン後にコピー

13. useReducer を使用した状態リデューサー

複雑な状態ロジックの場合、useReducer を使用するとより効率的です。

npm install classnames
ログイン後にコピー
ログイン後にコピー

14. DOM 操作に LayoutEffect を使用する

DOM の更新後、ペイント前にエフェクトを実行します。

import classNames from 'classnames';

const buttonClass = classNames({
  'btn': true,
  'btn-primary': isPrimary,
  'btn-secondary': !isPrimary,
});

<button className={buttonClass}>Click Me</button>
ログイン後にコピー
ログイン後にコピー

15. コンテキストと useContext を使用して状態ロジックをカプセル化する

プロップドリルを使用せずにグローバル状態を作成します。

const sortedData = useMemo(() => data.sort(), [data]);
ログイン後にコピー
ログイン後にコピー

16. JSX でのインライン関数定義を避ける

関数をインラインで定義すると、再レンダリングが発生します。代わりに、外部で定義してください。

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)} />
ログイン後にコピー
ログイン後にコピー

17. 安全なプロパティ アクセスのために JSX でオプションのチェーンを使用する

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>;
};
ログイン後にコピー
ログイン後にコピー

18. キー プロップを使用して再レンダリングの問題を回避します

リストをレンダリングするときは、常に一意のキーを使用してください。

const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <React.Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </React.Suspense>
  );
}
ログイン後にコピー
ログイン後にコピー

19. インポート制御を改善するために名前付きエクスポートを使用してコンポーネントをエクスポートする

名前付きエクスポートにより、特定のコンポーネントのインポートが簡単になります。

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]);
ログイン後にコピー
ログイン後にコピー

20. 再利用可能なコンポーネント パターン: 高次コンポーネント (HOC)

追加のロジックを追加するには、コンポーネントを HOC でラップします。

const User = ({ name, age }) => (
  <div>{name} is {age} years old</div>
);
ログイン後にコピー
ログイン後にコピー

これらのトリックをマスターすると、より簡潔で読みやすく効率的な React コードを作成できるようになります。コーディングを楽しんでください!

以上がすべての開発者が知っておくべき React の重要なトリックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート