React 中真正的自定义属性(例如微数据)

IT技术 javascript reactjs microdata react-jsx
2021-04-14 20:00:05

我正在开发的站点使用微数据(使用 schema.org)。当我们将开发转移到使用 React 来呈现我们的视图时,我遇到了一个障碍,其中 React 只会呈现 HTML 规范中的属性,但 Microdata 指定了自定义属性,例如itemscope.

由于我对 React 比较陌生并且还没有机会完全理解核心,我的问题是扩展 react.js 的功能以允许定义的自定义属性(例如微数据)的最佳方法是什么?

有没有一种方法可以扩展属性/props解析器,或者它是一种检查所有传递的props并直接修改 DOM 元素的 mixin 的工作?

(希望我们能够在解决方案明确时为每个人提供一个扩展插件,以便为此提供支持。)

5个回答

您还可以使用“”属性。它将禁用 React 的属性白名单并允许每个属性。但是你必须写class而不是,classNamefor不是htmlFor如果你使用is.

<div is my-custom-attribute="here" class="instead-of-className"></div>

现在可以更新 React 16 自定义属性

在 React 中,现在可以使用 16 个自定义属性

React 16 个自定义属性

可以在名为 isCustomComponent 的函数中找到github.com/facebook/react/blob/...
2021-06-07 20:00:05
这似乎是 React 的一个未记录的“功能”。因此,我担心它不稳定,如果您使用它,最终可能会将您固定到特定的 React 版本。
2021-06-08 20:00:05
这应该是正确的答案,因为接受的答案不适用于非 React 组件的元素,例如<marquee>, 或WebComponents
2021-06-11 20:00:05

看起来这些非标准属性已经添加到 React 中了

itemProp: MUST_USE_ATTRIBUTE, // Microdata: http://schema.org/docs/gs.html
itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, // Microdata: http://schema.org/docs/gs.html
itemType: MUST_USE_ATTRIBUTE, // Microdata: http://schema.org/docs/gs.html

请注意,属性中间有大写字母:

<div itemProp="whatever..." itemScope itemType="http://schema.org/Offer">

结果将生成适当的小写属性。

嗨@reggie-pharkle - 我真的很想知道在哪里可以了解更多关于如何使用这些非标准属性的信息。谢谢!
2021-06-04 20:00:05
我们如何在反应中使用这些?我可以将标签 <div itemscope itemtype="http://schema.org/Article" className="hidden"><div itemprop="headline">{this.props.data.question} - on dialectic.sg</div> </div>放入 react render() 吗?
2021-06-17 20:00:05
只是要清楚 itemScope 和 ItemType 是 cammelCase
2021-06-17 20:00:05

你应该能够做到componentDidMount

...
componentDidMount: function() {
  if (this.props.itemtype) {
    this.getDOMNode().setAttribute('itemscope', true)
    this.getDOMNode().setAttribute('itemtype', this.props.itemtype)
  }

  if (this.props.itemprop) {
    this.getDOMNode().setAttribute('itemprop', this.props.itemprop)
  }
}
...

为方便起见,可以将整个微数据属性检查包装到一个 mixin 中。 这种方法的问题在于它不适用于内置的 React 组件(由 创建的组件React.DOM. 更新:仔细观察React.DOM,我想出了这个http://plnkr.co/edit/UjXSveVHdj8T3xnyhmKb?p=preview基本上,我们使用 mixin 将内置组件包装在自定义组件中。由于您的组件是基于 React 的内置 DOM 组件构建的,因此无需在组件中包含 mixin 就可以工作。

真正的解决方案是注入自定义配置而不是 React 的DefaultDOMPropertyConfig,但是我找不到以直接方式执行此操作的方法(DOMProperty被module系统隐藏)。

看来他们是实际尝试在得到这个现在
2021-05-24 20:00:05
我们(react 团队)正在寻找在运行时使其可注入的选项,以便人们可以使用自定义 DOM 属性。同时,这是最好的选择,除非您想使用自定义构建。
2021-05-26 20:00:05
保罗 我不认为你可以向我们通报你们在这方面取得的任何进展?谢谢
2021-06-01 20:00:05

对于那些仍在寻找答案的人:https : //facebook.github.io/react/docs/tags-and-attributes.html

例子:

<div itemScope itemType="http://schema.org/Article"></div>
您能否更新已过期或已停止使用的链接。
2021-06-13 20:00:05

到目前为止,我发现的最好的方法是基于一些 Amp 互操作代码这些代码链接自关于该主题的 react 的错误跟踪器线程的评论我稍微修改了它以使用较新版本的 React (15.5.4) 和 TypeScript。

对于常规 ES6,您可以删除 attributeName 的类型注释。在 TS 中需要使用 require ,因为 DOMProperty 没有在 react 的 index.d.ts 中公开,但再次导入可以在常规 ES6 中使用。

// tslint:disable-next-line:no-var-requires
const DOMProperty = require("react-dom/lib/DOMProperty");
if (typeof DOMProperty.properties.zz === "undefined") {
    DOMProperty.injection.injectDOMPropertyConfig({
        Properties: { zz: DOMProperty.MUST_USE_ATTRIBUTE },
        isCustomAttribute: (attributeName: string) => attributeName.startsWith("zz-")
    });
}

现在您可以使用任何以 zz- 开头的属性

<div zz-context="foo" />

通常,像这样使用 react 的内部部分是一个坏主意,但我认为它比任何其他方法都要好。它的工作方式与现有的开放式属性(如数据)相同,并且 JSX 在 TS 中甚至是类型安全的。我相信 React 的下一个主要版本无论如何都会废除白名单,所以希望在我们完全删除这个 shim 之前不需要更改。

我试过这个,但没有成功。这仍然对你有用吗?
2021-06-05 20:00:05