Реагировать на ловушки в реагирующей библиотеке, выдающие неверную ошибку вызова ловушки

Я создаю библиотеку реагирования, используя https://www.npmjs.com/package/create-react-library И успешно использовал его в другом проекте React. Но когда я попытался использовать функциональные возможности реагирующих хуков внутри библиотеки, это дало мне следующую ошибку.

Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
    1. You might have mismatching versions of React and the renderer (such as React DOM)
    2. You might be breaking the Rules of Hooks
    3. You might have more than one copy of React in the same app
.....

Моя библиотека Я только что попытался использовать useState в своем компоненте следующим образом.

import React, { useState } from 'react'

const General = (props) => {

    const [count, setCount] = useState(0);
    return (
        <div>
           General component
        </div>
    )
}

export default General

я использую "react": "^16.8.6" и "react-dom": "^16.8.6"

Мое приложение React Создал приложение с использованием https://github.com/facebook/создать-реагировать-приложение и использовал вышеуказанную библиотеку следующим образом.

import Reactfrom 'react'
import { General } from 'my.lib'
const accountSummary = props => {

  return (
    <div>
      <General>
    </div>
  )
}

export default accountSummary

Оба имеют одинаковые версии реакции, и библиотека использует те же версии реакции и реакции, что и peerDependencies

Одно можно сказать наверняка, вы не нарушаете Правила Крюков.

Vencovsky 07.05.2019 13:03

Какие версии React и React DOM вы используете?

Joe Clay 07.05.2019 13:04

Компонент выглядит нормально. Проверьте свой React и React DOM версии 16.8 (я полагаю, что это тоже нормально). можете ли вы предоставить весь минимальный код для его воспроизведения? пытаюсь воспроизвести и не получается

F.bernal 07.05.2019 13:20

Убедитесь, что приложение, в котором вы используете эту библиотеку, также имеет реакцию 16.8 и выше, а также правильно указаны одноранговые зависимости в библиотеке.

Shubham Khatri 07.05.2019 13:24

@F.bernal Я отредактировал свой вопрос на основе ваших комментариев. Пожалуйста, проверьте и спасибо.

Janith Widarshana 07.05.2019 13:29

@Vencovsky, какое правило я нарушаю. НЕ иметь ни малейшего представления.

Janith Widarshana 07.05.2019 13:30

@JanithWidarshana Вы НЕ нарушаете никаких правил, вы правильно используете хуки.

Vencovsky 07.05.2019 13:31

вроде здесь все работает нормально, а проблема где-то в другом

r g 07.05.2019 14:14

Проблема в том, что я запускаю библиотеку локально и ссылаюсь на нее, используя `"my.library": "file:../my.library"` в py package.json. Lib работает отдельно в другом экземпляре реакции. Если я опубликую его как библиотеку npm и использую, он отлично работает.

Janith Widarshana 08.05.2019 11:18

Вот как вы нарушили правило... Вы использовали хук (скажем, useState) в одном из компонентов (из MyLibrary), который связан с dist/index.js вашим Rollup (который по умолчанию настроен с помощью create-реагировать -библиотека). Когда произошло связывание, ваш крючок мог попасть в одно из условий (скажем, если), и правило нарушилось!!

Yugandhar Pathi 07.08.2019 00:19

@YugandharPathi, если это так, каково решение? Я думаю, что у меня может быть такая же проблема. React не может быть настолько хрупким, чтобы не справиться с пакетированием, не так ли?

Dave 12.07.2020 22:16

@Dave, ссылающийся на библиотеку реагирования в основном проекте через file:../, сработал для меня. Вы пробовали это?

Janith Widarshana 13.07.2020 07:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
30
12
15 328
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Я создал библиотеку React с create-react-library этой библиотекой — вашим General компонентом. Я опубликовал его в npm здесь https://www.npmjs.com/package/stackoverflow-тест и в приложении React для использования здесь https://codesandbox.io/s/mm7yl83o28.

Просто нажмите на General component текст, и count будет увеличено.

Я не могу воспроизвести вашу проблему, просто используйте этот тест, чтобы проверить вашу реализацию.

Наконец я нашел проблему. Я установил «скрипты реагирования» в свое приложение для реагирования, и теперь оно работает нормально.

Janith Widarshana 07.05.2019 16:29

Хорошо, так что не было пакетов

F.bernal 07.05.2019 16:39

Проблема в том, что я запускаю библиотеку локально и ссылаюсь на нее, используя `"my.library": "file:../my.library"`. Lib работает отдельно в другом экземпляре реакции. Если я опубликую его как библиотеку npm и использую, он отлично работает.

Janith Widarshana 08.05.2019 11:18

Использовали ли вы хук внутри компонента (скажем, <General/>) в тесте stackoverflow?

Yugandhar Pathi 07.08.2019 00:21

@YugandharPathi да

F.bernal 07.08.2019 07:25

Эта проблема будет видна только в том случае, если вы включите локальную библиотеку, используя файл:../

Yugandhar Pathi 09.08.2019 02:20
Ответ принят как подходящий

Я включил свою библиотеку компонентов (в этом отношении любую библиотеку) в свое приложение, как это сделал @Janith, используя my-comp-lib:"file:../.." (я не хочу публиковать каждый раз, когда хочу протестировать), и столкнулся с той же проблемой.

Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:

  1. You might have mismatching versions of React and the renderer (such as React DOM)
  2. You might be breaking the Rules of Hooks
  3. You might have more than one copy of React in the same app See react-invalid-hook-call for tips about how to debug and

fix this problem

Я смог исправить это, заставив мое приложение и библиотеку указывать на одно и то же место реакции (пакета).

Below are the steps I followed :
1. In Your Application:
a) cd node_modules/react && npm link
b) cd node_modules/react-dom && npm link

2. In Your Library
a) npm link react
b) npm link react-dom

3)Stop your dev-server and do `npm start` again.

Оно работает!!

Пожалуйста, обратитесь к ссылкам ниже для получения более подробной информации ..

https://github.com/facebook/реагировать/issues/14721

https://github.com/facebook/реагировать/тянуть/14690

https://github.com/facebook/реагировать/issues/13991

Примечание. Эта проблема не возникнет, если вы опубликуете свой пакет в Artifactory и установите, потому что у вас будут react и react-dom в качестве одноранговых зависимостей, и они не будут включены в дистрибутив. Таким образом, ваш пакет и приложение используют ту же реакцию, которая установлена ​​в приложении.

Нужно ли устанавливать react-dom в библиотеку? Он явно не импортируется в код библиотеки, написанный ОП.

kas 27.05.2020 04:09

Кстати, более лаконичное решение — запустить эту команду из папки библиотеки: «npm link ../web-application/node_modules/react». Предполагается, что библиотека и веб-приложение находятся в родственных папках. Аналогичную команду можно использовать, если библиотеке также необходимо использовать react-dom.

kas 27.05.2020 04:11

@yugandhar-pathi большое спасибо за это решение!

jashgopani 18.05.2021 08:13

Спасибо за этот ответ. Это действительно помогло

vdua 15.07.2021 18:55

Спасибо за ваше решение @yugandhar-pathi! но есть вопрос: мы не публикуем наш пакет в npm! мы помещаем его на наш сервер gitlab, а затем устанавливаем в другие приложения, используя токен развертывания gitlab. как мы можем справиться с этим в производстве? мы не можем использовать npm link в производстве

mahziar.eghdami 18.07.2021 09:35

Я только что столкнулся с той же проблемой. Я смог это исправить, указав на ту же реакцию в моем примере приложения, что и в моей библиотеке:

Структура приложения

Корень

  • Пример
    • пакет.json
  • источник (библиотека)
  • пакет.json

Итак, из примера > package.json я изменил реакцию на:

    "react": "link:../node_modules/react",

Это очень похоже на npm link, перечисленное выше, но оно не исчезнет при каждой установке npm.

Да, это было решение для меня, чтобы избавиться от вышеуказанной проблемы.

Janith Widarshana 11.09.2019 12:24

Имейте в виду, что более новые версии npm имеют устаревшую ссылку. Вместо этого вам нужно использовать файл: "react": "file:../node_modules/react"

RyanNerd 15.05.2021 22:46

У меня это сработало, когда я изменил ссылку из приложения на библиотеку на «ссылка:../» вместо «файл:../», в дополнение к связыванию реакции и реакции-дом.

Я получаю сообщение об ошибке «Неподдерживаемый тип URL-адреса» ссылка:: когда я пытаюсь это сделать. Я на npm 6.4.1

Ben Clayton 23.06.2020 19:39

Добавьте в свою библиотеку компонентов package.json

"peerDependencies": {
  "react": "<your version>"
}

так что ваш пакет lib будет использовать тот же пакет react, что и ваше основное приложение. https://nodejs.org/es/blog/npm/peer-dependencies/

React 17 + Библиотека тестирования React + Umi (интерфейсный фреймворк, встроенный реагирующий маршрутизатор)

В моем случае, когда я запускаю модульный тест, я получаю сообщение об ошибке «неверный вызов ловушки».

После периода попыток я нашел два способа решения.

  1. Перейдите на React 16.x, тогда все будет хорошо.
  2. Продолжайте использовать React 17.x и
    • Надо еще написать import React from 'react'
    • Установить react-router-dom отдельно

Я думаю, что это может быть проблема с реактивным маршрутизатором, но из-за моего ограниченного понимания у меня пока нет лучшего решения.

Также проверьте свою версию npm. У меня была версия 7.0.8 которая устарела, после смены на 6.14.8 все заработало нормально!

ПРИ ТЕСТИРОВАНИИ РЕАЛЬНОГО ПРИЛОЖЕНИЯ В REACT NATIVE

У меня такая же проблема, и я удаляю файл node_module в своей пользовательской библиотеке, и я исправил его.

проблема при установке прямого модуля

пряжа добавить c:/user......./react-native-some-lib

У меня была та же проблема, когда я работал с срочным монорепозиторием, настраивал пользовательский интерфейс и создавал приложения с использованием nextjs.

Решения были добавлены в следующий код на package.json

"resolutions": {
  "react": "17.0.1", // verificate your react version
  "react-dom": "17.0.1"
}

В библиотеке package.json:

"peerDependencies": {
   "react": "17.0.1",
   "react-dom": "17.0.1"
 },

Подробнее здесь: https://github.com/vercel/next.js/issues/9022#issuecomment-728688452

В моем случае я создаю свою собственную общую библиотеку. Хотя я экспортировал createContext, useContext и useState из "react", я просто забыл также импортировать экспорт по умолчанию, React.

Изменение моего оператора импорта с этого:
import { createContext, useContext, useState } from "react";

на это:
import React, { createContext, useContext, useState } from "react";

исправил это для меня. Возможно, вам придется сделать это в каждом компоненте/контексте React и т. д., которые вы экспортируете из своей библиотеки реагирования.

Редактировать:

В другом из моих приложений, использующих эту общую библиотеку, эта проблема также была исправлена ​​с помощью npm link, как описано в документации React (Предупреждение о недопустимом хуке):

This problem can also come up when you use npm link or an equivalent. In that case, your bundler might “see” two Reacts — one in application folder and one in your library folder. Assuming myapp and mylib are sibling folders, one possible fix is to run npm link ../myapp/node_modules/react from mylib. This should make the library use the application’s React copy.

Итак, в моем случае я перешел к своей общей библиотеке и запустил npm link ../path-to-my-app/node_modules/react.

Изменить (23.02.2022)

Надеемся, что окончательное редактирование - другое решение состоит в том, чтобы просто глобально установить проблемную зависимость, если все приложения предполагают использовать одну и ту же версию, например. npm install react -g

Другие вопросы по теме