Реагируйте, как дважды отобразить компонент с помощью одного запроса api

#reactjs #react-redux #axios #redux-toolkit

Вопрос:

Существует компонент:

 const Navbar = ({...props}) => {
    const dispatch = useDispatch()
    const navigation = useSelector(state => state.navigation)
    const [nav] = navigation.navs.filter(nav => nav.slug === props.navGroup)
    
    useEffect(() => {
        dispatch(fetchNavigation());
    }, [dispatch])

    return (
        <nav className={styles.nav}>
            {nav
            ? nav.all_elements.map(link =>
                <Link 
                className={styles.navLink}
                to={link.url}
                key={link.id}
                >
                    {link.name}
                </Link>
            )
            : <div>Something else</div>
            }
        </nav>
    )
}
 

Редуктор:

 import { createSlice } from "@reduxjs/toolkit";
import { fetchNavigation } from "../services/fetchNavigation"

const initialState = {
    "count": 0,
    "next": null,
    "previous": null,
    "navs": [],
    "loaded": false
}

const navSlice = createSlice({
    name: 'navigation',
    initialState: initialState,
    extraReducers: {
        [fetchNavigation.fulfilled]: (state = initialState, action) => {
            state.count = action.payload.count;
            state.next = action.payload.next;
            state.previous = action.payload.previous;
            state.loaded = true
            state.navs = action.payload.results;
        }
    },
})
 

Асинхронное действие:

 import { createAsyncThunk } from "@reduxjs/toolkit";
import { instance } from "../../API/config"

export const fetchNavigation = createAsyncThunk(
    "navigation/fetchNavigation", async () => {
        const response = await instance.get(`nav/`)
        return response.data
    }
);
 

Проблема:

Я показываю компонент в верхнем и нижнем колонтитулах, поэтому он делает два запроса к API, как я могу проверить, что данные уже находятся в хранилище, прежде чем вызывать createAsyncThunk? Я попытался получить текущее состояние «загруженного» ключа через getState (), но он не изменяет начальное состояние перед запросом, поэтому ничего не вышло

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

1. fetchNavigation-это то, что извлекает контент, который вы не хотите извлекать дважды, верно? Поэтому вместо этого запустите fetchNavigation в родительском компоненте, а затем отправьте результат в качестве реквизита в компонент NavBar.

2. @EmilKarlsson Насколько корректен этот подход с архитектурной точки зрения?

3. Это зависит от обстоятельств. Ожидаете ли вы, что данные, которые вы получаете, могут меняться между визуализациями? Если да, то вы не можете просто загрузить его один раз и покончить с этим. Если нет, то вам действительно нужно проверить, были ли данные получены ранее.