Czym jest mapDispatchToProps?

Czytałem dokumentację Biblioteki Redux i ma ona taki przykład,

Oprócz odczytu stanu, komponenty kontenera mogą wysyłać akcje. W podobny sposób można zdefiniować funkcję o nazwie mapDispatchToProps(), która odbiera metodę dispatch() i zwraca właściwości wywołania zwrotnego, które chcesz wprowadzić do komponentu prezentacyjnego.

To nie ma sensu. Po co ci mapDispatchToProps skoro już masz mapStateToProps?

Zapewniają również ten poręczny przykład kodu:

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

Czy ktoś może wyjaśnić w kategoriach laików czym jest ta funkcja i dlaczego jest przydatna?

 236
Author: Un3qual, 2016-09-09

5 answers

Wydaje mi się, że żadna z odpowiedzi nie wykrystalizowała, dlaczego mapDispatchToProps jest przydatna.

Na to naprawdę można odpowiedzieć tylko w kontekście wzoru container-component, który najlepiej zrozumiałam po pierwszym czytaniu: {26]}

Https://medium.com/@learnreact/container-components-c0e67432e005#.1a9j3w1jl

Then

Http://redux.js.org/docs/basics/UsageWithReact.html

W skrócie, Twoje components powinny dotyczyć tylko wyświetlania rzeczy. Jedynym miejscem, z którego mają uzyskać informacje, są ich rekwizyty .

Oddzielone od " displaying stuff "(komponentów) to:

  • Jak dostać rzeczy do wyświetlania,
  • i jak radzisz sobie z wydarzeniami.

Po to są containers.

Dlatego "dobrze zaprojektowany" component we wzorze wygląda tak:

class FancyAlerter extends Component {
    sendAlert = () => {
        this.props.sendTheAlert()
    }

    render() {
        <div>
          <h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
          <Button onClick={sendAlert}/>
        </div>
     }
}

Zobacz, jak komponent pobiera wyświetlane informacje z rekwizytów (które pochodzą ze sklepu redux poprzez mapStateToProps), a także otrzymuje swoją funkcję działania ze swoich rekwizytów: sendTheAlert().

Tutaj mapDispatchToProps pojawia się: w odpowiednim container

// FancyButtonContainer.js

function mapDispatchToProps(dispatch) {
    return({
        sendTheAlert: () => {dispatch(ALERT_ACTION)}
    })
}

function mapStateToProps(state} {
    return({fancyInfo: "Fancy this:" + state.currentFunnyString})
}

export const FancyButtonContainer = connect(
    mapStateToProps, mapDispatchToProps)(
    FancyAlerter
)

Zastanawiam się, czy widzisz, teraz, że jest to container [1] to wie o reduxie, wysyłce, sklepie, stanie i ... rzeczy.

component we wzorze FancyAlerter, który robi rendering, nie musi wiedzieć o żadnej z tych rzeczy: dostaje swoją metodę wywołania na onClick przycisku, za pomocą swoich właściwości.

I ... mapDispatchToProps był użytecznym środkiem, który redux zapewnia, aby kontener mógł łatwo przekazać tę funkcję do zawiniętego komponentu na swoich rekwizytach.

Wszystko to wygląda bardzo podobnie do przykładu todo W dokumentach, a inna odpowiedź tutaj, ale próbowałem rzucić go w świetle wzoru, aby podkreślić dlaczego .

(uwaga: nie możesz używać mapStateToProps w tym samym celu co mapDispatchToProps z podstawowego powodu, dla którego nie masz dostępu do dispatch wewnątrz mapStateToProp. Więc nie mogłeś użyć mapStateToProps, aby dać komponent zawinięty metoda wykorzystująca dispatch.

Nie wiem, dlaczego zdecydowali się podzielić ją na dwie funkcje mapowania - lepiej byłoby mieć mapToProps(state, dispatch, props) czyli jedną funkcję do wykonania obu!


[1] zauważ, że celowo wyraźnie nazwałem kontener FancyButtonContainer, aby podkreślić ,że jest to "rzecz" - tożsamość (a więc istnienie! jest to jedna z najbardziej rozpoznawalnych postaci na świecie.]}

export default connect(...)

składnia, która jest pokazano w większości przykładów

 427
Author: GreenAsJade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-27 08:53:28

To w zasadzie Skrót. Więc zamiast pisać:

this.props.dispatch(toggleTodo(id));

Możesz użyć mapDispatchToProps, jak pokazano w przykładzie kodu, a następnie napisać w innym miejscu:

this.props.onTodoClick(id);

Lub bardziej prawdopodobne, że w tym przypadku będziesz miał to jako opiekun zdarzenia:

<MyComponent onClick={this.props.onTodoClick} />

Jest pomocny film dana Abramova na ten temat tutaj: https://egghead.io/lessons/javascript-redux-generating-containers-with-connect-from-react-redux-visibletodolist

 54
Author: hamstu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 20:47:07

mapStateToProps() jest narzędziem, które pomaga komponentowi uzyskać zaktualizowany stan (który jest aktualizowany przez niektóre inne komponenty),
mapDispatchToProps() jest narzędziem, które pomoże Twojemu komponentowi uruchomić Zdarzenie akcji (działanie dyspozytorskie, które może spowodować zmianę stanu aplikacji)

 36
Author: Saisurya Kattamuri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 15:27:45

mapStateToProps, mapDispatchToProps i connect z react-redux biblioteka zapewnia wygodny sposób dostępu do funkcji state i dispatch Twojego sklepu. Tak więc zasadniczo connect jest komponentem wyższego rzędu, możesz również działać jako owijarka, jeśli to ma dla ciebie sens. Więc za każdym razem, gdy twoja state zostanie zmieniona mapStateToProps zostanie wywołana z nową state, a następnie, gdy ty props Zaktualizuj komponent uruchomi funkcję render, aby renderować Twój komponent w przeglądarce. mapDispatchToProps przechowuje również wartości klucza na props twojego komponentu, Zwykle przybierają formę funkcji. W ten sposób możesz wywołać state zmianę z twojego komponentu onClick, onChange wydarzenia.

From docs:

const TodoListComponent = ({ todos, onTodoClick }) => (
  <ul>
    {todos.map(todo =>
      <Todo
        key={todo.id}
        {...todo}
        onClick={() => onTodoClick(todo.id)}
      />
    )}
  </ul>
)

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

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

function toggleTodo(index) {
  return { type: TOGGLE_TODO, index }
}

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

Upewnij się również, że znasz funkcje bezstanowe Reacta i Komponenty wyższego rzędu

 8
Author: Vlad Filimon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-28 16:42:16

mapStateToProps otrzymuje state i props i pozwala na wyodrębnienie właściwości ze stanu, które mają zostać przekazane do komponentu.

mapDispatchToProps otrzymuje dispatch i {[2] } i jest przeznaczone do wiązania twórców akcji do dispatch, więc po wykonaniu wynikowej funkcji akcja zostanie wysłana.

Uważam, że to tylko oszczędza Ci konieczności zrobienia dispatch(actionCreator()) wewnątrz twojego komponentu, dzięki czemu jest to nieco łatwiejsze do Czytaj.

Https://github.com/reactjs/react-redux/blob/master/docs/api.md#arguments

 0
Author: Harry Moreno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 08:09:00