#reactjs #use-effect
#reactjs #использование-эффект
Вопрос:
Вот моя функция компонента:
function RosterRows(props){
const [rosterList,setRosterList]=useState({});
const getData=async ()=>{
let roster=new Roster();
let rosterData=await roster.get(props.rosterYear,props.rosterMonth);
setRosterList(rosterData);
}
useEffect(()=>{
getData();
console.log(Object.keys(rosterList));
},[]);
return(
<tr><td></td></tr>
);
}
export default RosterRows
При вызове компонента выдается следующее предупреждающее сообщение:
Line 14:7: React Hook useEffect has missing dependencies: 'getData' and 'rosterList'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Когда я перемещаю функцию getData в функцию useEffect, она запрашивает:
React Hook useEffect has missing dependencies: 'props.rosterMonth', 'props.rosterYear', and 'rosterList'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Когда я меняю функцию на следующую:
import { useEffect,useState} from 'react';
import Roster from '../../../utils/roster';
function RosterRows(props){
const [rosterList,setRosterList]=useState({});
const rosterMonth=props.rosterMonth;
const rosterYear=props.rosterYear;
useEffect(()=>{
const getData=async ()=>{
let roster=new Roster();
let rosterData=await roster.get(rosterYear,rosterMonth);
setRosterList(rosterData);
}
getData();
console.log(Object.keys(rosterList));
},[]);
return(
<tr><td></td></tr>
);
}
export default RosterRows
Я получил следующее сообщение:
React Hook useEffect has missing dependencies: 'rosterList', 'rosterMonth', and 'rosterYear'. Either include them or remove the dependency array react-hooks/exhaustive-deps
При изменении кода на следующий:
function RosterRows(props){
const [rosterList,setRosterList]=useState({});
const rosterMonth=props.rosterMonth;
const rosterYear=props.rosterYear;
useEffect(()=>{
const getData=async ()=>{
let roster=new Roster();
let rosterData=await roster.get(rosterYear,rosterMonth);
setRosterList(rosterData);
console.log(rosterData);
}
getData();
},[]);
return(
<tr><td></td></tr>
);
}
export default RosterRows
Он выдает следующее сообщение:
Line 5:12: 'rosterList' is assigned a value but never used no-unused-vars
Line 17:7: React Hook useEffect has missing dependencies: 'rosterMonth' and 'rosterYear'. Either include them or remove the dependency array react-hooks/exhaustive-deps
Не могли бы вы рассказать мне, как решить проблему?
Комментарии:
1. Ошибка не может быть яснее того, что нужно сделать. С какой частью у вас есть проблемы? Массив зависимостей — это пустой массив в конце. Вам нужно поместить вещи, о которых вам сообщает ошибка, внутрь массива.
2. Я новичок в функции компонента REACT, поэтому я просто хочу знать, есть ли какой-нибудь способ удалить предупреждающее сообщение.
3. Команда «console.log (Object.keys (rosterList));» запускается один раз и возвращает правильные данные.
4.
useEffect(() => { getData(); console.log(Object.keys(rosterList)); },[getData, rosterList]);
5. это вызывает бесконечный цикл.
Ответ №1:
Проблема console.log(rosterList)
внутри эффекта. getData
устанавливает состояние rosterList
в состояние, но состояние настройки не является синхронным в React.
Это будет работать так, как ожидалось, и не имеет бесконечного цикла и правильно определяет зависимости эффекта:
function RosterRows(props) {
const [rosterList, setRosterList] = useState({});
useEffect(() => {
const getData = async () => {
let roster = new Roster();
let rosterData = await roster.get(props.rosterYear, props.rosterMonth);
console.log(Object.keys(rosterData));
setRosterList(rosterData);
};
getData();
}, [props.rosterYear, props.rosterMonth]);
return (
<tr>
<td></td>
</tr>
);
}
export default RosterRows;
Комментарии:
1. После нескольких попыток я получил аналогичное решение. Большое вам спасибо.
Ответ №2:
Если вы гарантируете, что ваши перехватчики useEffect будут выполняться только один раз при монтировании компонента, вы можете просто отключить правило eslint
useEffect(()=>{
const getData=async ()=>{
let roster=new Roster();
let rosterData=await roster.get(rosterYear,rosterMonth);
setRosterList(rosterData);
}
getData();
console.log(Object.keys(rosterList));
},[]); // eslint-disable-line
Комментарии:
1. Eslint существует не просто так. Это ужасный совет.
2. Есть ли какое-либо другое решение?
3. Аааа … итак, я сказал, что вы должны убедиться, что ваш эффект будет выполняться только один раз, или вы должны поместить все переменные, которые использовал эффект, во второй параметр хука