块更新时的事件/回调?

时间:2020-05-27 作者:jshwlkr

我正在尝试组合一个自定义块,以生成来自第三方的嵌入。嵌入是通过外部脚本扫描包含唯一标识符的数据属性的元素生成的。我有这个区块的基本版本工作得很好。但是,我现在正在尝试在您输入标识符时在编辑屏幕中动态显示此嵌入。

我的编辑功能如下所示:

function Edit( { attributes, setAttributes } ) {

    const onChangeIdentifier = (value) => {
        setAttributes({ identifier: value });
    };

    return (
        <div id = {`embed-${ instanceId }`}>
    {attributes.identifier
    ? 
        <div  
            data-identifier= { attributes.identifier }
        >

        </div>

     : 

        <Placeholder
            instructions={ __( \'Enter identifier.\' ) }
        >
            <PlainText
                placeholder={ __(
                        \'Enter identifier here…\'
                    ) }
                value={ attributes.identifier || \'\' }
                onChange={ onChangeIdentifier }
            />
    </Placeholder>

    }
    </div>);
}

export default withInstanceId( Edit );
几乎每件事都发生得很正确。当输入标识符时,它会交换数据标识符元素的占位符,但无法生成嵌入,因为第三方脚本仅在加载DOM时自动触发扫描。它们确实提供了一个函数,可以在您通过ajax创建嵌入时手动调用扫描。Here is the issue: 我不知道在哪里调用此函数以使其正确呈现嵌入。(我可以验证它是否正常工作,因为我可以编辑块并在控制台中调用该函数,并使其正确更新。)

1 个回复
最合适的回答,由SO网友:Welcher 整理而成

你可以试试useEffect 挂钩已订阅attributes.identifier 调用脚本。

类似于:

function Edit( { attributes, setAttributes } ) {

    useEffect( () => {

      // this will fire whenever the attribute changes.
      thirdPartyScriptFunctionName();

    },[attributes.identifier])

     const onChangeIdentifier = (value) => {
        setAttributes({ identifier: value });
     };

    return (
         <div id = {`embed-${ instanceId }`}>
             {attributes.identifier
         ? 
       <div  
           data-identifier= { attributes.identifier }
        >

        </div>

     : 

        <Placeholder
            instructions={ __( \'Enter identifier.\' ) }
        >
            <PlainText
                placeholder={ __(
                        \'Enter identifier here…\'
                    ) }
                value={ attributes.identifier || \'\' }
                onChange={ onChangeIdentifier }
            />
       </Placeholder>

    }
     </div>);
}

 export default withInstanceId( Edit );
你需要得到useEffect 从wp上钩住。元素全局。

希望这有帮助!

相关推荐

禁用jQuery javascript的Cloudflare Rocket Loader并使其首先加载

我使用Cloudflare Rocket Loader在我的站点上加速Javascript。问题是,它在加载jQuery本身之前加载某些需要jQuery的脚本,使它们无法正常工作。尽快禁用Rocket Loader以添加特定脚本data-cfasync=\"false\" 到<script src=\"\"> 我想知道如何将其添加到jQuery脚本中,因为Wordpress并不是简单地通过脚本标记加载jQuery。目前我的网站加载jquery-migrate.min.js 和jquery.js