Я хочу обновить свое состояние (список объектов), и у меня проблема с useEffect или deleteFunction. Вот мой код:
const [itemName, setItemName] = useState({});
const [isDeleted, setIsDeleted] = useState(false);
const createArray = () => {
const { items } = item;
const newNames = items.map(item => item);
setItemName({ ...newNames });
};
useEffect(() => {
getItems();
createArray();
}, [isDeleted]);
const onDeleteClick = id => {
deleteItem(id);
setIsDeleted(!isDeleted);
};
console.log(itemName);
return(
// Contaners and other things//
item.items.map({id, name, content}, index) =>{
// Some other code also Form and FormGroup etc. //
<Button
style={{
position: "absolute",
left: "100%",
marginLeft: "-2.2rem",
marginTop: "-0.8rem"
}}
color="danger"
size="md"
onClick={onDeleteClick.bind(this, _id)}
>×
</Button>
// rest of code
Вот действие deleteItem:
export const deleteItem = id => (dispatch, getState) => {
axios
.delete(`/api/items/${id}`, tokenConfig(getState))
.then(res =>
dispatch({
type: DELETE_ITEM,
payload: id
})
)
.catch(err =>
dispatch(returnErrors(err.response.error, err.response.status))
);
};
и преобразователь регистра DELETE_ITEM:
case DELETE_ITEM:
return {
...state,
items: state.items.filter(item => item._id !== action.payload)
};
Проблема заключается в том, что после первого нажатия «itemName»не изменился, но через секунду он работает. Так, например, на старте у меня есть 10 объектов, после нажатия «Удалить» у меня должно быть 9 из них, но у itemName их 10, позднее число объектов - это еще одно, чем у объекта itemName.
При запуске: при запуске
При первом нажатии: при первом нажатии
При втором нажатии: привторой щелчок
В итоге у меня 0 объектов, но 1 объект в itemName. Элементы в списке визуально исчезают при этом, но если я удаляю некоторые элементы и пытаюсь изменить имя или содержимое других элементов, возникает проблема с корректировкой данных для корректного элемента.
А вот действие getItems:
export const getItems = () => dispatch => {
dispatch(setItemsLoading());
axios
.get('/api/items')
.then(res =>
dispatch({
type: GET_ITEMS,
payload: res.data
})
)
.catch(err =>
dispatch(returnErrors(err.response.error, err.response.status))
);
};
и корпус редуктора:
case GET_ITEMS:
return {
...state,
items: action.payload,
loading: false
};