You are viewing the documentation for an older version of Preact. Switch to the current version.
与 React 的不同之处
Preact 本身并没有去重新实现一遍 React。它有些不同之处。大部份的不同都是很细微的,而且可以完全通过 preact-compat 去掉。这是一个轻量级的在 Preact 的基础上,尝试 100% 去实现 React 的接口。
Preact 没尝试去包括 React 的每一个特性,是因为它想保持 轻量 而 专注 —— 否则,给 React 项目提交优化方案会更为明智,而 React 本身也已经是一个非常复杂和良好设计的代码库。
版本兼容
对于 Preact 和 preact-compat, 版本兼容通过 current 和 previous 主要的 React 发布去衡量。当新的特性被 React 团队公布的时候,若考虑到 [项目目标] 也非常合理,它们可能会被添加到 Preact 的核心当中。这是一个相对民主的迭代过程,持续通过公开的使用 issues 和 pull request 来进行的讨论和决策。
因此,当讨论兼容性和比较的时候,官网和文档会指明 React
0.14.x
和15.x
。
被包含的特性
- [ES6 类]
- 类提供一个丰富表现力的途径去定义具有状态的组件
- [高阶组件]
- 组件在
render()
中返回其它组件,一个高效的封装
- 组件在
- [无状态的纯函数式组件]
- 接收
props
作为参数并返回 JSX/VDOM 的函数
- 接收
- [场景]: 从 Preact 3.0 起 支持
context
context
是 React 实验性的特性,但许多库都已经采纳了
- Refs: 从 Preact 4.0 起支持 函数 refs 引用。字符串 refs 引用在
preact-compact
中支持- Refs 提供一个办法去引用被渲染的元素和子组件
- 虚拟 DOM 比较
h()
,一个更为通用的React.createElement
实现版本- 这是一个通常被称作 hyperscript 的概念,而且它的价值远比 React 的生态强, 所以 Preact 发扬了它本来的规范. (请阅读: why
h()
?) - 而且它更可读一些:
h('a', { href:'/' }, h('span', null, 'Home'))
- 这是一个通常被称作 hyperscript 的概念,而且它的价值远比 React 的生态强, 所以 Preact 发扬了它本来的规范. (请阅读: why
新增特性
Preact 实际上添加了几个更为便捷的特性,灵感源于 React 的社区
this.props
和this.state
帮你传进了render()
作为参数- 你仍然可以手动地去引用它们,但这个特性更为简洁,尤其是做 [赋值解构] 的时候
- Linked State 当 inputs 输入框改变的时候,会自动更新状态 state
- 批量 DOM 更新,
setTimeout(1)
进行函数节流 使用 (也可以使用 requestAnimationFrame) - 你可以只用
class
作为 CSS 的类。className
也仍然被支持, 但推荐使用class
- 组件和元素循环使用 / 存入池中
缺少特性
- PropType 验证:并非所有人使用 PropTypes,所以它们并非 Preact 的核心
- *PropTypes * 被 preact-compat 完整支持, 或者你可以手动使用它们
- Children: 在 Preact 中并非必要的, 因为
props.children
总是一个数组.React.Children
已在 preact-compat 中得到完整支持.
- Synthetic Events: Preact 的浏览器支持并不需要这个开销
- 一个事件的完整实现意味着更多的维护和性能的考虑,以及更庞大的 API
有什么区别?
Preact 和 React 还有一些细微的差别:
render()
接受第三个参数,这是会被_替换_的根节点,否则,如果没有这个参数,Preact 默认追加。这个将来的版本可能会有小的调整,可能会改成默认替换。