#reactjs #react-hooks
Вопрос:
Я застрял на предупреждении о недопустимом крючке. Это зависимость от третьей стороны, которая также затрудняет контроль. Но вот код, который вызывает проблему,
export class Component {
constructor() {
this._initReact();
}
_initReact(displayName) {
const component = React.forwardRef((props = {}, ref) => {
const _a = Object.assign(Object.assign({}, this._props), props), { className, container, label, title, tag = 'div' } = _a, styleProps = __rest(_a, ["className", "container", "label", "title", "tag"]);
// set up component state via useState hook
const [, setId] = React.useState(this._uuid);
// subscribe to svg replacement via useEffect hook
React.useEffect(() => {
const onSvgReplaced = () => {
setId(this._uuid);
};
this._svgReplaced.connect(onSvgReplaced);
// specify cleanup callback as hook return
return () => {
this._svgReplaced.disconnect(onSvgReplaced);
};
});
// make it so that tag can be used as a jsx component
const Tag = tag;
// ensure that svg html is valid
if (!(this.svgInnerHTML amp;amp; this.svgReactAttrs)) {
// bail if failing silently
return React.createElement(React.Fragment, null);
}
const svgComponent = (React.createElement("svg", Object.assign({}, this.svgReactAttrs, { dangerouslySetInnerHTML: { __html: this.svgInnerHTML }, ref: ref })));
if (container) {
Private.initContainer({ container, className, styleProps, title });
return (React.createElement(React.Fragment, null,
svgComponent,
label));
}
else {
return (React.createElement(Tag, { className: classes(className, LabIconStyle.styleClass(styleProps)) },
svgComponent,
label));
}
});
component.displayName = `LabIcon_${displayName}`;
return component;
}
}
В этой функции useState и useEffect — это то, откуда поступают предупреждения ?
Любые предложения, чтобы пройти мимо этого, будут большим подспорьем.
Ответ №1:
Похоже, ты используешь LabIcon
компонент, да? https://github.com/jupyterlab/jupyterlab/blob/master/packages/ui-components/src/icon/labicon.tsx#L454
Это компонент класса, но useEffect
useState
крючки и могут использоваться только в компонентах функций и в других крючках: https://reactjs.org/warnings/invalid-hook-call-warning.html
Вы можете вызывать хуки только во время рендеринга компонента функции React:
Вызовите их на верхнем уровне в теле компонента функции.
Вызовите их на верхнем уровне в теле пользовательского крючка.
Комментарии:
1. Вот как команда лаборатории jupyter написала этот компонент, когда они запускают этот компонент, он работает для них, но не работает для меня. У вас есть какие-нибудь предложения, как я могу это исправить ? Я даже попытался локально изменить компонент LabIcon на функциональный компонент. Это не изменило результата, все та же проблема
Invalid hook call.
2. Я не знаю, как от этого избавиться, нет. Я предполагаю, что они не видят предупреждения, потому что используют другую версию React, или у них есть параметр конфигурации, который игнорирует это конкретное предупреждение.
3. Только что подтвердил, что версия react такая же, что меня озадачивает, так это то, что даже преобразование этого компонента в функциональный компонент также имеет такое же поведение. Также еще один момент заключается в том, что я изменяю скомпилированные файлы для изменения их на функциональный компонент, поэтому там не все точно
4. Проблема заключалась в том, что было запущено несколько приложений react.