#reactjs #react-hooks
Вопрос:
У меня есть компонент, включенный в мой App.js и этот компонент содержит некоторую общую логику, которую необходимо выполнить.
Итак, мой компонент приложения JSX выглядит так
<CommonComponent />
{canRenderBool amp;amp; (
<div class="container">
<Route exact path="/comp1">
<Comp1 />
</Route>
<Route exact path="/comp2">
<Comp2 />
</Route>
</div>
)
}
Теперь я хочу, чтобы при каждом переходе маршрута (например, пользователь нажимает на новый URL-адрес маршрута) запускался код в CommonComponent (не маршрутизируемый компонент).
Этот общий компонент имеет логику, которая возвращает логическую переменную, и я как бы визуализирую/не визуализирую Comp1/Comp2, т. е. все маршруты, основанные на этом логическом
Как лучше всего я могу с этим справиться? Я хочу избежать того, чтобы этот код определялся/вызывался в каждом компоненте вручную?
Кроме того, большинство моих компонентов основаны на функциях/крючках.
Комментарии:
1. Является ли CommonComponent родительским для comp1 и comp2? Я не вижу закрывающего тега.
2. О, извините…обновлено… Ни один общий компонент не является дочерним по отношению к приложению и своего рода родным братом comp1 и comp2
3. Также просто добавлю, что этот общий компонент имеет логику, которая возвращает логическую переменную, и я как бы визуализирую/не визуализирую Comp1/Comp2, т. е. все маршруты, основанные на этом логическом
4. Обновлен код, чтобы вы могли получить представление
5. На самом деле в моем случае это находится в приложении component…so ни одного родителя как такового… Не уверен, что это все еще сработает…
Ответ №1:
В случае, если вы используете функциональный компонент для своего App
компонента. Вы можете написать свою CommonComponent
логику внутри useEffect
, а затем установить состояние для своего canRenderBool
флага
например
import React, { useState, useEffect } from "react";
import { BrowserRouter as Router, Switch, Route, Link, useLocation } from "react-router-dom";
function App() {
const [canRenderBool , setCanRenderBool] = useState(false);
const location = useLocation(); // this will only work if you wrap your App component in a Router
// this effect will run on every route change
useEffect(() => {
// your logic here
// ..
// set value of 'canRenderBool' flag
setCanRenderBool(true);
}, [location]);
return (
// Note that Router is not used here it will be wraped when we export this component, see below
<Switch>
<Route exact path="/">
<Page1 />
</Route>
{canRenderBool amp;amp; (
<Route exact path="/page-2">
<Page2 />
</Route>
)}
</Switch>
);
}
function Page1() {
return (
<div>
<h1>
Go to <Link to="/page-2">Page 2</Link>
</h1>
</div>
);
}
function Page2() {
return (
<div>
<h1>
Go to <Link to="/">Page 1</Link>
</h1>
</div>
);
}
// Wrapping Router around App and exporting
export default () => (
<Router>
<App />
</Router>
);
Ответ №2:
{canRenderBool amp;amp; (
<Router>
<div class="container">
<Switch>
<Route exact path="/comp1"> <Comp1 /> </Route>
<Route exact path="/comp2"> <Comp2 /> </Route>
</Switch>
<Link to="/comp1">Component 1</Link>
<Link to="/comp2">Component 2</Link>
</div>
</Router>
)
}
Это может помочь. И вам нужно будет импортировать все ключевые слова и компоненты, прежде чем использовать их.