可编辑的固定组件

可编辑的React组件可以“固定”,也可以硬编码到SPA视图中。 这允许开发人员将与SPA编辑器兼容的组件放置到SPA视图中,并允许用户在AEM SPA编辑器中创作组件的内容。

固定组件

在本章中,我们将主页视图的标题“Current Adventures”替换为Home.js中的硬编码文本,该标题包含固定但可编辑的标题组件。 固定组件保证标题的放置,但也允许创作标题的文本,并在开发周期之外进行更改。

更新WKND应用程序

要将​ Fixed ​组件添加到“主页”视图:

  • 创建自定义可编辑的标题组件并将它注册到项目标题的资源类型中
  • 将可编辑的标题组件放在“SPA主页”视图中

创建可编辑的React标题组件

在SPA主页视图中,将硬编码文本<h2>Current Adventures</h2>替换为自定义可编辑的标题组件。 在使用标题组件之前,我们必须:

  1. 创建自定义标题React组件
  2. 使用@adobe/aem-react-editable-components中的方法修饰自定义标题组件使其可编辑。
  3. MapTo注册可编辑的标题组件,以便稍后在容器组件中使用它。

要执行此操作:

  1. 在IDE中的~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app处打开远程SPA项目

  2. react-app/src/components/editable/core/Title.js处创建React组件

  3. 将以下代码添加到Title.js

    code language-javascript
    import React from 'react'
    import { RoutedLink } from "./RoutedLink";
    
    const TitleLink = (props) => {
    return (
        <RoutedLink className={props.baseCssClass + (props.nested ? '-' : '__') + 'link'}
            isRouted={props.routed}
            to={props.linkURL}>
        {props.text}
        </RoutedLink>
    );
    };
    
    const TitleV2Contents = (props) => {
        if (!props.linkDisabled) {
            return <TitleLink {...props} />
        }
    
        return <>{props.text}</>
    };
    
    export const Title = (props) => {
        if (!props.baseCssClass) {
            props.baseCssClass = 'cmp-title'
        }
    
        const elementType = (!!props.type) ? props.type.toString() : 'h3';
        return (<div className={props.baseCssClass}>
            {
                React.createElement(elementType, {
                        className: props.baseCssClass + (props.nested ? '-' : '__') + 'text',
                    },
                    <TitleV2Contents {...props} />
                )
            }
    
            </div>)
    }
    
    export const titleIsEmpty = (props) => props.text == null || props.text.trim().length === 0
    

    请注意,此React组件尚无法使用AEM SPA编辑器进行编辑。 此基本组件将在下一步中变为可编辑。

    阅读有关实施详细信息的代码注释。

  4. react-app/src/components/editable/EditableTitle.js处创建React组件

  5. 将以下代码添加到EditableTitle.js

    code language-javascript
    // Import the withMappable API provided bu the AEM SPA Editor JS SDK
    import { EditableComponent, MapTo } from '@adobe/aem-react-editable-components';
    import React from 'react'
    
    // Import the AEM the Title component implementation and it's Empty Function
    import { Title, titleIsEmpty } from "./core/Title";
    import { withConditionalPlaceHolder } from "./core/util/withConditionalPlaceholder";
    import { withStandardBaseCssClass } from "./core/util/withStandardBaseCssClass";
    
    // The sling:resourceType of the AEM component used to collected and serialize the data this React component displays
    const RESOURCE_TYPE = "wknd-app/components/title";
    
    // Create an EditConfig to allow the AEM SPA Editor to properly render the component in the Editor's context
    const EditConfig = {
        emptyLabel: "Title",        // The component placeholder in AEM SPA Editor
        isEmpty: titleIsEmpty,      // The function to determine if this component has been authored
        resourceType: RESOURCE_TYPE // The sling:resourceType this component is mapped to
    };
    
    export const WrappedTitle = (props) => {
        const Wrapped = withConditionalPlaceHolder(withStandardBaseCssClass(Title, "cmp-title"), titleIsEmpty, "TitleV2")
        return <Wrapped {...props} />
    }
    
    // EditableComponent makes the component editable by the AEM editor, either rendered statically or in a container
    const EditableTitle = (props) => <EditableComponent config={EditConfig} {...props}><WrappedTitle /></EditableComponent>
    
    // MapTo allows the AEM SPA Editor JS SDK to dynamically render components added to SPA Editor Containers
    MapTo(RESOURCE_TYPE)(EditableTitle);
    
    export default EditableTitle;
    

    EditableTitle React组件打包了Title React组件,并将其包装和修饰为可在AEM SPA编辑器中编辑。

使用React EditableTitle组件

现在,EditableTitle React组件已在中注册并可以在React应用程序中使用,请替换“主页”视图上的硬编码标题文本。

  1. 编辑react-app/src/components/Home.js

  2. 在底部的Home()中,导入EditableTitle并将硬编码的标题替换为新的AEMTitle组件:

    code language-javascript
    ...
    import EditableTitle from './editable/EditableTitle';
    ...
    function Home() {
        return (
            <div className="Home">
    
            <EditableTitle
                pagePath='/content/wknd-app/us/en/home'
                itemPath='root/title'/>
    
                <Adventures />
            </div>
        );
    }
    

Home.js文件应如下所示:

Home.js

在AEM中创作标题组件

  1. 登录AEM Author

  2. 导航到​ 站点> WKND应用程序

  3. 点按​ 主页 ​并从顶部操作栏中选择​ 编辑

  4. 从页面编辑器右上角的编辑模式选择器中选择​ 编辑

  5. 将鼠标悬停在WKND徽标下方和冒险列表上方的默认标题文本上,直到显示蓝色编辑大纲

  6. 点按以显示组件的操作栏,然后点按​ 扳手 ​以进行编辑

    标题组件操作栏

  7. 创作标题组件:

    • 标题: WKND冒险

    • 类型/大小: H2

      标题组件对话框

  8. 点按​ 完成 ​以保存

  9. 在AEM SPA编辑器中预览更改

  10. 刷新http://localhost:3000上本地运行的WKND应用程序,并立即反映所编写的标题更改。

    SPA中的 标题组件

恭喜!

您已将一个固定的、可编辑的组件添加到WKND应用程序! 您现在知道如何:

  • 在SPA中创建了一个固定的可编辑组件
  • 在AEM中创作固定组件
  • 在远程SPA中查看创作的内容

后续步骤

接下来的步骤是将AEM ResponsiveGrid容器组件添加到SPA,以便作者向SPA添加可编辑的组件!

recommendation-more-help
e25b6834-e87f-4ff3-ba56-4cd16cdfdec4