使用建议的方法: 这是结果: 按钮内的链接, 注释行之间的代码
我想知道是否有一种方法可以在HTML中使用React将'react-router'
中的元素包裹在
尽管这在网络浏览器中可以呈现,但要注意:
⚠️嵌套一个 HTML button
在一个 HTML a
内部(或反之)不是有效的 HTML ⚠️。
如果您想保持对屏幕阅读器的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>
LinkButton
组件 - 适用于 React Router v4 的解决方案首先,关于此问题的许多其他回答需要注意。
<button>
和 <a>
不是有效的 HTML ⚠️任何在这里建议将 html button
嵌套在 React Router 的 Link
组件中(或反之亦然)的答案都会在 web 浏览器中呈现,但它并不是语义化、可访问或有效的 HTML:
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝点击此处,使用 validator.w3.org 验证此标记☝
由于按钮通常不会放置在链接内部,因此这可能会导致布局和样式问题。
<Link>
组件中使用 HTML 的 <button>
标签。如果你只想要一个 HTML 的 button
标签...
<button>label text</button>
如果您想要一个像React Router的组件一样工作的按钮,那么这里有正确的方法...
使用React Router的withRouter高阶组件将以下属性传递给您的组件:
history
location
match
staticContext
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` doesn’t 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>
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
更新:如果您正在寻找上述内容发布后推出的另一个有趣选项,请查看此useRouter钩子。
import IconButton from '@material-ui/core/IconButton';
导入了一个 material-ui 按钮,并使用它代替 <button />
,效果非常好。 - Daniel Jonce Evans<a>
HTML 标签在视觉上呈现为“按钮”样式,那么@ChaseJames 的解决方案可以实现这一目标。上面的问题问的是如何使用<button>
HTML 元素,而不是<a>
。 - Beau Smith为什么不直接用与按钮相同的CSS装饰链接标签呢?
<Link
className="btn btn-pink"
role="button"
to="/"
onClick={this.handleClick()}
>
Button1
</Link>
<a/>
标签。但应该注意的是,仅将针对 <button/>
设计的现有 CSS 类应用于 <a/>
可能会导致样式失效。原因在于这些元素在 CSS 行为方面根本不同,请参见 此问题 。在我的情况下,我需要先重构样式以应用此解决方案。 - bluenote10如果您正在使用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>
你可以在这里阅读更多内容。
Link
上的to
属性是必需的。 - directory@material-ui/core
导入 Link,而不是从 react-router-dom
导入。 - GuyB自从react-router v5.1.0以来,您可以使用useHistory
钩子。
useHistory
钩子使您能够访问历史实例,您可以使用它进行导航。
import React from 'react'
import { useHistory } from 'react-router-dom'
export default function SomeComponent() {
const { push } = useHistory()
...
<button
type="button"
onClick={() => push('/some-link')}
>
Some link
</button>
...
}
注意:请注意这种方法可以回答问题,但像@ziz194在评论中提到的那样,不可访问
尽管如此,这种方法无法访问,因为按钮不会成为一个标签,因此它没有链接行为,比如在新页面中打开链接。对于屏幕阅读器也不是最优选择。
react-router-dom
。 - SandroMarquesReact Router版本6更新:
这里的各种回答就像react-router演进的时间线一样。
使用react-router v6最新的hooks,可以轻松地使用useNavigate
hook实现此操作。
import { useNavigate } from 'react-router-dom'
function MyLinkButton() {
const navigate = useNavigate()
return (
<button onClick={() => navigate("/home")}>
Go Home
</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>
);
请访问styled-components主页获取更多信息。
我使用Router和<Button/>,没有<Link/>
<Button onClick={()=> {this.props.history.replace('/mypage')}}>
HERE
</Button>
onClick={ () => navigateTo(somePath) }
的组件/节点/元素都可以使用这种方法。无论是使用redux和 import {push} from 'connected-react-router'
还是像你的答案中一样只是使用 history.push
(或replace)。 - Thomas Fauskangerstyled-components
。https://github.com/styled-components/styled-components - Raphael Rafatpanah对于任何想使用React 16.8+ (hooks)和React Router 5的人:
你可以使用以下代码通过按钮更改路由:
<button onClick={() => props.history.push("path")}>
React Router提供了一些属性给你的组件,其中包括history上的push()函数,它的用法与 <Link to='path'> 元素类似。
你不需要使用高阶组件 "withRouter" 包裹你的组件来获得这些属性的访问权限。
BrowserRouter
(基于HTML历史记录API)而不是HashRouter
,你就可以放心使用它了。 - pglezen
<a href="">
,而锚标签不能包含按钮标签。 - taher