【问题标题】:What makes a React library require preact-compat?是什么让 React 库需要 preact-compat?
【发布时间】:2018-12-14 05:08:38
【问题描述】:

我注意到某些库(例如 classnames)在 Preact 中很容易使用,但其他库(例如 styled-components)需要 preact-compat

是什么让 React 库在 preact 中不受本机支持而需要使用 preact-compat?

【问题讨论】:

  • react 构建的库通常具有与react 或其依赖库相关的导入语句。为了在不修改的情况下使用preact 中的同一个库,preact-compat 提供了一个compatibility layer。像 classnames 这样的库不依赖于 react,因此它们不需要 preact-compatpreact-compat github 自述文件很好地解释了他们如何实现此兼容层。
  • 现在 preact-compat(单独的 shim 存储库)不再维护自 PreactX (v10) 及更高版本。它现在是 Preact 主要 repo 的一部分,所以你可以从 preact/compat 获取你需要的东西(注意中间的斜线):import { PureComponent, memo, forwardRef, createPortal } from 'preact/compat' preactjs.com/guide/v10/switching-to-preact

标签: reactjs preact


【解决方案1】:

免责声明:我在做 preact。

react 中有几个 API 是 preact 不需要的。但是因为已经为这些 API 开发了现有的第三方库,所以我们发布了 preact-compat,它在 preact 之上重新实现了它们。

一些例子:

Children-API:

这个 API 特别有趣,因为 preact 根本不需要它。对于preactchildren 属性始终是一个数组。

// React
Children.forEach(props.children, child => ...);
Children.map(props.children, child => ...);
Children.count(props.children);

// Preact
props.children.forEach(child => ...);
props.children.map(child => ...);
props.children.length;

unmountComponentAtNode:

这是 preact 不需要的另一个 API,因为我们可以通过渲染 null 简单地卸载任何树:

import { render } from "preact";
import App from "./app";

// Render App into dom
render(<App />, document.getElementById("root"));

// Unmount tree
render(null, document.getElementById("root"));

如果您想删除子树而不是根节点,您可以通过从组件返回 null 来实现。基本上null 总是被视为一个 empty 值。

findDOMNode:

// React
const element = React.findDOMNode(componentInstance);

// In Preact that's just a property
const element = componentInstance.base;

在我们的例子中,这甚至适用于函数组件。请注意,几乎在所有情况下,refs 都比 findDOMNode 更受欢迎。

总结: preact-compat 主要包含第三方库的填充程序,期望与 react 完全 API 兼容。

【讨论】:

    猜你喜欢
    • 2018-04-22
    • 2019-02-24
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多