Redux: mapStateToPropsが呌び出されおいない

䜜成日 2016幎05月13日  Â·  4コメント  Â·  ゜ヌス: reduxjs/redux

人気のあるすべおのサむトで倧量のドキュメントを読みたしたが、答えはどこにも芋぀かりたせんでした。 私はここで、いく぀かのドキュメントや重芁な理解を芋逃しおいないかどうかを確認するように求めおいたす。

私が芋おいる問題は、コンポヌネントのmapStateToProps関数が初期化時に䞀床だけ呌び出されるこずです。 レデュヌサヌが呌び出されおも、再床呌び出されるこずはありたせん。 アクション/リデュヌサヌ/小道具がすべおどのように結び぀いおいるのか理解しおいないからだず思い始めおいたす。

私が知っおいるこずを最初に蚀わせおください

  • アクションは、そのストアの䞀郚プロパティの曎新を衚すこずを理解しおいたす。
  • 各レデュヌサヌがストアのスラむス/郚分を曎新する責任があるこずを理解しおいたす。 そしお、レデュヌサヌがそのスラむスに察しお新しいオブゞェクトを返さなければならないこずを私は間違いなく理解しおいたす。
  • mapStateToPropsがストアから特定のデヌタを「取埗」し、それを小道具ずしお名前付きコンポヌネントに枡すこずを理解しおいたす。

しかし...アクション、レデュヌサヌ、mapStateToPropsがすべお互いにどのように関連しおいるかに぀いおの説明は芋぀かりたせんでした。 私の質問

  • ストアは、アプリケヌションの状態に関するデヌタを保持するプロパティを持぀オブゞェクトであるず思いたす。 これらのトップレベルのプロパティは、アプリケヌションの䞀郚に関する情報を保持するためのサブツリヌを提䟛するオブゞェクトにするこずができたす。 これは本圓ですか
  • アクションがストアにディスパッチされるず、どのプロパティたたはストアのサブツリヌが曎新されたすか ストア内のプロパティの自動䜜成/関連付けがあるようですが、それはどのように決定されたすか
  • mapStateToPropsは、ストアの適切なプロパティ/郚分の曎新をリッスンするこずをどのように「認識」したすか 䜕がそれらを結び぀けたすか
  • どうすればこれをデバッグできたすか アクションのディスパッチがmapStateToPropsを起動しないように芋える理由を理解するには、䜕をする必芁がありたすか
  • それずも私はそれをすべお間違っお考えおいたすか...

最も参考になるコメント

http://redux.js.org/docs/Troubleshooting.htmlに目を通し、ケヌスが説明されおいる問題の1぀ではないこずを確認したしたか

ストアは、アプリケヌションの状態に関するデヌタを保持するプロパティを持぀オブゞェクトであるず思いたす。 これらのトップレベルのプロパティは、アプリケヌションの䞀郚に関する情報を保持するためのサブツリヌを提䟛するオブゞェクトにするこずができたす。 これは本圓ですか

うん。 Storeは、最䞊䜍の状態オブゞェクトを内郚的に保持したす。 store.getState()からそのオブゞェクトぞのアクセスを提䟛したす。 そのオブゞェクトは、ルヌトレデュヌサヌから返されるものすべおに察応し、倚くの堎合、ツリヌのようなものです。

アクションがストアにディスパッチされるず、どのプロパティたたはストアのサブツリヌが曎新されたすか ストア内のプロパティの自動䜜成/関連付けがあるようですが、それはどのように決定されたすか

いいえ、自動䜜成はありたせん。 ストアは、ルヌトレデュヌサヌを呌び出した結果をポむントし始めたす。

ルヌトレデュヌサヌが自分で䜜成した関数である堎合、その結果は、アクションをディスパッチした埌に埗られるものです。

function counter(state = 0, action) {
  if (action.type === 'INCREMENT') {
    return state + 1; // will become the next value of store.getState() after store.dispatch()
  }
  return state;
}

combineReducers({ foo, bar })ようなものでルヌトレデュヌサヌを_生成_する堎合、次のように手動でルヌトレデュヌサヌを䜜成した堎合ず同じです。

function root(state = {}, action) {
  return {
    foo: foo(state.foo, action),
    bar: bar(state.bar, action)
  }
}

これは、州のプロパティがしばしば由来するずころです。 それらの倀は、アクションの凊理䞭にそれぞれfooおよびbarレデュヌサヌが返すものによっお決定されるため、これらを完党に制埡できたす。

mapStateToPropsは、ストアの適切なプロパティ/郚分の曎新をリッスンするこずをどのように「認識」したすか 䜕がそれらを結び぀けたすか

mapStateToPropsをconnect()関数に枡したす。 store.subscribe()を䜿甚しお、ストアぞのすべおの倉曎をリッスンするコンポヌネントを生成したす。 ストアが倉曎されるず、生成されたコンポヌネントはstore.getState()を読み取り、それをmapStateToProps()に枡しお、次に枡される小道具を決定したす。 それらが倉曎された堎合、コンポヌネントがそれらずずもに再レンダリングされたす。

どうすればこれをデバッグできたすか アクションのディスパッチがmapStateToPropsを起動しないように芋える理由を理解するには、䜕をする必芁がありたすか

https://github.com/theaqua/redux-loggerのようなミドルりェアを远加しmapStateToPropsが呌び出されない堎合は、

  • アクションをdispatch()するのを忘れお、アクションクリ゚ヌタヌず呌んだだけです。
  • たたは、レデュヌサヌが参照的に同䞀の倀を返したため、 connect()はわざわざmapStateToProps()呌び出さなかった。

これらのケヌスは䞡方ずもhttp://redux.js.org/docs/Troubleshooting.htmlで説明されおい

将来的には、最初にStackOverflowで質問し、ラむブラリにバグがあり、共有できる䟋で䞀貫しお再珟できるず確信できる堎合は、課題远跡システムを䜿甚するようにしおください。

ありがずう

党おのコメント4件

http://redux.js.org/docs/Troubleshooting.htmlに目を通し、ケヌスが説明されおいる問題の1぀ではないこずを確認したしたか

ストアは、アプリケヌションの状態に関するデヌタを保持するプロパティを持぀オブゞェクトであるず思いたす。 これらのトップレベルのプロパティは、アプリケヌションの䞀郚に関する情報を保持するためのサブツリヌを提䟛するオブゞェクトにするこずができたす。 これは本圓ですか

うん。 Storeは、最䞊䜍の状態オブゞェクトを内郚的に保持したす。 store.getState()からそのオブゞェクトぞのアクセスを提䟛したす。 そのオブゞェクトは、ルヌトレデュヌサヌから返されるものすべおに察応し、倚くの堎合、ツリヌのようなものです。

アクションがストアにディスパッチされるず、どのプロパティたたはストアのサブツリヌが曎新されたすか ストア内のプロパティの自動䜜成/関連付けがあるようですが、それはどのように決定されたすか

いいえ、自動䜜成はありたせん。 ストアは、ルヌトレデュヌサヌを呌び出した結果をポむントし始めたす。

ルヌトレデュヌサヌが自分で䜜成した関数である堎合、その結果は、アクションをディスパッチした埌に埗られるものです。

function counter(state = 0, action) {
  if (action.type === 'INCREMENT') {
    return state + 1; // will become the next value of store.getState() after store.dispatch()
  }
  return state;
}

combineReducers({ foo, bar })ようなものでルヌトレデュヌサヌを_生成_する堎合、次のように手動でルヌトレデュヌサヌを䜜成した堎合ず同じです。

function root(state = {}, action) {
  return {
    foo: foo(state.foo, action),
    bar: bar(state.bar, action)
  }
}

これは、州のプロパティがしばしば由来するずころです。 それらの倀は、アクションの凊理䞭にそれぞれfooおよびbarレデュヌサヌが返すものによっお決定されるため、これらを完党に制埡できたす。

mapStateToPropsは、ストアの適切なプロパティ/郚分の曎新をリッスンするこずをどのように「認識」したすか 䜕がそれらを結び぀けたすか

mapStateToPropsをconnect()関数に枡したす。 store.subscribe()を䜿甚しお、ストアぞのすべおの倉曎をリッスンするコンポヌネントを生成したす。 ストアが倉曎されるず、生成されたコンポヌネントはstore.getState()を読み取り、それをmapStateToProps()に枡しお、次に枡される小道具を決定したす。 それらが倉曎された堎合、コンポヌネントがそれらずずもに再レンダリングされたす。

どうすればこれをデバッグできたすか アクションのディスパッチがmapStateToPropsを起動しないように芋える理由を理解するには、䜕をする必芁がありたすか

https://github.com/theaqua/redux-loggerのようなミドルりェアを远加しmapStateToPropsが呌び出されない堎合は、

  • アクションをdispatch()するのを忘れお、アクションクリ゚ヌタヌず呌んだだけです。
  • たたは、レデュヌサヌが参照的に同䞀の倀を返したため、 connect()はわざわざmapStateToProps()呌び出さなかった。

これらのケヌスは䞡方ずもhttp://redux.js.org/docs/Troubleshooting.htmlで説明されおい

将来的には、最初にStackOverflowで質問し、ラむブラリにバグがあり、共有できる䟋で䞀貫しお再珟できるず確信できる堎合は、課題远跡システムを䜿甚するようにしおください。

ありがずう

順番に答える

  • Reduxは通垞、状態ツリヌの最䞊䜍郚分がプレヌンなJavascriptオブゞェクトであるず想定したすただし、Immutable.jsラむブラリによっお提䟛されるデヌタ型を䜿甚するこずも䞀般的です。 そのオブゞェクトの䞭に䜕を入れるか、そしおコンテンツをどのように構成するかは完党にあなた次第です。 最も䞀般的なアプロヌチは、ドメむンごずに物事を敎理するこずです。 たずえば、架空のブログアプリの状態ツリヌは次のようになりたす { users : {}, posts : {}, comments : {}, ui : {} } 。 http://redux.js.org/docs/FAQ.html#reducers-share-stateおよびhttp://redux.js.org/docs/FAQ.html#organizing-state-nested-dataを参照しおください。
  • 技術的に蚀えば、ストアを䜜成するずきは、_single_「reducer」関数を定矩したす。 その関数は、珟圚の状態ず着信アクションで呌び出され、䞍倉の方法で行われる_all_適切な曎新で新しい状態オブゞェクトを返す責任がありたす぀たり、盎接のむンプレヌス線集はありたせん-曎新する必芁があるすべおのものはコピヌを䜜成し、それらを倉曎し、代わりにコピヌを返すこずによっお実行され、ネストされたフィヌルドを曎新するこずは、そのすべおの祖先もコピヌしお曎新するこずを意味したす。 ただし、曎新ロゞックの最埌のすべおのビットを1぀の巚倧な関数に入れるこずは悪い考えであるため、その曎新ロゞックはほずんどの堎合、より小さな再利甚可胜なサブリデュヌサヌ関数に分割されたす。 そのロゞックをどのように構成するかはあなた次第ですが、自動的に曎新されるものはありたせん。それを行うのはレデュヌサヌロゞック次第です。 Reduxに付属しおいるcombineReducersナヌティリティを䜿甚するず、次のような特定のデヌタスラむスの曎新を管理する特定のレデュヌサヌ関数を簡単に䜜成できたす。 const combinedReducer = combineReducers({users : userReducer, posts : postReducer, comments : commentsReducer, ui : uiReducer});
  • Reduxは、ストアで_any_アクションが実行されるたびに、すべおのサブスクラむバヌに通知するだけです。 React Redux connect()関数はサブスクラむブし、コンポヌネントのmapStateToPropsを呌び出しお、抜出されたデヌタのいずれかが前回から倉曎されおいるかどうかを確認したす。 特定のネストされた状態のサブスクリプションはありたせん。 http://redux.js.org/docs/FAQ.html#store-setup-subscriptionsを参照しおください。
  • コンポヌネントが曎新されない最倧の原因は、レデュヌサヌの状態が盎接倉化するこずです。 http://redux.js.org/docs/FAQ.html#react-not-rerenderingを参照しおください。 それ以倖にも、アクションのデバッグずログ蚘録に䜿甚できるアドオンがいく぀かありたす。 https://github.com/markerikson/redux-ecosystem-links/blob/master/devtools.mdにそれらの束がリストされおい

うたくいけば、それは物事を片付けるのに圹立ちたす。

それを超えお、ダンが蚀ったように䜿甚法の質問は䞀般的にスタックオヌバヌフロヌに適しおいたす。 たた、DiscordのReactifluxコミュニティには、Reduxを含むReact関連のテクノロゞヌ専甚のチャットチャネルがたくさんあり、質問に答える人が垞にたくさんいたす。 https://www.reactiflux.comに招埅リンクがあり

@ richb-hanoverおそらく、react-redux接続によっお実行される浅い比范を目撃したこずでしょう。 ぀たり、他のオブゞェクト内にネストされたオブゞェクトは、ルヌトキヌのみが倉曎をチェックされるため、倉曎されおも再レンダリングされたせん。

http://redux.js.org/docs/faq/ReactRedux.html#why -isnt-my-component-re-rendering-or-my-mapstatetoprops-running

@ richb-ハノヌバヌは、私の堎合、@gaearonは、問題を怜出したした。

たたは、レデュヌサヌが参照的に同䞀の倀を返したため、connectはmapStateToPropsをわざわざ呌び出さなかった。

私はこの修正を䜿甚

const mapStateToProps = (state, props) => {
    return { id: props.id, currentState: state[props.id] };
}

const mapDispatchToProps = (dispatch) => {
    return {
        increment: (id) => {
            dispatch({ type: 'INCREMENT', id: id })
        }
    }
}

const DumbListItem = ({
    increment,
    id,
    currentState
}) => (
        <div>
            <li onClick={() => increment()}>{id}</li>
            <span>{currentState}</span>
        </div>
    );

export const ConnectedListItem = connect(
    mapStateToProps,
    mapDispatchToProps
)(DumbListItem);

idパラメヌタヌをむンクリメント呌び出しに枡さなかったためテンプレヌトのincrement(id)ずしお、たたはmapDispatchToPropsの2番目のパラメヌタヌを介しお、ストアは枡したせんでした。正しく曎新するので、おそらくそれがあなたの問題であるかどうかを確認しおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡