#reactjs #react-redux #react-router #react-hooks
#reactjs #реагировать-redux #реагировать-маршрутизатор #реагировать-перехваты
Вопрос:
По какой-то причине я не могу использовать перехват useContext.
Ссылка на репозиторий для структуры каталога: URL-адрес РЕПО
Ошибка:
Необработанная ошибка времени выполнения
Ошибка: недопустимый вызов перехвата. Перехваты могут вызываться только внутри тела функционального компонента. Это может произойти по одной из следующих причин:
- Возможно, у вас несовпадающие версии React и средства визуализации (например, React DOM)
- Возможно, вы нарушаете правила использования перехватов
- У вас может быть более одной копии React в одном приложении
Мой код:
контекст :
import { createContext, useReducer } from 'react'
export const DataContext = createContext();
const DataProvider = ({ intialState, reducer, children }) => {
<DataContext.Provider value={useReducer(reducer, intialState)}>
{children}
</DataContext.Provider >
}
export default DataProvider;
редуктор:
import { types } from './types';
export const initialState = {
name: '',
room: ''
}
const reducer = (state, action) => {
console.log("Calling action", action);
switch (action.type) {
case types.SET_NAME:
return { ...state, name: action.name }
case types.SET_ROOM:
return { ...state, name: action.room }
default:
return state;
}
}
Основной компонент, вызывающий проблему :
import { useContext } from 'react';
import { input } from '../hooks/input';
import Link from 'next/link';
import { DataContext } from '../context/DataProvider';
import { types } from '../reducers/types';
const Join = () => {
const [name, setName] = input('');
const [room, setRoom] = input('');
const submit = () => {
console.log('FORM');
const [state, dispatch] = useContext(DataContext);
dispatch({
type: types.SET_NAME,
name
});
dispatch({
type: types.SET_ROOM,
room
})
}
return (
<div>
<h1>Join</h1>
<input onChange={(e) => setName(e)} placeholder="name" />
<input onChange={(e) => setRoom(e)} placeholder="room" />
<Link href="/chat">
<button type="submit" onClick={() => submit()}>Submit</button>
</Link>
</div>
)
}
export default Join;
Комментарии:
1.
const [state, dispatch] = useContext(DataContext);
это ваша проблемная строка. Как указано в ошибке: вы можете использовать перехваты только в теле функционального компонента. Это используется в обычной функции, а не в теле функционального компонента, поэтому это не разрешено (см. правило 2).
Ответ №1:
Вы можете использовать перехваты только в теле функционального компонента. Вы не можете использовать их в функции обратного вызова. Поэтому переместите использование useContext за пределы submit:
const [state, dispatch] = useContext(DataContext);
const submit = () => {
console.log("FORM");
dispatch({
type: types.SET_NAME,
name,
});
dispatch({
type: types.SET_ROOM,
room,
});
};