Ответ 1
⚠️ Нет, вложение html- button
в html a
(или наоборот) не является действительным html
Использование предложенного метода: это результат: ссылка в кнопке, код между строками комментария
Мне было интересно, есть ли способ обернуть элемент Link
'react-router'
в тег button
HTML с помощью реакции.
В настоящее время у меня есть компоненты Link
для навигации по страницам в моем приложении, но я хотел бы сопоставить эту функциональность с моими кнопками HTML.
⚠️ Нет, вложение html- button
в html a
(или наоборот) не является действительным html
Выполните перенос в обратном порядке, и вы получите оригинальную кнопку с прикрепленной ссылкой. Никаких изменений CSS не требуется.
<Link to="/dashboard">
<button type="button">
Click Me!
</button>
</Link>
Здесь кнопка является кнопкой HTML. Это также применимо к компонентам, импортированным из сторонних библиотек, таких как Semantic-UI-React.
import { Button } from 'semantic-ui-react'
...
<Link to="/dashboard">
<Button style={myStyle}>
<p>Click Me!</p>
</Button>
</Link>
Хотя это будет отображаться в веб-браузере, имейте в виду, что:
⚠️ Вложение html- button
в html a
(или наоборот) не является действительным html
LinkButton
- решение для React Router v4Во-первых, заметка о многих других ответах на этот вопрос.
<button>
и <a>
недопустимо в формате HTML. ⚠️ Любой ответ, предлагающий вложить html- button
в компонент React Router Link
(или наоборот), будет отображаться в веб-браузере, но это не семантический, доступный или недействительный html:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ Нажмите, чтобы подтвердить эту разметку с помощью validator.w3.org ☝
Это может привести к проблемам макета/стиля, поскольку кнопки обычно не размещаются внутри ссылок.
<button>
с компонентом React Router <Link>
. Если вы хотите только тег HTML button
...
<button>label text</button>
... тогда вот правильный способ получить кнопку, которая работает как компонент React Routers Link
...
Используйте React Routers withRouter HOC, чтобы передать эти реквизиты вашему компоненту:
history
location
match
staticContext
LinkButton
Вот компонент LinkButton
для вас, чтобы скопировать /LinkButton
:
// file: /components/LinkButton.jsx
import React from 'react'
import PropTypes from 'prop-types'
import { withRouter } from 'react-router'
const LinkButton = (props) => {
const {
history,
location,
match,
staticContext,
to,
onClick,
// ⬆ filtering out props that 'button' doesnt know what to do with.
...rest
} = props
return (
<button
{...rest} // 'children' is just another prop!
onClick={(event) => {
onClick && onClick(event)
history.push(to)
}}
/>
)
}
LinkButton.propTypes = {
to: PropTypes.string.isRequired,
children: PropTypes.node.isRequired
}
export default withRouter(LinkButton)
Затем импортируйте компонент:
import LinkButton from '/components/LinkButton'
Используйте компонент:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
Если вам нужен метод onClick:
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
Почему бы просто не украсить тег ссылки тем же css, что и кнопкой.
<Link
className="btn btn-pink"
role="button"
to="/"
onClick={this.handleClick()}
>
Button1
</Link>
Я использую Router и <Button/>. Нет <Link/>
<Button onClick={()=> {this.props.history.replace('/mypage')}}>
HERE
</Button>
Если вы используете react-router-dom
и material-ui
вы можете использовать...
import { Link } from 'react-router-dom'
import Button from '@material-ui/core/Button';
<Button component={Link} to="/open-collective">
Link
</Button>
Вы можете прочитать больше здесь.
С помощью стильных компонентов это может быть легко достигнуто
Сначала разработайте стильную кнопку
import styled from "styled-components";
import {Link} from "react-router-dom";
const Button = styled.button'
background: white;
color:red;
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid red;
border-radius: 3px;
'
render(
<Button as={Link} to="/home"> Text Goes Here </Button>
);
проверьте стиль компонента дома для более
Многие из решений были направлены на усложнение вещей.
Использование withRouter - это действительно длинное решение для чего-то такого простого, как кнопка, которая ссылается на другое место в приложении.
Если вы собираетесь использовать SPA (одностраничное приложение), самый простой ответ, который я нашел, - это использовать с кнопкой, эквивалентной className.
Это гарантирует, что вы поддерживаете общее состояние/контекст без перезагрузки всего приложения, как это делается с
import { NavLink } from 'react-router-dom'; // 14.6K (gzipped: 5.2 K)
// Where link.{something} is the imported data
<NavLink className={'bx--btn bx--btn--primary ${link.className}'} to={link.href} activeClassName={'active'}>
{link.label}
</NavLink>
// Simplified version:
<NavLink className={'bx--btn bx--btn--primary'} to={'/myLocalPath'}>
Button without using withRouter
</NavLink>
Для тех, кто ищет решение с использованием React 16. 8+ (hooks) и React Router 5:
Вы можете изменить маршрут, используя кнопку со следующим кодом:
<button onClick={() => props.history.push("path")}>
React Router предоставляет некоторые реквизиты для ваших компонентов, включая функцию push() для истории, которая работает почти так же, как элемент <Link to = 'path'>.
Вам не нужно оборачивать свои компоненты компонентом высшего порядка "withRouter", чтобы получить доступ к этим реквизитам.