Czym jest mapDispatchToProps?
Czytałem dokumentację Biblioteki Redux i ma ona taki przykład,
To nie ma sensu. Po co ciOpró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.
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?
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 składnia, która jest pokazano w większości przykładów 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(...)
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
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)
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
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
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