#javascript #reactjs #material-ui #react-material
Вопрос:
У меня есть эти кнопки, на которые я хотел бы добавить ссылку для перенаправления:
<Tooltip title="Open New Ticket">
<IconButton aria-label="filter list">
<AddTwoToneIcon />
</IconButton>
</Tooltip>
Я добавил это:
<Tooltip title="Open New Ticket">
<Link to='open-ticket'>
<IconButton aria-label="filter list">
<AddTwoToneIcon />
</IconButton>
</Link>
</Tooltip>
Но когда я нажимаю кнопку, я не перенаправляюсь на новую страницу. Эта кнопка, например, работает нормально:
<Link to='open-ticket'>
<Button
variant="contained"
color="primary"
size="small"
startIcon={<SaveIcon />}
>
Open Ticket
</Button>
</Link>
Знаете ли вы, как правильно реализовать эту функциональность?
Комментарии:
1. Попробуйте просмотреть отображаемый html-код. Ты видишь
<a>
там какую-нибудь бирку?2. Проверьте, используете ли вы
Link
компонент из MUI или изreact-router
3. Вы пытаетесь перейти по другому пути в том же веб-приложении или пытаетесь открыть ссылку на другой домен?
Ответ №1:
- Убедитесь, что вы установили
react-router-dom
.@material-ui/core/Link
не получится. - Импортируйте
BrowserRouter
изreact-router-dom
корневого компонента и оберните его внутри.
import { BrowserRouter } from "react-router-dom"
import Root from "./views/Routes";
...
const App = props => {
return (
<BrowserRouter>
<Root />
</BrowserRouter>
);
}
- В своем
Root
компоненте укажитеRoute
s сpath
render
компонентом и и оберните их внутриSwitch
компонента.Switch
обеспечивает соответствие только одного изRoute
детей. URL-адрес оценивается поRoute
компонентам внутриSwitch
, и отображается первыйRoute
компонент, которыйpath
соответствует префиксу URL-адреса. Вот почему вы должны быть осторожны с порядкомRoute
компонентов внутриSwitch
import { Fragment } from "react";
import { Route, Switch, Redirect } from "react-router-dom";
import Main from "./Main";
import Home from "./Home";
import About from "./About";
import NotFound from "./404";
const Root = (props) => {
return (
<Fragment>
<Main />
<Switch>
<Route path="/about" render={(p) => <About {...p} />} />
<Route path="/404" render={(p) => <NotFound {...p} />} />
<Route path="/" render={(p) => <Home {...p} />} />
<Redirect to="/404" />
</Switch>
</Fragment>
);
};
export default Root;
- Использовать
Link
сreact-router-dom
import { Link } from "react-router-dom";
import { Tooltip, IconButton, Grid } from "@material-ui/core";
import { HomeTwoTone, InfoTwoTone } from "@material-ui/icons";
const Main = (props) => {
return (
<Grid container spacing={2} justifyContent="center">
<Grid item>
<Tooltip title="Home Page">
<Link to="/">
<IconButton aria-label="filter list">
<HomeTwoTone />
</IconButton>
</Link>
</Tooltip>
</Grid>
<Grid item>
<Tooltip title="About Page">
<Link to="/about">
<IconButton aria-label="filter list">
<InfoTwoTone />
</IconButton>
</Link>
</Tooltip>
</Grid>
</Grid>
);
};
export default Main;
Ответ №2:
Внутри вашей кнопки вы можете добавить:
onClick={событие => окно.местоположение.href=’/ваш-href’}
Комментарии:
1. Есть ли лучший способ?
2. Не будет ли это еще одним HTTP-вызовом и повторной загрузкой всех источников react-приложения? Эта практика должна быть подвергнута резкой критике.
3. @HamzaAsif Моей первой мыслью было, что ссылка была внешней, например. www.google.com вот почему я сказал, что, если мы говорим о внутренней ссылке, наверняка есть лучшие способы сделать это, например
history.push(path);
, внутри OnClick {}