块编辑器开发文档

@wordpress/reusable-blocks

💡 云策文档标注

概述

@wordpress/reusable-blocks 是一个实验性模块,提供可重用块(Reusable Blocks)的组件和逻辑支持。它通过集成到 BlockEditorProvider 和提供 Redux 操作,帮助开发者在 WordPress 编辑器中管理和使用可重用块。

关键要点

  • 安装方式:使用 npm install @wordpress/reusable-blocks --save,并确保运行环境支持 ES2015+,否则需包含 @wordpress/babel-preset-default 的 polyfill。
  • 核心功能:通过 __experimentalReusableBlocks 设置使可重用块在插入器中可用,并使用 ReusableBlocksMenuItems 组件添加管理功能。
  • 实用工具:提供 Redux store 和 actions,如 __experimentalConvertBlockToStatic、__experimentalConvertBlocksToReusable 和 __experimentalDeleteReusableBlock,用于转换和删除可重用块。
  • 项目背景:作为 Gutenberg 项目的一部分,以 monorepo 形式组织,贡献者需参考项目的主要贡献指南。

代码示例

import { ReusableBlocksMenuItems } from '@wordpress/reusable-blocks';
import { store as reusableBlocksStore } from '@wordpress/reusable-blocks';

const { __experimentalReusableBlocks } = useSelect( ( select ) =>
    select( 'core' ).getEntityRecords( 'postType', 'wp_block' )
);

return (
    <BlockEditorProvider
        value={ blocks }
        onInput={ onInput }
        onChange={ onChange }
        settings={ {
            ...settings,
            __experimentalReusableBlocks,
        } }
        { ...props }
    >
        <ReusableBlocksMenuItems />
        { children }
    </BlockEditorProvider>
);

注意事项

此模块为实验性功能,API 可能不稳定,建议在开发环境中谨慎使用,并关注 Gutenberg 项目的更新。


📄 原文内容

Reusable blocks components and logic.

Installation

Install the module

npm install @wordpress/reusable-blocks --save

This package assumes that your code will run in an ES2015+ environment. If you’re using an environment that has limited or no support for such language features and APIs, you should include the polyfill shipped in @wordpress/babel-preset-default in your code.

How it works

This experimental module provides support for reusable blocks.

Reusable blocks are WordPress entities and the following is enough to ensure they are available in the inserter:

const { __experimentalReusableBlocks } = useSelect( ( select ) =>
    select( 'core' ).getEntityRecords( 'postType', 'wp_block' )
);

return (
    <BlockEditorProvider
        value={ blocks }
        onInput={ onInput }
        onChange={ onChange }
        settings={ {
            ...settings,
            __experimentalReusableBlocks,
        } }
        { ...props }
    />
);

With the above configuration management features (such as creating new reusable blocks) are still missing from the editor. Enter @wordpress/reusable-blocks:

import { ReusableBlocksMenuItems } from '@wordpress/reusable-blocks';

const { __experimentalReusableBlocks } = useSelect( ( select ) =>
    select( 'core' ).getEntityRecords( 'postType', 'wp_block' )
);

return (
    <BlockEditorProvider
        value={ blocks }
        onInput={ onInput }
        onChange={ onChange }
        settings={ {
            ...settings,
            __experimentalReusableBlocks,
        } }
        { ...props }
    >
        <ReusableBlocksMenuItems />
        { children }
    </BlockEditorProvider>
);

This package also provides convenient utilities for managing reusable blocks through redux actions:

import { store as reusableBlocksStore } from '@wordpress/reusable-blocks';

function MyConvertToStaticButton( { clientId } ) {
    const { __experimentalConvertBlockToStatic } = useDispatch(
        reusableBlocksStore
    );
    return (
        <button
            onClick={ () => __experimentalConvertBlockToStatic( clientId ) }
        >
            Convert to static
        </button>
    );
}

function MyConvertToReusableButton( { clientId } ) {
    const { __experimentalConvertBlocksToReusable } = useDispatch(
        reusableBlocksStore
    );
    return (
        <button
            onClick={ () =>
                __experimentalConvertBlocksToReusable( [ clientId ] )
            }
        >
            Convert to reusable
        </button>
    );
}

function MyDeleteReusableBlockButton( { id } ) {
    const { __experimentalDeleteReusableBlock } = useDispatch(
        reusableBlocksStore
    );
    return (
        <button onClick={ () => __experimentalDeleteReusableBlock( id ) }>
            Delete reusable block
        </button>
    );
}

Contributing to this package

This is an individual package that’s part of the Gutenberg project. The project is organized as a monorepo. It’s made up of multiple self-contained software packages, each with a specific purpose. The packages in this monorepo are published to npm and used by WordPress as well as other software projects.

To find out more about contributing to this package or Gutenberg as a whole, please read the project’s main contributor guide.