【发布时间】:2019-12-22 03:24:54
【问题描述】:
更新到 React 16.9.0 后,我收到了如下严重警告:
警告:未来版本的 React 将阻止 javascript: URL 作为安全预防措施。如果可以,请改用事件处理程序。如果您需要生成不安全的 HTML,请尝试使用 dangerouslySetInnerHTML。 React 通过了“javascript:;”。
它来自这样的代码:
const Component = ({someAction}) => (
<a href="javascript:void(0)" onClick={someAction}>click me</a>
);
查看关于 HTML 中 which “href” value should I use for JavaScript links 的 StackOverflow 问题,你们中的大多数人似乎都同意 javascript:void(0) 是最好的选择,这在 React 16.9.0 中将不再可能。
仅用href="#" 替换是有问题的,因为浏览器会滚动到页面顶部并更改显示的 URL。特别是如果您使用哈希链接进行路由,这是非常有问题的。
我可以更新我的整个代码库以在每个事件处理程序中添加e.preventDefault();,但这似乎很难做到,尤其是当事件处理程序是从 Redux 操作创建者或挂钩自动创建时。我不会到处寻找“只包括e.preventDefault();”的答案!
还使用<button> 意味着我必须处理许多不需要的样式。
所以我想知道:是否有任何特定于库 React 的解决方案来获得一个有效的 <a> 链接,它只会触发一个没有副作用的操作?我想尽可能少地更改代码并摆脱弃用警告。
【问题讨论】:
-
@EmileBergeron 但我想避免一直手动调用
e.preventDefault()。 -
如果你有那么多的按钮链接,我会选择按钮的方式。您甚至可以使用
div,尽管这需要一些可访问性调整。 -
如果它是一个永远不会用作链接的链接,它应该是一个按钮。
-
是的,不要使用锚点作为按钮。对于语义标记和可访问性来说,这是一种不好的做法。
-
已经有人质疑 react 团队添加这个警告的决定了:github.com/facebook/react/pull/15047#issuecomment-521736797
标签: javascript reactjs