Как передать urlSwapi из state(redux) в fetch?

На данный момент я передаю в fetch переменную url которая содержит ссылку для запроса. Но мне нужно получать ссылку для запроса (urlSwapi) из state и передавать ее в fetch. Проблема заключается в том что если я буду передавать в fetch получаемую ссылку(urlSwapi) из state в таком виде const urlSwapi = useSelector(swapiSelectors.link); то туда изначально будет приходить undefined, так как urlSwapi является значением из состояния, которое может обновляться после отправки формы.
App:
export default function SwapiContainer() {
    const dispatch = useDispatch();
    const urlSwapi = useSelector(swapiSelectors.link);

    const formRef = useRef(null);
    const onSubmit = (event) => {
        const url = `${formRef.current.action}${event.urlInput}`;
        dispatch(swapiActions.getLink(url));
        dispatch(swapiActions.getLoader(true))
        fetch(url)
            .then(response => {
                if (!response.ok) {
                    throw new Error('Network response was not ok');
                }
                console.log('response: ', response);
                return response.json();
            })
            .then(data => {
                console.log('data:',  data);
                dispatch(swapiActions.getData(data));
                dispatch(swapiActions.getLoader(false))
            })
            .catch(error => {
                console.error('Error: ', error);
                dispatch(swapiActions.getLink(undefined));
                dispatch(swapiActions.getData(undefined));
                dispatch(swapiActions.getLoader(false))
            })
    }
    return (
        <Wrapper>
            <Container>
                <InnerContainer>
                    <Title text="SWAPI"></Title>
                    <SwapiForm formRef={formRef} onSubmit={onSubmit}/>
                    <Result
                    />
                </InnerContainer>
            </Container>
        </Wrapper>
    )
}

Slice:
const swapiSlice = createSlice({
    name: 'swapi',
    initialState: {
        data: undefined,
        link: undefined,
        loader: undefined,

    },
    reducers: {
        getData: (state, action) => {
            state.data = action.payload;
            console.log('data :', state.data)
        },
        getLink: (state, action) => {
            state.link = action.payload;
            console.log('link :', state.link, typeof state.link)
        },
        getLoader: (state, action) => {
            state.loader = action.payload;
        }

    }
});
export const swapiReducers = swapiSlice.reducer;
export const swapiActions = swapiSlice.actions;

export const swapiSelectors = {
    data: state => state.swapi.data,
    link: state => state.swapi.link,
    id: state => state.swapi.link ? state.swapi.link.split('/')[5] : undefined,
    content: state => state.swapi.link ? state.swapi.link.split('/')[4] : undefined,
    loader: state => state.swapi.loader
}
console.log(swapiSlice)
console.log('swapiActions: ', swapiActions)
console.log('swapiSelectors: ',swapiSelectors)
  • Вопрос задан
  • 36 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
27 нояб. 2024, в 19:08
1500 руб./в час
27 нояб. 2024, в 18:19
2000 руб./за проект
27 нояб. 2024, в 17:41
2000 руб./за проект