到目前为止,我发现的最好的方法是基于一些 Amp 互操作代码,这些代码链接自关于该主题的 react 的错误跟踪线程的评论。我稍微修改了它以使用更新版本的 React (15.5.4) 和 TypeScript。
对于常规的 ES6,您可以只删除属性名称的类型注释。在 TS 中需要使用 require,因为 DOMProperty 没有在 react 的 index.d.ts 中公开,但是 import 可以在常规 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 的内部部分是个坏主意,但我认为它比任何其他方法都好。它的工作方式与现有的开放式属性(如 data-)相同,而且 JSX 在 TS 中甚至是类型安全的。我相信 react 的下一个主要版本无论如何都会取消白名单,所以希望在我们完全删除这个 shim 之前不需要进行更改。