Redux не диспетчерское действие
Я использую React-dnd в сочетании с Redux, но не могу отправить действие. Мое действие называется, но редуктор никогда не называется:
const spelSource = {
drop(props, monitor) {
updateD(monitor.getItem(), props.spel);
}
};
const mapDispatchToProps = {
updateD: (newS, oldS) => updateDeck(newS, oldS),
};
export default connect(
null, mapDispatchToProps
)(Spel)
Spel = DropTarget('spel', spelSource, collect)(Spel);
и в моих действиях:
export function updateD(newS, oldS) {
console.log("update");
return function (dispatch) {
return dispatch({
type:"UPDATE_D",
newS: newS,
oldS: oldS
});
};
}
Наконец редуктор:
case 'UPDATE_D':
return Object.assign({}, state, {
d: finalUpdate(state, action)
});
Есть ли способ отправки? Спасибо!
3 ответа
Вы пытаетесь отправить действие, но вам нужно Redux для отправки самого действия. Ваше действие должно просто вернуть объект с type
собственность и полезная нагрузка (все остальное). Действие оборачивается вdispatch()
функция по connect()
функция с mapDispatchToProps
, Традиционно вам это нравится...
const mapDispatchToProps = dispatch => ({
updateD: (newS, oldS) => dispatch(updateDeck(newS, oldS))
});
В этой статье есть несколько более коротких способов сделать это, но это традиционный способ. Вы можете видеть, что connect()
Функция принимает это и будет проходить через dispatch()
метод магазина Redux.
Тогда ваше действие просто вернет объект:
export const UPDATE_D = 'UPDATE_D';
export const updateD = (newS, oldS) => ({
type: UPDATE_D,
newS,
oldS
});
Наконец, ваш редуктор:
switch (action.type) {
case UPDATE_D:
return {
...state,
newS: action.newS,
oldS: action.oldS
};
default:
return state;
}
Вам нужно использовать this.props
правильно отправить это действие из вашего компонента.
Например, в spelSource
, this.props.updateD(monitor.getItem(), props.spel)
Может быть ошибкой, что действие возвращает функцию вместо объекта. И эта внутренняя функция никогда не вызывается.
Я ожидаю увидеть что-то вроде:
const mapDispatchToProps = dispatch => {
return {
updateD: (newS, oldS) => dispatch({
type:"UPDATE_D",
newS: newS,
oldS: oldS
})
}
}