#javascript #node.js #reactjs #react-router #react-spring
Вопрос:
Я следую учебнику по использованию ReactRouter с React-Spring. Учебник был датирован и вызван для импорта и использования useContext следующим образом:
const { location } = useContext(__RouterContext);
Теперь он переключен на:
const { location } = useLocation();
Так как это новый стандарт.
Когда я пытаюсь запустить localhost, я получаю сообщение «Ошибка: Недопустимый вызов соединения. Крючки могут вызываться только внутри тела функционального компонента. Это может произойти по одной из следующих причин:…»
Ниже приведены некоторые кадры стека;
Решающий диспетчер C:/Users/12892/Documents/node_modules/react/cjs/react.development.js:1476
useContext C:/Users/12892/Documents/node_modules/react/cjs/react.development.js:1484
Использование C:/Users/12892/Documents/misc проекты/WebDev/модули/крючки.js:29
Приложение C:/Users/12892/Documents/misc проекты/WebDev/transition_site/src/App.js:13 рендерингов с крючками
C:/Users/12892/Documents/misc проекты/WebDev/transition_site/node_modules/react-dom/cjs/react-dom.разработка.js:14985
монтированиедетерминаткомпонент C:/Users/12892/Documents/misc проекты/WebDev/transition_site/node_modules/react-dom/cjs/react-dom.разработка.js:17811
Ниже приведен код для App.js. Я полагаю, что это происходит из-за ошибки при переключении моего кода на использование useLocation над __RouterContext.
import React from 'react';
import { Switch, Route, useLocation } from 'react-router-dom';
import { useTransition, animated } from '@react-spring/web';
import PageOne from './components/PageOne';
import PageTwo from './components/PageTwo';
import PageThree from './components/PageOne';
import PageFour from './components/PageFour';
import Nav from './components/Navbar';
const App = () => {
const { location } = useLocation();
const transitions = useTransition(location, location => location.pathname, {
from: {opacity: 0, transform: "translate(100%, 0)"},
enter: {opacity: 1, transform: "translate(0%, 0)"},
leave: {opacity: 0, transform: "translate(-50%, 0)"}
});
return (
<>
<Nav />
<main className='container-fluid'>
{transitions.map(({ item, props, key }) => (
<animated.div key={key} style={props}>
<Switch>
<Route exact path="/" component={PageOne} />
<Route exact path="/two" component={PageTwo} />
<Route exact path="/three" component={PageThree} />
<Route exact path="/four" component={PageFour} />
</Switch>
</animated.div>
))}
</main>
</>
);
}
export default App;
Index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';
import 'bootstrap/dist/css/bootstrap.min.css';
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);
reportWebVitals();
Комментарии:
1. Является ли поставщик маршрутизатора браузера оболочкой вашего
App
дерева ReactDOM?2. Да, это так. Я обновлю свой пост.
3. Это
let location = useLocation
так, но это все еще не объясняет ошибку.4. Я установил браузер, который устранил проблему. Теперь я получаю «местоположение не определено».
5. См. Предыдущий комментарий.
Ответ №1:
Я решил эту проблему следующим образом:
index.js
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(
<App/>,
document.getElementById("root")
);
App.js
import React, { useContext } from "react";
import { BrowserRouter, Switch, Route, useLocation } from "react-router-dom";
import { useTransition, animated } from "react-spring";
import { page1, page2, page3, page4 } from "./components";
const App = () => {
return (
<>
<BrowserRouter>
<Navbah/>
<Home />
</BrowserRouter>
</>
);
};
const Home = () => {
let location = useLocation();
const transitions = useTransition(location, (location) => location.pathname, {
from: { opacity: 0 },
enter: { opacity: 1 },
leave: { opacity: 0 },
delay: 200,
});
return (
<>
{transitions.map(({ item, props, key }) => (
<animated.div key={key} style={props}>
<Switch location={item}>
<Route exact path="/page1" component={Page1} />
<Route exact path="/page2" component={Page2} />
<Route exact path="/page3" component={Page3} />
<Route exact path="/page4" component={Page4} />
</Switch>
</animated.div>
))}
</>
);
};
export default App;