react-reduxのuseSelectorフックでカレーセレクター関数を正しく使用するにはどうすればよいですか?

user210757

フック付きのreact-reduxを使用していますが、小道具ではないパラメーターを受け取るセレクターが必要です。ドキュメントには次のように記載されています

セレクター関数はownProps引数を受け取りません。ただし、小道具はクロージャー(以下の例を参照)またはカレーセレクターを使用して使用できます。

ただし、それらは例を提供していません。ドキュメントに記載されているカレーの適切な方法は何ですか?

これは私がやったことであり、うまくいくようですが、これは正しいですか?関数から関数を返すことによる影響はありuseSelectorますか(再レンダリングされないように見えますか?)

// selectors
export const getTodoById = state => id => {
  let t = state.todo.byId[id];
  // add display name to todo object
  return { ...t, display: getFancyDisplayName(t) };
};

const getFancyDisplayName = t => `${t.id}: ${t.title}`;

// example component
const TodoComponent = () => {
   // get id from react-router in URL
   const id = match.params.id && decodeURIComponent(match.params.id);

   const todo = useSelector(getTodoById)(id);

   return <span>todo.display</span>;
}
エミールベルジェロン

セレクターの戻り値が新しい関数の場合、コンポーネントはストアが変更されるたびに常に再レンダリングされます。

useSelector()===浅い等式ではなく、デフォルトで厳密な参照等式チェックを使用します

これは、非常に単純なセレクターで確認できます。

const curriedSelector = state => () => 0;

let renders = 0;
const Component = () => {
  // Returns a new function each time
  // triggers a new render each time
  const value = useSelector(curriedSelector)();
  return `Value ${value} (render: ${++renders})`;
}

valueが常に0である場合でも、実際の値を取得するためにuseSelector関数呼び出していることを認識していないため、コンポーネントはストアアクションごとに再レンダリングします。

ただし、関数ではなくuseSelectorfinal受け取るようにするとvalue、コンポーネントは実際のvalue変更でのみレンダリングされます。

const curriedSelector = state => () => 0;

let renders = 0;
const Component = () => {
  // Returns a computed value
  // triggers a new render only if the value changed
  const value = useSelector(state => curriedSelector(state)());
  return `Value ${value} (render: ${++renders})`;
}

結論としては機能しますuseSelectorが、呼び出されるたびに使用されるセレクターから新しい関数(または新しい非プリミティブを返すのは非常に非効率的です。

小道具は、クロージャー(以下の例を参照)またはカレーセレクターを使用して使用できます。

ドキュメントは次のいずれかを意味しました。

  • 閉鎖 useSelector(state => state.todos[props.id])
  • カレー useSelector(state => curriedSelector(state)(props.id))

connect はいつでも利用できます。セレクターを少し変更すると、両方で機能する可能性があります。

export const getTodoById = (state, { id }) => /* */

const Component =  props => {
  const todo = useSelector(state => getTodoById(state, props));
}
// or
connect(getTodoById)(Component)

あなたは、セレクタからオブジェクトを返しているので、あなたは、デフォルトの平等のチェックを変更したい場合があるので注意してくださいuseSelector浅い平等チェック

import { shallowEqual } from 'react-redux'

export function useShallowEqualSelector(selector) {
  return useSelector(selector, shallowEqual)
}

あるいは単に

const todo = useSelector(state => getTodoById(state, id), shallowEqual);

セレクターでコストのかかる計算を実行している場合、またはデータが深くネストされていてパフォーマンスが問題になる場合は、メモ化を使用するオリヴィエの回答を参照してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

React with typescriptでuseStateフックを正しく使用するにはどうすればよいですか?

分類Dev

追加の変数でreact-redux'useSelector 'を使用するにはどうすればよいですか?

分類Dev

より多くのデータをフェッチして、Reactで正しい状態で保存するにはどうすればよいですか?

分類Dev

フック経由の正規表現を使用して、reactで入力フィールドを検証するにはどうすればよいですか?

分類Dev

Reactアプリで:: before CSS疑似セレクターを使用してFontAwesomeアイコンを変更するにはどうすればよいですか?

分類Dev

非同期関数でreactフック「useMemo」を使用するにはどうすればよいですか?

分類Dev

多言語/複数のindex.htmlファイルでReactルーターを正しく設定するにはどうすればよいですか?

分類Dev

多言語/複数のindex.htmlファイルでReactルーターを正しく設定するにはどうすればよいですか?

分類Dev

React / Reduxルーターリダイレクトの前にJWT検証が行われるようにするにはどうすればよいですか?

分類Dev

Reactのデータプレビューでチェックボックスのブール値を表示するにはどうすればよいですか?

分類Dev

ReactのMap関数を使用してFirestoreコレクションをレンダリングするにはどうすればよいですか?

分類Dev

Reactのフックで関数をバインドするにはどうすればよいですか?

分類Dev

セレンウェブドライバーを使用してクラス内のreact要素の属性を取得するにはどうすればよいですか?

分類Dev

reactを使用して正しい日付形式をテーブルに正しくレンダリングするにはどうすればよいですか?

分類Dev

Reactルーターを使用してReduxストアにアクセスするにはどうすればよいですか?

分類Dev

reactおよびredux-sagaのセレクターから小道具を更新した後にコンポーネントを再レンダリングするにはどうすればよいですか?

分類Dev

React RouterとuseParamsフックを使用してハッシュ(#)の後にパラメーターを取得するにはどうすればよいですか?

分類Dev

jestを使用してReactクラスでレンダリング以外の関数をテストするにはどうすればよいですか?

分類Dev

React Reduxフックを使用する場合、コードの再利用を実現するにはどうすればよいですか?

分類Dev

forループを使用してReactのマップにマーカーをレンダリングするにはどうすればよいですか?

分類Dev

ロード中にReactフックが以前のデータを消去しないようにするにはどうすればよいですか?

分類Dev

Reactでredux-thunkを正しく使用するにはどうすればよいですか?

分類Dev

React Navigationを使用して、ネストされたスタックの画面に基づいて、外側のスタックヘッダーに戻るボタンをレンダリングするにはどうすればよいですか?

分類Dev

React Native 0.57のデコレータでMobXを使用するにはどうすればよいですか?

分類Dev

React Native(expo)からユーザーのGoogleカレンダーにアクセスするにはどうすればよいですか?

分類Dev

これは、フェッチリクエストからReactにデータを表示する正しい方法ですか?そうでない場合、コンポーネントにレンダリングされるJSXを変更するにはどうすればよいですか?

分類Dev

React Nativeで最後の子セレクターを実行するにはどうすればよいですか?

分類Dev

NextJS 9.0にアップグレードした後にReactフックを修正するにはどうすればよいですか?

分類Dev

REACT.jsのボタンをクリックしてフォームフィールドを変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    React with typescriptでuseStateフックを正しく使用するにはどうすればよいですか?

  2. 2

    追加の変数でreact-redux'useSelector 'を使用するにはどうすればよいですか?

  3. 3

    より多くのデータをフェッチして、Reactで正しい状態で保存するにはどうすればよいですか?

  4. 4

    フック経由の正規表現を使用して、reactで入力フィールドを検証するにはどうすればよいですか?

  5. 5

    Reactアプリで:: before CSS疑似セレクターを使用してFontAwesomeアイコンを変更するにはどうすればよいですか?

  6. 6

    非同期関数でreactフック「useMemo」を使用するにはどうすればよいですか?

  7. 7

    多言語/複数のindex.htmlファイルでReactルーターを正しく設定するにはどうすればよいですか?

  8. 8

    多言語/複数のindex.htmlファイルでReactルーターを正しく設定するにはどうすればよいですか?

  9. 9

    React / Reduxルーターリダイレクトの前にJWT検証が行われるようにするにはどうすればよいですか?

  10. 10

    Reactのデータプレビューでチェックボックスのブール値を表示するにはどうすればよいですか?

  11. 11

    ReactのMap関数を使用してFirestoreコレクションをレンダリングするにはどうすればよいですか?

  12. 12

    Reactのフックで関数をバインドするにはどうすればよいですか?

  13. 13

    セレンウェブドライバーを使用してクラス内のreact要素の属性を取得するにはどうすればよいですか?

  14. 14

    reactを使用して正しい日付形式をテーブルに正しくレンダリングするにはどうすればよいですか?

  15. 15

    Reactルーターを使用してReduxストアにアクセスするにはどうすればよいですか?

  16. 16

    reactおよびredux-sagaのセレクターから小道具を更新した後にコンポーネントを再レンダリングするにはどうすればよいですか?

  17. 17

    React RouterとuseParamsフックを使用してハッシュ(#)の後にパラメーターを取得するにはどうすればよいですか?

  18. 18

    jestを使用してReactクラスでレンダリング以外の関数をテストするにはどうすればよいですか?

  19. 19

    React Reduxフックを使用する場合、コードの再利用を実現するにはどうすればよいですか?

  20. 20

    forループを使用してReactのマップにマーカーをレンダリングするにはどうすればよいですか?

  21. 21

    ロード中にReactフックが以前のデータを消去しないようにするにはどうすればよいですか?

  22. 22

    Reactでredux-thunkを正しく使用するにはどうすればよいですか?

  23. 23

    React Navigationを使用して、ネストされたスタックの画面に基づいて、外側のスタックヘッダーに戻るボタンをレンダリングするにはどうすればよいですか?

  24. 24

    React Native 0.57のデコレータでMobXを使用するにはどうすればよいですか?

  25. 25

    React Native(expo)からユーザーのGoogleカレンダーにアクセスするにはどうすればよいですか?

  26. 26

    これは、フェッチリクエストからReactにデータを表示する正しい方法ですか?そうでない場合、コンポーネントにレンダリングされるJSXを変更するにはどうすればよいですか?

  27. 27

    React Nativeで最後の子セレクターを実行するにはどうすればよいですか?

  28. 28

    NextJS 9.0にアップグレードした後にReactフックを修正するにはどうすればよいですか?

  29. 29

    REACT.jsのボタンをクリックしてフォームフィールドを変更するにはどうすればよいですか?

ホットタグ

アーカイブ