Зависимость от третьей стороны :- Предупреждение о недопустимом вызове

#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.