Как исправить проблему с дублированием внутренних вызовов в react native

#javascript #mongodb #react-native #redux #react-navigation

Вопрос:

Мы используем MongoDB и redux в нашем проекте. Когда мы переходим на страницу, получаем идентификатор плеера, который мы хотим получить из магазина redux, и передаем его компоненту. На скриншоте ниже показана моя консоль.войдите в этот магазин с идентификатором, который мы получили. Мы также получаем атрибуты игрока и детали. Странно то, что мы не можем видеть наш результат на странице. Но если мы вернемся и снова войдем на страницу и сделаем это ровно три раза, то получим результат. Я использовал консоль.войдите в журнал для отслеживания, и я вижу, что при загрузке одной страницы я получил эту консоль.журнал s три раза. Это очень странная проблема, и мы не могли понять, почему это происходит. Это из-за навигации, исправления или чего-то еще? Я вставляю вывод на одну страницу загрузки под кодом.

 const { id } = route.params;
console.log(" on players detail page id is: "   id);

const dispatch = useDispatch();

useEffect(() => {
    dispatch(playerCardActions.getPlayerCardInfo(id));
    dispatch(playerAttributeActions.fetchPlayerAttributes(id));
}, [dispatch]);

const playerCard = useSelector(
    (state) => state.playerCardStore.selectedPlayerCard
);
console.log(" on players detail page playercard is: "   playerCard);

const playerAttribute = useSelector(
    (state) => state.playerAttributeStore.selectedPlayerAttribute
);

console.log(" on players details page playerattr is: "   playerAttribute);
 

на странице сведений об игроках идентификатор: 604a8e1d83a1a09b8a61afb9

на странице сведений об игроках карточка игрока: [объект-объект],[объект-объект],[объект-объект],[объект-объект],[объект-объект]

на странице сведений об игроках playerattr: [объект объекта]

на странице сведений об игроках идентификатор: 604a8e1d83a1a09b8a61afb9

на странице сведений об игроках карта игрока: [объект объекта]

на странице сведений об игроках playerattr: [объект объекта]

на странице сведений об игроках идентификатор: 604a8e1d83a1a09b8a61afb9

на странице сведений об игроках карта игрока: [объект объекта]

on players details page playerattr is: [object Object]

Below you can find the store code

 import ReduxThunk from "redux-thunk";
import { applyMiddleware, combineReducers, createStore } from "redux";
import { composeWithDevTools } from "redux-devtools-extension";

import playerCardReducer from "./reducers/playerCard-reducer";
import playerAttributeReducer from "./reducers/playerAttribute-reducer";
import playerStatisticsReducer from "./reducers/playerStatistics-reducer";
import playerDetailsReducer from "./reducers/playerDetails-reducer";
import playerReducer from "./reducers/player-reducer";

const rootReducer = combineReducers({
    playerCardStore: playerCardReducer,
    playerAttributeStore: playerAttributeReducer,
    playerStatisticsStore: playerStatisticsReducer,
    playerDetailsStore: playerDetailsReducer,
    playerStore: playerReducer,
});

const middleware = composeWithDevTools(applyMiddleware(ReduxThunk));
export default createStore(rootReducer, middleware);
 

Я также добавляю один из приведенных ниже кодов редуктора

 import {
    CREATE_PLAYER_DETAILS,
    GET_DETAILS_OF_PLAYER,
    UPDATE_PLAYER_DETAILS,
} from "../actions/playerDetails-action";
import PlayerDetails from "../../models/PlayerDetails";

const initialState = {
    selectedPlayerDetails: null,
};

export default (state = initialState, action) => {
    switch (action.type) {
        case GET_DETAILS_OF_PLAYER:
            return { selectedPlayerDetails: action.selectedPlayerDetails };
        case CREATE_PLAYER_DETAILS:
            const newDetails = new PlayerDetails(
                action.selectedPlayerDetails.playerID,
                action.selectedPlayerDetails.phone,
                action.selectedPlayerDetails.email,
                action.selectedPlayerDetails.height,
                action.selectedPlayerDetails.weight,
                action.selectedPlayerDetails.playerCardId,
                action.selectedPlayerDetails.attributesId,
                action.selectedPlayerDetails.statisticsId
            );

            return (state.selectedPlayerDetails = newDetails);
        case UPDATE_PLAYER_DETAILS:
            const updatedDetails = new PlayerStatistics(
                action.selectedPlayerDetails.playerID,
                action.selectedPlayerDetails.phone,
                action.selectedPlayerDetails.email,
                action.selectedPlayerDetails.height,
                action.selectedPlayerDetails.weight,
                action.selectedPlayerDetails.playerCardId,
                action.selectedPlayerDetails.attributesId,
                action.selectedPlayerDetails.statisticsId
            );
            return (state.selectedPlayerDetails = updatedDetails);
    }
    return state;
};
 

Комментарии:

1. пожалуйста, поделитесь кодом магазина

2. Я предлагаю вам использовать vscode с расширением eslint , чтобы вы увидели, что у вас отсутствует зависимость , приложение create-react должно было настроить правила eslint для вашего проекта. В вашем эффекте отсутствует зависимость от идентификатора. В вашем вопросе отсутствует действие, редуктор и селектор, но с учетом информации, приведенной в вашем вопросе, я должен был бы предположить, что вы сделали что-то не так, и именно поэтому это не работает для вас.

3. Спасибо за комментарии, я добавил коды, которые вы просили, и теперь собираюсь поискать eslint, и если вы правы насчет зависимостей