DOM Attributes in React 16

在过去, React通常忽略未知的DOM属性。 如果你写的JSX使用了React不能识别的属性, React将会跳过它, 比如:

// Your code:
<div mycustomattribute="something" />

将会渲染成一个空的div元素,在React15中。

// React 15 输出:
<div />

在React 16中, 我们做了改变。 现在任何未知的属性都会在DOM中出现:

// React 16 输出:
<div mycustomattribute="something" />

为什么我们改变了这个行为#

React提供了一套基于JS API来生成DOM。 因此React像DOM APIs一样使用 canelCase 约定来操作DOM相关的属性.

<div tabIndex={-1} />

然而之前, 我们在React DOM类库中维护了DOM白名单属性列表, 强制必须使用这些DOM属性:

// ...
summary: 'summary',
tabIndex: 'tabindex'
target: 'target',
title: 'title',
// ...

这导致两个弊端:

  • 你不能传递使用自定义属性. 对于使用浏览器专有的非标准属性, 尝试使用新的DOM APIs, 或者集成第三方类库等场景, 自定义属性是有用的.
  • 随着时间维护的属性列表不停增长, 删除大部分白名单属性列表有助于减少类库尺寸.

随着React 16的到来, 你现在可以向HTML或者SVG元素传递自定义属性, 而且React不再在生产环境包含整个白名单属性列表.

note

你依然可以使用React提供的已知属性命名

// Yes, please
<div tabIndex={-1} />
// Warning: Invalid DOM property `tabindex`. Did you mean `tabIndex`?
<div tabindex={-1} />

总而言之, React 16提供了一些兼容, 你在React中使用DOM组件的方式没有发生改变.

我应该在自定义属性中保存数据吗#

我们不鼓励你在DOM属性中保存数据. 即便不得已需要这么做, data- 属性也许是一个更好地方式, 但是大部分情况下, 属性应该保存在React组件的状态中, 或者外部存储.

如果你需要使用新的或者非标准DOM属性, 或者你需要集成第三方类库, 这个新特性带来了便利.

Data 和 ARIA 属性#

就像上面说的, React允许你自由传递使用 data-aria- 属性:

<div data-foo="42" />
<button aria-label="Close" onClick={onClose} />

原文翻译自 DOM Attributes in React 16 - September 08, 2017 by Dan Abramov