2017-11-25 9 views
2

私はこのコンセプトの周りを頑張りたいが、運がない。 公式のリアクションチュートリアルは本当に良いですが、私にとってはそれはあまりにも複雑で、ちょっとだけ難しいです。ReduxはどのようにReactでUIを変更しますか?

私はReduxを理解しようとしていますが、これまではアクション、リデューサーを作成できます。アクションをディスパッチして、ディスパッチ後のストア状態の変化を確認できます。私もreact-reduxのconnectを理解することができたし、それは完全にうまく動作し、私は自分のアプリのどこからでもディスパッチを起動することができた。だから私はほとんどそれが分かったと思う。ほとんどの場合、ここの象は部屋の中にあるので、私はアクションをディスパッチして、私はReduxの状態の変化を見ますが、私はUIを変えますか?例えば

私は値Initial textと私の初期状態でtextオブジェクトを持っていると、ボタンがクリックされると、私はClicked textにテキストを変更し、(のボタンに言わせて)UIのどこかにテキストを表示します。

ReactのRedux状態にどのようにアクセスし、どのように動的に変更するのですか?

リアクトなしでは非常に簡単だと思われます。例:https://jsfiddle.net/loktar/v1kvcjbu/ - render関数はすべてを処理しますが、ここで起こるすべてを理解しています。

しかし、公式のReact + Reduxチュートリアルの「todo」は、次のようになります:https://redux.js.org/docs/basics/ExampleTodoList.html、それは洗練されていますので、どこを見てもわかりません。

Add Todoボタンは、dispatch(addTodo(input.value))アクションを送信するフォームを送信します。アクション自体はIDを増やしてテキストをストアに渡すだけで、減速機は新しい状態を返します。それでは、どのようにtodoがページ上でレンダリングされていますか?どこ?私はこの時点で失われています。たぶんもっと簡単なチュートリアルがありますが、私はワンボタンのReduxチュートリアルを持っていますが、コンポーネントの複数のレイヤーで複雑にすることもできます:(

私はTodoList.jsで何かそこが、それでも私はドスがそこから来る見当がつかない、とそれが(そのファイルには、単純な減速/アクション/発送はありません)Reduxのに関係しています。任意の助け

ありがとう!

+1

最後に見つからなかった 'mapStateToProps'関数を見てください。これは、コンポーネントの小道具をredux状態から更新し、状態が変化したときに再レンダリングをトリガします。 – xDreamCoding

答えて

3

あなたが持っている混乱は、reducer compositionselectorsの部分です。

逆の順番で、UIの背面から見てみましょう。連結成分containers/VisibleTodoList.js

getVisibleTodos方法を通してそれを通過する間は、mapStateToProps内部「状態」(reduxのグローバルストアオブジェクト)からtodosを取得します。それは、それが受信したデータの一部のみを選択して返すように、セレクタと呼ばれることができる
mapStateToPropsに渡さ

import { connect } from 'react-redux' 
import { toggleTodo } from '../actions' 
import TodoList from '../components/TodoList' 

const getVisibleTodos = (todos, filter) => { 
    switch (filter) { 
    case 'SHOW_COMPLETED': 
     return todos.filter(t => t.completed) 
    case 'SHOW_ACTIVE': 
     return todos.filter(t => !t.completed) 
    case 'SHOW_ALL': 
    default: 
     return todos 
    } 
} 

const mapStateToProps = state => { 
    return { 
    todos: getVisibleTodos(state.todos, state.visibilityFilter) 
    } 
} 

const mapDispatchToProps = dispatch => { 
    return { 
    onTodoClick: id => { 
     dispatch(toggleTodo(id)) 
    } 
    } 
} 

const VisibleTodoList = connect(
    mapStateToProps, 
    mapDispatchToProps 
)(TodoList) 

export default VisibleTodoList 

state(Reduxのストア)ルート低減reducers/index.jsから来たと実際にreduxcombineReducersユーティリティを使用して、他の全ての減速の組み合わせを表す単一減速(オブジェクト)である:

import { combineReducers } from 'redux' 
    import todos from './todos' 
    import visibilityFilter from './visibilityFilter' 

    const todoApp = combineReducers({ 
    todos, 
    visibilityFilter 
    }) 

    export default todoApp 

あなたが見ることができるように、todos減速機があります。だからこそmapStateToPropsの中ではstate.todosのように呼びます。

case 'ADD_TODO': 
      return [ 
      ...state, 
      { 
       id: action.id, 
       text: action.text, 
       completed: false 
      } 
      ] 

actions/index.js内部のそれのためにこのアクションの作成者:それは新しいtodoと新しい状態を返しますタイプ'ADD_TODO'の各アクションに

const todos = (state = [], action) => { 
    switch (action.type) { 
    case 'ADD_TODO': 
     return [ 
     ...state, 
     { 
      id: action.id, 
      text: action.text, 
      completed: false 
     } 
     ] 
    case 'TOGGLE_TODO': 
     return state.map(todo => 
     (todo.id === action.id) 
      ? {...todo, completed: !todo.completed} 
      : todo 
    ) 
    default: 
     return state 
    } 
} 

export default todos 

:ここ

reducers/todos.js次のとおりです。

let nextTodoId = 0 
export const addTodo = text => { 
    return { 
    type: 'ADD_TODO', 
    id: nextTodoId++, 
    text 
    } 
} 

したがって、h私はreduxの完全な流れです(私はこれがあなたのための明らかな部分であると仮定して、アクションを呼び出すボタンを省略しました)。
まあ、ほとんど完全な流れ、これのどれもAppをラップしindex.jsでそれに店舗を注入Provider HOCずに起こらなかったかもしれない:

import React from 'react' 
import { render } from 'react-dom' 
import { Provider } from 'react-redux' 
import { createStore } from 'redux' 
import todoApp from './reducers' 
import App from './components/App' 

let store = createStore(todoApp) 

render(
    <Provider store={store}> 
    <App /> 
    </Provider>, 
    document.getElementById('root') 
) 

reduxstate変化、mapStateToPropsへの呼び出し新しいマップpropsが返されます。 connectはこれらの新しいpropsを渡し、これにより接続されたコンポーネントに新しいrenderコール(実際には反応ライフサイクル全体のフロー)がトリガーされます。
この方法では、UIはストアからの新しい新しいデータで再描画されます。

+1

は、上記の混乱を明確にするのに役立ちましたか? –

1

接続しています通常は反応コンポーネントとRedux state.connectを接続するために使用されます。connectは上位コンポーネントです。connect関数を使用しているコンポーネントは内部にラップされています。メソッドシグネチャは connect([ma [MapStateToProps]、[mapDispatchToProps]、[mergeProps]、[options]) mapStateToPropsはredux状態にアクセスでき、mapDispathToPropsはstore.dispatchにアクセスできます。すべての小道具が統合され、下位のコンポーネントに小道具として渡されます。 Reduxは単一の真実の状態しか持っていません。プロバイダコンポーネントに小道具として渡されるストアには、store.getState()というメソッドがあります。

したがって、反応コンポーネントはデータ駆動型であることに注意してください。データはUIを派生します。反応コンポーネントは、状態が変更されたとき、または小道具が変更されたときにのみ再レンダリングされます。あなたは2つのうちのいずれかに変更を加え、コンポーネントはさまざまなライフサイクルの方法を経ます。

関連する問題