Вопрос или проблема
Я пытаюсь изучить код redux, реализуя нижеуказанный учебник. Я не могу увидеть вывод в консоль для привычек в браузере. Прилагаю фрагмент кода ниже. Можете подсказать, как это исправить?
https://www.youtube.com/watch?v=-ovliZG617g&t=1310s
https://codesandbox.io/p/sandbox/yxtwjg?file=%2Fsrc%2Fcomponents%2Fhabits-list.tsx%3A9%2C6
import React from "react";
import { useSelector } from "react-redux";
import { RootState } from "../store/store";
import { Box } from "@mui/material";
const HabitList: React.FC = () => {
const { habits } = useSelector((state: RootState) => {
state.habits;
});
return <Box>{console.log("habits", habits)}</Box>;
};
export default HabitList;
Это потому, что вы не включили компонент HabitList в App.
Внесите следующие изменения в ваш app.tsx;
Сначала импортируйте компонент.
import HabitList from "./components/habits-list";
А затем включите этот компонент в <App>
сразу под <AddHabitForm />
<AddHabitForm />
<HabitList/>
Ответ или решение
Для решения вашей проблемы с useSelector
в вашем React приложении наRedux, давайте рассмотрим несколько моментов, которые могут помочь вам увидеть вывод состояния habits
в консоли.
-
Исправление функции селектора: В вашем коде присутствует небольшая ошибка, которая может привести к тому, что вы не получаете значение состояний. Вам нужно убедиться, что вы правильно возвращаете значение из вашего селектора. Убедитесь, что вы возвращаете объект состояний следующим образом:
const habits = useSelector((state: RootState) => state.habits);
Измените вашу функцию селектора на вышеуказанный код. Теперь она будет правильно возвращать
habits
из состояния. -
Добавление компонента HabitList в App: Как вы правильно отметили, если компонент
HabitList
не включен в компонентApp
, он не будет рендериться, и, следовательно, использованиеuseSelector
будет бессмысленным. Вам нужно убедиться в том, что вы импортируете и используетеHabitList
вApp
. Ваш код будет выглядеть примерно так:import HabitList from "./components/habits-list"; const App: React.FC = () => { return ( <div> <AddHabitForm /> <HabitList /> </div> ); };
-
Проверка состояния Redux: Убедитесь, что ваше состояние Redux правильно инициализировано и что в нем есть данные для
habits
. Вы можете временно сделать лог всего состояния, чтобы убедиться в наличии данных:const habits = useSelector((state: RootState) => { console.log("Состояние Redux:", state); return state.habits; });
-
Проверка правильности импорта
RootState
: Убедитесь, что типRootState
импортирован правильно из вашего Redux хранилища и что он соответствует структуре вашего состояния. -
Отладка: Если после внесения изменений в код вы все еще не видите вывод результата в консоли, используйте инструменты разработчика для отладки состояния Redux. Убедитесь, что состояние обновляется ожидаемым образом и что компонент
HabitList
действительно получает обновленное значениеhabits
.
Вот полная версия вашего компонента с учетом всех изменений:
import React from "react";
import { useSelector } from "react-redux";
import { RootState } from "../store/store";
import { Box } from "@mui/material";
const HabitList: React.FC = () => {
const habits = useSelector((state: RootState) => state.habits);
console.log("habits", habits); // Логирование состояния habits
return <Box>{JSON.stringify(habits)}</Box>; // Отображение состояния в компоненте
};
export default HabitList;
С этими изменениями, вы должны увидеть состояние habits
в консоли и также на экране. Удачи в изучении Redux!