折旧

本页提供了有关折旧API的原理和使用的全面指南。有关介绍,请查看区块弃用基础教程可以在上找到开发者博客.

更新静态块标记和属性时,块作者需要考虑使用其块的旧版本的现有发布。要提供良好的升级路径,您可以选择以下策略之一:

  • 不要弃用块并创建一个新块(使用不同的名称)
  • 提供块的“弃用”版本,允许用户在块编辑器中打开这些块,以使用更新的块进行编辑。

一个块可以有几个不推荐使用的版本。如果已解析块的当前状态无效,或者如果弃用定义了符合条件返回true的函数。

折旧并不像其他软件数据更新(如数据库迁移)那样作为一个更新链进行操作。乍一看,很容易认为每次折旧都会对数据进行所需的更改,然后将此块的新形式交给下一次折旧进行更改。相反,情况是:

  1. 如果电流节约方法不会生成有效的块,deprecations数组中的第一个deprecation将传递给原始保存的内容。
  2. 如果是节约方法生成有效的内容,此弃用用于解析块属性。如果它有迁移方法,它也将使用deprecation解析的属性运行。
  3. 如果第一次折旧节约方法不会生成有效的块。在遇到生成有效块的方法之前,将尝试数组中的后续弃用。
  4. 然后,从第一次弃用到生成有效块的属性和任何innerBlock都被传递回当前节约方法为块生成新的有效内容。
  5. 此时,当前块应处于有效状态,弃用工作流将停止。

重要的是要注意,如果节约方法未生成有效块,则完全跳过它,包括它的迁移方法,即使符合条件将为给定属性返回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>;},},],} );

在上面的例子中,我们更新了块,使其使用具有标题而不是标题属性的内部段落块。

以上是块弃用的示例。有关更多真实示例,请查看核心块库。核心块已跨版本更新,包含简单和复杂的弃用。