Вопрос или проблема
Проблемы с react-jsonschema-form
Я пытаюсь использовать react-jsonschema-form. Я создал новый проект на React и отредактировал index.js, используя код из раздела “Использование” в документации react-jsonschema-form. Вот код:
import React from 'react';
import ReactDOM from 'react-dom/client';
import {render} from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import Form from '@rjsf/core';
import { RJSFSchema } from '@rjsf/utils';
import validator from '@rjsf/validator-ajv8';
const schema: RJSFSchema = {
title: 'Задача',
type: 'object',
required: ['title'],
properties: {
title: { type: 'string', title: 'Название', default: 'Новая задача' },
done: { type: 'boolean', title: 'Выполнено?', default: false },
},
};
const log = (type) => console.log.bind(console, type);
render(
<Form
schema={schema}
validator={validator}
/>,
document.getElementById('root')
);
Когда я запускаю код, я получаю это предупреждение в консоли JS:
index.js:23 Предупреждение: Неверный вызов хуков. Хуки можно вызывать только внутри тела функциональных компонентов. Это может произойти по одной из следующих причин:
1. У вас могут быть несовпадающие версии React и рендерера (например, React DOM)
2. Вы можете нарушать правила хуков
3. У вас может быть больше одной копии React в одном приложении
Смотрите https://reactjs.org/link/invalid-hook-call для советов о том, как отладить и исправить эту проблему.
А затем эта ошибка:
Невозможно прочитать свойства null (чтение 'useCallback')
TypeError: Невозможно прочитать свойства null (чтение 'useCallback')
at useCallback (http://localhost:3000/static/js/bundle.js:31433:25)
at SchemaFieldRender (http://localhost:3000/static/js/bundle.js:3059:88)
at renderWithHooks (http://localhost:3000/static/js/bundle.js:51769:22)
at mountIndeterminateComponent (http://localhost:3000/static/js/bundle.js:55740:17)
at beginWork (http://localhost:3000/static/js/bundle.js:57043:20)
at HTMLUnknownElement.callCallback (http://localhost:3000/static/js/bundle.js:42025:18)
at Object.invokeGuardedCallbackDev (http://localhost:3000/static/js/bundle.js:42069:20)
at invokeGuardedCallback (http://localhost:3000/static/js/bundle.js:42126:35)
at beginWork$1 (http://localhost:3000/static/js/bundle.js:62024:11)
at performUnitOfWork (http://localhost:3000/static/js/bundle.js:61272:16)
Не знаю, почему это происходит, буду признателен за любую помощь.
Ответ или решение
Судя по вашему коду и сообщениям об ошибках, вы столкнулись с проблемами, часто связанными с использованием React Hooks. Вот несколько шагов и советов, которые помогут вам решить эту проблему:
-
Проверьте версии React и ReactDOM:
Убедитесь, что версииreact
иreact-dom
совпадают. Вы можете проверить это в вашемpackage.json
:"dependencies": { "react": "^17.0.2", // или другая версия "react-dom": "^17.0.2" // версия должна совпадать с React }
Если версии различаются, выполните команду:
npm install react@<версия> react-dom@<версия>
-
Проверьте дубликаты React:
Возможно, у вас установлено несколько копий React. Чтобы проверить это, выполните:npm ls react
Если вы увидите, что
react
установлен в более чем одной версии или компоненте, вам нужно решить эту проблему. Вы можете попробовать удалитьnode_modules
и файлpackage-lock.json
, а затем выполнить:npm install
-
Убедитесь, что ваш код является функцией компонента:
ОшибкаInvalid hook call
также может возникать, если вы вызываете хуки вне функциональных компонентов. Убедитесь, что вся ваша логика и вызываемые хуки находятся внутри функционального компонента. Например, оберните ваш код в компонент:import React from 'react'; import ReactDOM from 'react-dom/client'; import Form from '@rjsf/core'; import { RJSFSchema } from '@rjsf/utils'; import validator from '@rjsf/validator-ajv8'; const App = () => { const schema: RJSFSchema = { title: 'Todo', type: 'object', required: ['title'], properties: { title: { type: 'string', title: 'Title', default: 'A new task' }, done: { type: 'boolean', title: 'Done?', default: false }, }, }; return ( <Form schema={schema} validator={validator} /> ); }; const root = ReactDOM.createRoot(document.getElementById('root')); root.render(<App />);
-
Правильный импорт и использование
ReactDOM.createRoot
:
Убедитесь, что вы используетеReactDOM.createRoot
изreact-dom/client
. Это позволяет корректно обрабатывать хуки компонентов. - Проверка на наличие ошибок в других частях вашего приложения:
Если ни одно из вышеуказанных решений не помогло, проверьте другие компоненты вашего приложения на предмет неправильного использования хуков.
После выполнения всех вышеуказанных шагов, ваша проблема должна быть решена. Если ошибка все еще возникает, рекомендуется обратиться к документации библиотек или сообществу для получения дополнительной помощи.