так что это очень простая, но сложная головоломка, с которой многим трудно справиться. Используйте приведенный ниже код, и он наверняка запустится и прекрасно выполнит свою задачу: в состоянии добавьте еще один флаг 'isError':
const [layout, setLayout] = useState(null);
const [saving, setSaving] = useState(false);
const [iserror, setIserror] = useState(true);
и используйте useEffect, как показано ниже. Первый запуск useeffect будет выполняться, но, поскольку условия в useeffect имеют указанный тип c, он вообще не будет запускать блок IF. И блок IF будет выполняться только при указанных c условиях, указанных ниже. Но учтите, что useEffect будет запускаться каждый раз, когда изменяется любой из элементов массива зависимостей, но блок IF не будет выполняться вообще.
useEffect(()=>{
if(layout && !saving && !iserror){
console.log('specific case render ');
this.refs["preview"].refresh();
}
},[layout,saving,iserror]);
если бы мы поместили условия состояний по умолчанию в блок IF, тогда только внутри блока IF эффект будет работать, что не так, как указано выше. Поскольку мы хотим, чтобы обратный вызов setState выполнялся только после определенного условия c и не всегда. Если мы изменим приведенный выше код на что-то вроде этого, то ::
//for understanding purpose only default states
layout==null,
saving == false
isError== true
//
useEffect(()=>{
if(layout == null && !saving && iserror){ //observe this default case
console.log('default case render ');
}
},[layout,saving,iserror]);
Функция handleSave выполнит свою задачу с небольшими изменениями: *
const handleSave = (newdata) => {
setLayout(newdata); // useEffect run as layout changed but conditions
// not satisfied
setSaving(true); // useEffect will run since saving changed
// not satisfied
axios
.put(window.urls.save, layout)
.then(
function(response) { // only this case forces the code in
// useEffect to run as 3 below cases are
// satisfied
setLayout(response.data);
setSaving(false);
setIserror(false);
}.bind(this)
)
.catch(
function(error) {
console.log(error);
setSaving(false);// only 2 case satisfied i.e layout before
// axios line and saving but not iserror.
setIserror(true);
}.bind(this)
);
}
Надеюсь, это поможет.