本页提供了有关折旧API的原理和使用的全面指南。有关介绍,请查看区块弃用基础教程可以在上找到开发者博客.
更新静态块标记和属性时,块作者需要考虑使用其块的旧版本的现有发布。要提供良好的升级路径,您可以选择以下策略之一:
- 不要弃用块并创建一个新块(使用不同的名称)
- 提供块的“弃用”版本,允许用户在块编辑器中打开这些块,以使用更新的块进行编辑。
一个块可以有几个不推荐使用的版本。如果已解析块的当前状态无效,或者如果弃用定义了符合条件
返回true的函数。
折旧并不像其他软件数据更新(如数据库迁移)那样作为一个更新链进行操作。乍一看,很容易认为每次折旧都会对数据进行所需的更改,然后将此块的新形式交给下一次折旧进行更改。相反,情况是:
- 如果电流
节约
方法不会生成有效的块,deprecations数组中的第一个deprecation将传递给原始保存的内容。
- 如果是
节约
方法生成有效的内容,此弃用用于解析块属性。如果它有迁移
方法,它也将使用deprecation解析的属性运行。
- 如果第一次折旧
节约
方法不会生成有效的块。在遇到生成有效块的方法之前,将尝试数组中的后续弃用。
- 然后,从第一次弃用到生成有效块的属性和任何innerBlock都被传递回当前
节约
方法为块生成新的有效内容。
- 此时,当前块应处于有效状态,弃用工作流将停止。
重要的是要注意,如果节约
方法未生成有效块,则完全跳过它,包括它的迁移
方法,即使符合条件
将为给定属性返回true。这意味着,如果您对一个块进行了多次弃用,并希望执行新的迁移,如将内容移动到内部块
,您可能需要更新迁移
方法,以便将所需的更改应用于该块的所有早期版本。
同样重要的是要注意,如果节约
方法从其他文件导入其他函数,对这些文件的更改可能会意外更改弃用行为。您可能希望将这些函数的快照副本添加到弃用文件中,而不是导入它们,以避免无意中破坏弃用。
对于具有多个弃用的块,可以更容易地将每个弃用保存为具有其应用的块版本的常量,然后将这些常量添加到块的已弃用
数组。数组中的弃用应按时间倒序排列。这允许块编辑器尝试首先应用最新的和可能的弃用,避免不必要的昂贵处理。
例子
常量v1={};常数v2={};常数v3={};const deprecated=[v3,v2,v1];
还建议保留固定装置它包含块内容的不同版本,允许您轻松测试新的弃用和迁移是否适用于块的所有以前版本。
折旧在块类型上定义为已弃用
属性,一个弃用对象数组,其中每个对象的格式为:
属性
(目标):属性定义块的弃用形式。
支架
(目标):支持定义块的弃用形式。
节约
(功能):保存实现块的弃用形式。
迁移
:(功能,可选)。给定旧属性和内部块后,期望返回新属性或属性元组数组以及与块兼容的内部块的函数。如上所述,折旧迁移
将不会运行节约
函数不返回有效块,因此您需要确保迁移在所有相关的弃用中都可用。
- 参数
- 返回
对象|数组
:更新的块属性或元组数组[属性,内部块]
.
符合条件
:(功能,可选)。返回真的
如果弃用可以处理块迁移,即使块是有效的。如果一个块在技术上是有效的,即使不推荐使用,但仍然需要更新其属性或内部块,那么它特别有用。此函数是不当以前所有弃用的保存函数的结果无效时调用。
- 参数
属性
:在应用块类型代码之前,从序列化HTML解析的原始块属性。
内部块
:块的当前内部块。
数据
:包含表示块节点及其结果块对象的特性的对象。
数据块节点
:解析序列化HTML后块的原始形式。
数据块
:块对象,它是将块类型应用于块节点
.
- 返回
值得注意的是属性
,支架
、和节约
不会自动从当前版本继承,因为它们会影响块的解析和序列化,所以必须在弃用对象上定义它们,以便在迁移期间进行处理。
例子
const{registerBlockType}=wp.blocks;常量属性={文本:{type:'字符串',默认值:'一些随机值',},};常量支持={className:false,};registerBlockType('gutenberg/block-with-deprecated-version'{// ... 此处显示其他块属性属性,支撑件,保存(道具){return<div>{props.attributes.text}</div>;},已弃用:[{属性,支撑件,保存(道具){return<p>{props.attributes.text}</p>;},},],} );
在上面的示例中,我们更新了块的标记以使用div公司
而不是第页
.
有时,需要更新属性集以重命名或修改旧属性。
例子
const{registerBlockType}=wp.blocks;registerBlockType('gutenberg/block-with-deprecated-version'{// ... 此处显示其他块属性属性:{内容:{type:'字符串',默认值:'一些随机值',},},保存(道具){return<div>{props.attributes.content}</div>;},已弃用:[{属性:{文本:{type:'字符串',默认值:'一些随机值',},},迁移({text}){返回{内容:文本,};},保存(道具){return<p>{props.attributes.text}</p>;},},],} );
在上面的示例中,我们更新了块的标记以使用div公司
而不是第页
并重命名文本
属性到内容
.
在迁移块时,可能存在需要添加或删除innerBlocks的情况。
例如:块希望将标题属性迁移到段落innerBlock。
例子
const{registerBlockType}=wp.blocks;registerBlockType('gutenberg/block-with-deprecated-version'{// ... 块属性转到此处保存(道具){return<p>{props.attributes.title}</p>;},已弃用:[{属性:{标题:{type:'字符串',源:'html',选择器:'p',},},迁移(属性,内部块){const{title,…restAttributes}=属性;返回[rest属性,[createBlock('核心/段落'{内容:attributes.title,fontSize:'大',} ),…内部块,],];},保存(道具){return<p>{props.attributes.title}</p>;},},],} );
在上面的例子中,我们更新了块,使其使用具有标题而不是标题属性的内部段落块。
以上是块弃用的示例。有关更多真实示例,请查看核心块库。核心块已跨版本更新,包含简单和复杂的弃用。