Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
bindActionCreators(actionCreators, dispatch)
Обзор
Преобразует объект, значениями которого являются создатели действий, в объект с теми же ключами, где каждый создатель действия обёрнут в вызов dispatch, чтобы их можно было вызывать напрямую.
Обычно следует вызывать dispatch напрямую на экземпляре вашего Store. При использовании Redux с React, react-redux предоставит вам функцию dispatch, что также позволяет вызывать её напрямую.
Единственный случай применения bindActionCreators — когда нужно передать создатели действий в компонент, не знающий о Redux, и при этом не передавать ему dispatch или Redux-хранилище.
Для удобства также можно передать создатель действия первым аргументом и получить обёрнутую в dispatch функцию.
Изначально этот метод предназначался для использования с устаревшим методом connect из React-Redux. Он всё ещё работает, но редко требуется.
Параметры
-
actionCreators(Функция или Объект): Создатель действия или объект, значениями которого являются создатели действий. -
dispatch(Функция): Функцияdispatch, доступная в экземпляреStore.
Возвращаемое значение
(Функция или Объект): Объект, имитирующий исходный объект, где каждая функция немедленно отправляет действие, возвращённое соответствующим создателем действия. Если передана функция как actionCreators, возвращаемым значением также будет единая функция.
Пример
TodoActionCreators.js
export function addTodo(text) {
return {
type: 'ADD_TODO',
text
}
}
export function removeTodo(id) {
return {
type: 'REMOVE_TODO',
id
}
}
SomeComponent.js
import React from 'react'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import * as TodoActionCreators from './TodoActionCreators'
console.log(TodoActionCreators)
// {
// addTodo: Function,
// removeTodo: Function
// }
function TodoListContainer(props) {
// Injected by react-redux:
const { dispatch, todos } = props
// Here's a good use case for bindActionCreators:
// You want a child component to be completely unaware of Redux.
// We create bound versions of these functions now so we can
// pass them down to our child later.
const boundActionCreators = useMemo(
() => bindActionCreators(TodoActionCreators, dispatch),
[dispatch]
)
console.log(boundActionCreators)
// {
// addTodo: Function,
// removeTodo: Function
// }
useEffect(() => {
// Note: this won't work:
// TodoActionCreators.addTodo('Use Redux')
// You're just calling a function that creates an action.
// You must dispatch the action, too!
// This will work:
let action = TodoActionCreators.addTodo('Use Redux')
dispatch(action)
}, [])
return <TodoList todos={todos} {...this.boundActionCreators} />
// An alternative to bindActionCreators is to pass
// just the dispatch function down, but then your child component
// needs to import action creators and know about them.
// return <TodoList todos={todos} dispatch={dispatch} />
}
export default connect(state => ({ todos: state.todos }))(TodoListContainer)