如何在Reaction JS/Gutenberg中使用wp.hooks.addAction()?

时间:2019-05-06 作者:Siddharth Thevaril

我能够成功使用wp.hooks.applyFilters()wp.hooks.addFilter(), 但我无法使用wp.hooks.addAction(). 但是console.log() 在某个操作的回调中运行良好。这是我的代码:

import { createHooks } from \'@wordpress/hooks\';

let globalHooks = createHooks();

const Header = () => {
    return (
        <h1>Header Component</h1>
    );
}

const RevisedHeader = () => {
    return (
        <h1>Revised Header Component</h1>
    )
}

export default class App extends Component {

    constructor( props ) {
        super();

        globalHooks.addFilter( \'replace_header\', \'revisedHeaderCallback\', this.revisedHeaderCallback );
        globalHooks.addAction( \'after_replace_header\', \'afterRevisedHeaderCallback\', this.afterRevisedHeaderCallback );
    };

    revisedHeaderCallback( header ) {
        return <RevisedHeader />;
    }

    afterRevisedHeaderCallback() {
        return <RevisedHeader />;
    }

    render() {

        return(
            <div className="App">
                { globalHooks.applyFilters( \'replace_header\', <Header /> ) }
                { globalHooks.doAction( \'after_replace_header\' ) }
            </div>
        );
    }
}

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

如何使用wp.hooks.addAction?

基本上是这样的,就像您尝试的那样:

// Hook to the hook_name action.
wp.hooks.addAction( \'hook_name\', \'namespace\', function(){
    console.log( \'Foo Bar\' );
} );

// Trigger the hook_name action.
wp.hooks.doAction( \'hook_name\' );
或者对于向回调提供一个或多个参数的挂钩:

// Hook to the hook_name action.
wp.hooks.addAction( \'hook_name\', \'namespace\', function( a, b ){
    console.log( a, b );
} );

// Trigger the hook_name action.
wp.hooks.doAction( \'hook_name\', \'foo\', [ \'bar\', \'boo\' ] );
我能够成功使用wp.hooks.applyFilters()wp.hooks.addFilter(), 但我无法使用wp.hooks.addAction().

The problem is not with your code, 但这是因为wp.hooks.applyFilters 作用wp.hooks.doAction 只返回nothing或返回undefined:

此处返回一个元素,然后对该元素进行反应:

{ globalHooks.applyFilters( \'replace_header\', <Header /> ) }
如上所述,将呈现一个元素:

{ <RevisedHeader /> }
undefined 始终返回,因此不会渲染任何元素:

{ globalHooks.doAction( \'after_replace_header\' ) }
{ globalHooks.doAction( \'after_replace_header\', <Header /> ) }
上述解释为“没有任何好处”:

{ undefined }
wp.hooks.doAction 始终返回undefined 即使你的afterRevisedHeaderCallback 函数实际返回一个元素或组件。

因此,使用globalHooks.applyFilters (或者更确切地说wp.hooks.applyFilters) 如果希望这样渲染React元素/组件,请执行以下操作:

{ globalHooks.applyFilters( \'hook_name\', <FooBar /> ) }

更新

那么doAction()的作用是什么?用例是什么?

去做你想做的事情以外的其他事情-{ globalHooks.doAction( \'after_replace_header\' ) } (此处尝试渲染元素或组件)。因此,您可以执行AJAX请求,修改对象(例如Array), 等等。你也可以跑步ReactDOM.render 从通过连接的回调wp.hooks.addAction, 但是(您可能已经知道)元素容器必须已经连接到DOM。但有一件事是肯定的,wp.hooks.doAction 始终返回undefined.

Example for modifying an object

回调(在组件中):

afterRevisedHeaderCallback( arr ) {
    arr.push( \'bar\' );
}
它挂在这里:

globalHooks.addAction( \'after_replace_header\', \'afterRevisedHeaderCallback\', this.afterRevisedHeaderCallback );
您的组件render 方法:

render() {
    let a = [ \'foo\' ];
    globalHooks.doAction( \'after_replace_header\', a );

    return(
        <div className="App">
            { globalHooks.applyFilters( \'replace_header\', <Header /> ) }
            { a.join(\', \') }
        </div>
    );
}

更新2

就像WordPress中的PHP一样,do_action_ref_arraydo_action 不返回任何内容/NULL, 但是apply_filters_ref_arrayapply_filters 两者都将回调返回的内容返回给过滤器/挂钩,是的,可以是NULL.

如果你对undefined 返回人wp.hooks.doAction, 然后查看来源here.

根据中的示例更新3UPDATE 在上面,您实际上可以这样渲染元素/组件。。。

回调(在组件中):

afterRevisedHeaderCallback( arr ) {
//  arr = [ <RevisedHeader /> ]; // doesn\'t work
    arr[0] = <RevisedHeader />;  // works fine
}
您的组件render 方法:

render() {
    let el = [ <Header /> ];
    globalHooks.doAction( \'after_replace_header\', el );

    return(
        <div className="App">
            { globalHooks.applyFilters( \'replace_header\', <Header /> ) }
            { el }
        </div>
    );
}
我想你能理解这种方法的诀窍吗?

SO网友:mujuonly

JS中的applyFilters

(function( $ ) {
    \'use strict\';
    $(function() {

        var cars = wp.hooks.applyFilters( \'carlist\', ["Saab", "Volvo", "BMW"]);
        console.log("cars======="+cars);

    });
})( jQuery );
排队addFilter

function wpdocs_scripts_method() {
    $src = \'jQuery(document).ready(function($) { wp.hooks.addFilter( "carlist", "carlist", function(cars){ var cars = ["Benz"];  return cars; }); });\';
    wp_add_inline_script( \'jquery\', $src );

}
add_action( \'admin_enqueue_scripts\', \'wpdocs_scripts_method\' );
检查控制台中的日志

相关推荐

用短码替换整个标记--JavaScript

如果标记文本等于一个值,我试图用一个短代码替换整个标记。我正在将此脚本放入页面的页脚。以下是我正在尝试的:var stockcounter = document.getElementsByClassName(\"stock in-stock\"); if(stockcounter[0].innerHTML==\'0 in stock\') { //Displays timer stockcounter[0].outerHTML = do_shortcode