如何使用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_array
和do_action
不返回任何内容/NULL
, 但是apply_filters_ref_array
和apply_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>
);
}
我想你能理解这种方法的诀窍吗?