Как отобразить извлеченные данные в функциональном компоненте react-redux?

#react-redux #redux-toolkit

Вопрос:

Почему я всегда вижу «загрузка…»? Я использовал redux-инструментарий и createSlice и извлекал данные с помощью axios. У меня нет никаких проблем с получением данных, и мои данные находятся в состоянии. Моя проблема заключается в отображении извлеченных данных. Мой код компонента таков:

 import React, {useEffect, useState} from 'react';
import { useDispatch, useSelector } from 'react-redux';    
import {fetchTrackers} from 'dashboard/dashboardSlice';    
export default function TrackerManagerDashboard() {
    const [trackersList, setTrackersList] = useState(useSelector(state => state.trackersData));
    const [activeTracker, setActiveTracker] = useState(useSelector(state => state.activeTracker));
    const dispatch = useDispatch();
    useEffect(() => {
        dispatch(fetchTrackers);
    }, []);
   if(!trackersList)
        return (
            <div>loading...</div>
        )
    return (
        <div className="TrackerManagerDashboard">
            ...
        </div>
    )
}
 

и файл среза редуктора-это:

 import { createSlice } from '@reduxjs/toolkit'
import * as env from "../../environments";
import axios from 'axios';    
const initialState = {
    trackersData: {},
    activeTracker: {},
}   
const dashboardSlice = createSlice({
    name: 'dashboard',
    initialState,
    reducers: {
        setInitialState(state, action) {
            state.trackersData = action.payload.data;
            state.activeTracker = state.trackersData[Object.keys(state.trackersData)[0]];
        },
    },
})    
export async function fetchTrackers (dispatch, getState) {
    try {
        const { data } = await axios.get(env.APP_URL   '/fetch/trackers.json');
        dispatch(setInitialState({type: 'setInitialState', data }));
    } catch(error) {
        console.log(error);
    }
}    
export const { setInitialState} = dashboardSlice.actions
export default dashboardSlice.reducer
 

Ответ №1:

Никогда не используйте useState(useSelector .

Это означает «создайте локальное состояние компонента с начальным значением, которое имеет возвращаемое значение useSelector во время первого рендеринга». Если состояние Redux изменится позже, вы никогда его не увидите, так как useState оно уже инициализировано, и любые изменения в нем не будут отражены в вашей trackersList переменной.

Вместо этого просто позвоните useSelector :

 const trackersList = useSelector(state => state.trackersData);
const setActiveTracker = useSelector(state => state.activeTracker);
 

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

1. С вашей помощью я смог получить доступ к штату. К сожалению, возвращается только начальное значение состояния, и полученные значения внутри него не сохраняются в переменных.

2. Извините, я случайно подал заявку, не скорректировав ваш пример правильно. Я снял useState с них, как и положено. Работает ли это сейчас?