Моя реализация избыточного потока приводит к переопределению данных массива.
Очевидно, что что-то не так в потоке, но я не могу понять это.
В основном у меня есть два компонента StringInstrument и UsersListedItems .
StringInstrument будет извлекать данные из БД (через axios) для получения списка владельцев элементов.
Для каждого владельца компонент UsersListedItems будетсоздан, и этот компонент также будет извлекать данные из БД (изображения) через идентификатор владельца.
Поэтому я бы сказал, что StringInstrument фактически создает UsersListedItems .
Вот код для StringInstrument :
if (this.props.error) {
return <p>Sorry! There was an error loading the items</p>;
}
if (this.props.isLoading) {
return <CircularProgress/>;
}
return (
<div>
<Grid container spacing={24}>
{this.props.itemOwner.map((item, index) => (
<Grid item xs={6} sm={3} key={index}>
<UsersListedItems
ownerId={item.ownerId}
userName={item.userName}
categoryId={1}>
</UsersListedItems>
</Grid >)
)}
</Grid>
</div>
);
}
}
const mapStateToProps = (state) => {
return {
itemOwner: state.itemOwner.data,
isLoading: state.itemOwner.isLoading,
error: state.itemOwner.error
}
}
const mapDispatchToProps = (dispatch) => {
return {
getItemOwners: (id) => dispatch(itemAction.getItemOwners(id))
}
Вот как я реализовал действие и редуктор.
export function getItemOwner(state = initState, action) {
switch (action.type) {
case GET_ITEM_OWNER_START:
state = Object.assign({}, state, { isLoading: true });
break;
case GET_ITEM_OWNER_SUCCESS:
state = Object.assign({}, state, { data: action.payload, isLoading: false });
break;
case GET_ITEM_OWNER_ERROR:
state = Object.assign({}, state, { error: action.payload, isLoading: false });
break;
}
return state;
}
export function getItems(state = initState, action) {
switch (action.type) {
case GET_ITEMS_START:
state = Object.assign({}, state, { isLoading: true });
break;
case GET_ITEMS_SUCCESS:
state = Object.assign({}, state, { data: action.payload, isLoading: false });
break;
case GET_ITEMS_ERROR:
state = Object.assign({}, state, { error: action.payload, isLoading: false });
break;
}
return state;
export const getItemOwners = (categoryId) => {
return (dispatch, getState) => {
//make async call to database
dispatch({ type: GET_ITEM_OWNER_START });
axios.get('api/items/owner/category/' + categoryId)
.then(function (response) {
dispatch({ type: GET_ITEM_OWNER_SUCCESS, payload: response.data });
})
.catch(function (error) {
dispatch({ type: GET_ITEM_OWNER_ERROR, payload: error });
});
}
};
export const getItems = (categoryId, ownerId) => {
return (dispatch, getState) => {
dispatch({ type: GET_ITEMS_START });
axios.get('api/items/' + categoryId + '/' + ownerId)
.then(function (response) {
dispatch({ type: GET_ITEMS_SUCCESS, payload: response.data });
})
.catch(function (error) {
dispatch({ type: GET_ITEMS_ERROR, payload: error });
});
}
Я не уверен, какуправляйте \ управляйте потоком диспетчеров по порядку, чтобы он соответствовал структуре компонента без переопределения собранных данных.
Как вы можете видеть на прикрепленном изображении, 4 'GET_ITEM_SUCCESS' находятся в конце, и каждыйиз них переопределит следующий.
Надеюсь, я был ясен и извинился за этот длинный пример кода.
Спасибо