#reactjs
Вопрос:
Я прочитал несколько статей на эту тему, но это не помогло. Я думаю, что моя проблема немного в другом
Вот мой код:
import React, { useEffect } from 'react';
import { useState } from 'react';
import { useSelector } from 'react-redux';
import store from '../../store';
import ToDoAdder from '../ToDoAdder/ToDoAdder';
function ToDoList() {
const [users, setUsers] = useState([]);
const [todosState, setTodosState] = useState([]);
useEffect(() => {
fetchUsers();
fetchData();
}, []);
const fetchUsers = async () => {
const data = await fetch(`https://jsonplaceholder.typicode.com/users/`);
const res = await data.json();
console.log(res, 0);
setUsers(res);
};
const fetchData = async () => {
const data = await fetch('https://jsonplaceholder.typicode.com/todos/');
const res = await data.json();
const needed = res.slice(0, 10);
setTodosState(needed);
return res;
};
console.log(todosState);
const todosWithUser = todosState.map((o) => {
const user = users.filter((i) => o.userId === i.id)[0];
o.user = user;
return o;
});
store.dispatch({ type: 'add/todoArray', payload: { todos: todosWithUser } });
const todos = useSelector((store) => store.toDos);
// console.log(todos);
return (
/* some statement */
);
}
export default ToDoList;
Скажите мне, как я могу это решить ? Я знаю, что моя проблема в штате Сеттодос, но я не могу ее решить
Ответ №1:
никогда не вызывайте никаких изменений состояния внутри компонента. Его нужно вызвать с помощью функции или эффекта крючков:
useEffect(() => {
const todosWithUser = todosState.map((o) => {
const user = users.filter((i) => o.userId === i.id)[0];
o.user = user;
return o;
});
store.dispatch({ type: "add/todoArray", payload: { todos: todosWithUser } });
}, [todosState]);
Комментарии:
1. У меня была аналогичная проблема, когда я проверял, вошел пользователь в систему или нет, получая значения из локального хранилища. Когда я вызываю функцию без эффекта использования, она отображается несколько раз и выдает одну и ту же ошибку, вызывая ее в эффекте использования, она решает проблему.
2. @viet Ты спасла мне жизнь, огромное спасибо.
Ответ №2:
Вот в чем проблема с вашим кодом:
store.dispatch({ type: 'add/todoArray', payload: { todos: todosWithUser } });
При каждом ToDoList
отображении эта отправка будет вызываться, вызывая изменение состояния redux, и у вас также есть этот селектор в коде:
const todos = useSelector((store) => store.toDos);
Таким образом, он снова будет визуализироваться, ToDoList
делая цикл визуализации бесконечным
Так что давайте вложим вашу отправку в EventHandler или в крюк Useefect.