Я знаю, что эту проблему несколько раз задавали в stackoverflow, но я не могу выполнить эту работу даже после нескольких часов попыток ...
Я работаю с React. js уже год но недавно я перешел на перехватчики React и компоненты без состояния, поэтому у меня нет большого опыта работы с ними, поэтому заранее извините меня, если решение очевидно, потому что я действительно пытался решить его самостоятельно, прежде чем спрашивать здесь ...
1. Что делает мой код:
У меня есть простой useEffect
хук, который я хочу вызвать при изменении props rank
. В ловушке я вызываю метод toggleNodeByRank()
, используя .then
, и обновляю свое состояние с именем data
после выполнения метода.
2. Что происходит:
На данный момент (почти) все работает нормально, а во втором console.log('===StateUpdated===', chartData);
я вижу, что мое состояние имеет правильное обновленное значение.
Единственная проблема в том, что мой компонент не перезагружается, и если я повторю действие, обновляющее реквизиты rank
, я увижу изменения.
Я видел несколько ответов, в которых говорилось, что deps (rank
здесь) не были хорошими, я попытался добавить chartData
также в deps ([rank, chartData]
), но проблема осталась той же ...
Может быть, кто-то может мне помочь вот этот ?
useEffect(() =>
console.log('===PreviousState===', chartData);
toggleNodeByRank(chartData, rank).then((data) => setChartData(data));
console.log('===StateUpdated===', chartData);
}, [rank]);
3. Изменить
Вот функция toggleNodeByRank (), так как это код моей компании, я предпочитаю не раскрывать слишком много информации, надеюсь, это поможет вам, ребята ..
const toggleNodeByRank = async (node, rank) => {
if (node && node.data) {
// await update node.children depending on node.rank
// - If I want to toggle the node :
// I am saving the node.children in a state object (key = node.id,
// value = node.children) and I reset the node.children value to [ ]
// - If I don't want to toggle the node :
// I don't do anything and juste render
// update another state to save the node.children data if needed.
return node;
}
};