У меня есть компонент, в котором пользователь вводит имя, которое при изменении требует выполнения двух действий:
- Обновить значение поля имени компонента
- Асинхронная выборка с сервера, если имя уже существует в базе данных entityType
Я использую промежуточное программное обеспечение преобразователя для выполнения асинхронной работы, а затем отправляю оба действия внутри создателя действия преобразователя.
Но после передачи действий для отправки в создателе действий преобразователя только действие, отправленное последним, достигает редуктора (и, следовательно, может обновлять состояние). Почему это так? Где я делаю ошибку?
Спасибо за ваши ответы!
Соответствующие фрагменты кода:
namesection.js
function NameSection({
entityType,
nameValue,
onNameChange,
warnIfExists
}) {
return (
<div>
<form>
<Row>
<Col md={6} mdOffset={3}>
<NameField
defaultValue={nameValue}
warn={warnIfExists}
onChange={onNameChange}
/>
</Col>
</Row>
</form>
</div>
);
}
function mapStateToProps(rootState) {
const state = rootState.get('nameSection');
return {
nameValue: state.get('name'),
warnIfExists: state.get('warnIfExists')
};
}
function mapDispatchToProps(dispatch, {entityType}) {
return {
onNameChange: (event) =>
dispatch(handleNameChange(event.target.value, entityType)),
};
}
export default connect(mapStateToProps, mapDispatchToProps)(NameSection);
action.js
export function handleNameChange(
newName,
entityType
) {
return (dispatch) => {
dispatch({
meta: {debounce: 'keystroke'},
payload: newName,
type: UPDATE_NAME_FIELD
});
return request.get('/search/exists')
.query({
collection: entityType,
q: newName
})
.then(res => dispatch({
meta: {debounce: 'keystroke'},
payload: res.text === 'true',
type: UPDATE_WARN_IF_EXISTS
}))
.catch((error: {message: string}) => error);
};
}
reducer.js
function reducer(
state = Immutable.Map({
name: '',
warnIfExists: false
}),
action
) {
const {payload, type} = action;
console.log('reducer', payload, type);
switch (type) {
case UPDATE_NAME_FIELD:
return state.set('name', payload);
case UPDATE_WARN_IF_EXISTS:
return state.set('warnIfExists', payload);
// no default
}
return state;
}
В этом случае обновляется только warnIfExists, а поле имени не обновляется.
event.target.value
? Вы его успокоили? - person RIYAJ KHAN   schedule 11.03.2018