我想要一个更直观的Link
API,它尊重我们对原生标签的期望a
。
当前的链接 API 如下所示:
<Link href="/about">
<a>here</a>
</Link>
由于以下几个原因,这是有问题的:
- 它打破了 a11y 的直觉。当我看到
a
没有 的标签时href
,警钟就会响起,因为这是一种用户体验反模式。事实上,这个 API 无法满足anchor-is-valid
eslint-plugin-jsx-a11y 规则(参见https://github.com/evcohen/eslint-plugin-jsx-a11y/issues/402)。 - 它需要一个
cloneElement
应该避免的调用,因为它的行为令人困惑。 (我怎么知道我的a
标签会被赋予href
?这个 API 没有任何暗示。)
我想要一个不需要您键入a
不带标签的解决方案href
,也不需要您复制href
信息。
有一些不错的选择:
a
如果没有给出子项,则默认标记:
<Link href="/about" />
这是react-router使用的方法,并且效果很好。
- 使用渲染道具:
<Link href="/about">
{href => <a href={href}>here</a>}
</Link>
此方法安抚了anchor-is-valid
规则,并且不需要用户复制 href 信息,因为构建 href 会传递到他们正在渲染的组件。
- 组件注入:
<Link href="/about" component={a} />
1 和 2 的组合足以覆盖所有合理的用例。
额外的背景信息https://github.com/zeit/next.js/commit/6431f5fce2593d8cadb81841eb0e717facbe4aa6