#javascript #reactjs #typescript #function #react-hooks
Вопрос:
Я пытаюсь учиться, кодируя здесь, я преобразовал классы в хуки, версия класса работает нормально, но преобразованная(хуки) версия выдает мне эту ошибку : «Ошибка в диапазоне: максимальный размер стека вызовов превышен в getFloorplan», буду признателен за любую помощь.
вот рабочий код:
import {
getGraph,
getFloorplan,
changeActiveCamera,
} from "../redux/actions";
const mapStateToProps = (state) => {
return {
currentSite: state.selection.currentSite,
currentCamera: state.selection.currentCamera,
};
};
function mapDispatchToProps(dispatch) {
return {
getGraph: (site) => dispatch(getGraph(site)),
getFloorplan: (site) => dispatch(getFloorplan(site)),
changeActiveCamera: (site, id) => dispatch(changeActiveCamera(site, id)),
};
}
loadGraph() {
if (this.props.currentSite) {
this.props.getFloorplan(this.props.currentSite.identif).then(() => {
console.log("Fetched floorplan");
this.props.getGraph(this.props.currentSite.identif).then(() => {
console.log("Fetched model", this.props.realGraph.model);
// new camera-related node amp; link status
if (this.props.currentCamera) {
this.props.changeActiveCamera(
this.props.currentSite.identif,
this.props.currentCamera.identif
);
}
});
});
}
}
Это версия hooks, которую я преобразовал из приведенного выше кода, здесь я получаю эту ошибку:
const currentSite = useSelector((state) => state.selection.currentSite);
const currentCamera = useSelector((state) => state.selection.currentCamera);
const getFloorplan = (site) => dispatch(getFloorplan(site));
const getGraph = (site) => dispatch(getGraph(site));
const changeActiveCamera = (site, id) =>
dispatch(changeActiveCamera(site, id));
const loadGraph = () => {
if (currentSite) {
getFloorplan(currentSite.identif).then(() => {
console.log("Fetched floorplan");
getGraph(currentSite.identif).then(() => {
console.log("Fetched model", realGraph.model);
// new camera-related node amp; link status
if (currentCamera) {
changeActiveCamera(
currentSite.identif,
currentCamera.identif
);
}
});
});
}
};
Комментарии:
1. const getFloorplan = (сайт) => отправка(getFloorplan(сайт)); разве это не рекурсивный вызов без точки выхода?
2. @Singh как именно я должен преобразовать этот класс в хуки ? как бы ты поступил ? я что-то упускаю
3. @Сингх в этом видео сделал точно такое же видео без ошибок: egghead.io/lessons/…
4. что я вижу, так это то, что он вызывает другую функцию в dispatch(ratesUpdated); а не updatedRates.
Ответ №1:
Измените имя ваших констант или имя импорта, чтобы избежать создания рекурсивных вызовов.
const currentSite = useSelector((state) => state.selection.currentSite);
const currentCamera = useSelector((state) => state.selection.currentCamera);
const dispatchGetFloorplan = (site) => dispatch(getFloorplan(site));
const dispatchGetGraph = (site) => dispatch(getGraph(site));
const dispatchChangeActiveCamera = (site, id) =>
dispatch(changeActiveCamera(site, id));
const loadGraph = () => {
if (currentSite) {
dispatchGetFloorplan(currentSite.identif).then(() => {
console.log("Fetched floorplan");
dispatchGetGraph(currentSite.identif).then(() => {
console.log("Fetched model", realGraph.model);
// new camera-related node amp; link status
if (currentCamera) {
dispatchChangeActiveCamera(
currentSite.identif,
currentCamera.identif
);
}
});
});
}
};
Комментарии:
1. @joonas На мой вкус, в последнем фрагменте я бы вообще не объявлял const и вместо этого просто использовал функцию отправки внутри вашей функции loadGraph, если это возможно.
2. да, вы правы, но это не сработало !! я попробовал это и получил» Свойство», затем «не существует типа» (отправка: любая) => Обещание». ts(2339)», не могли бы вы добавить два ответа, один из которых вы уже добавили, а другой, который вы только что предложили ?
3. я нашел здесь одну проблему с версией класса, которая работает в консоли»console.log («Выбранная модель», this.props.realGraph.model); «я получаю» Выбранный объект модели», но в вашей версии я получаю «Выбранная модель не определена», по какой-либо причине ?
4. и теперь также получаем «Свойство», тогда «не существует типа» (отправка: любая) => Обещание><недействительно>».ts(2339) »
5. Я нигде не вижу в вашем коде определенной переменной realGraph, поэтому я не могу вам в этом помочь. Ваш первоначальный вопрос касался проблемы стекового потока, связанной с бесконечным циклом. Также из вашего кода я не совсем уверен, нужно ли ждать разрешения обещания от одного действия redux, чтобы отправить другое. Это вообще асинхронные вызовы?