You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保WordPress自定义Store仅被注册一次?

问题描述

我创建了custom-store.js文件,通过自定义Store从API获取数据,该Store被多个组件引用。但前端控制台多次出现警告:

data.min.js?ver=7c62e39…:2 Store "custom-store/counter" is already registered.
data.min.js?ver=7c62e39…:2 Store "custom-store/counter" is already registered.
...

我需要确保custom-store.js仅被注册一次,组件中调用数据的代码如下:

import counterStore from '../../store/custom-store.js';

const recipes = useSelect((select) => select(counterStore).getRecipe());

当前custom-store.js的代码存在无效的注册判断,导致重复注册:

import { createReduxStore, register } from '@wordpress/data';
...

const STORE_NAME = 'custom-store/counter';

...
...

const store = createReduxStore(STORE_NAME, {
    reducer,
    actions,
    selectors,
});

// 此代码无效:
const checkStore = select(STORE_NAME);
if (checkStore && typeof checkStore.getIcons !== 'function') {
    register(store);
}

register(store);

export default store;
解决方案

重复警告的核心原因是每次导入模块时都会执行register(store),且原有判断逻辑错误(未正确导入select,且未注册时select(STORE_NAME)返回undefined)。正确做法是利用@wordpress/data提供的hasStore方法判断Store是否已注册,仅在未注册时执行注册:

修改后的custom-store.js代码:

import { createReduxStore, register, hasStore } from '@wordpress/data';
...

const STORE_NAME = 'custom-store/counter';

...
...

const store = createReduxStore(STORE_NAME, {
    reducer,
    actions,
    selectors,
});

// 检查Store是否已注册,仅未注册时执行注册
if ( !hasStore( STORE_NAME ) ) {
    register( store );
}

export default store;

补充说明

  • ES模块本身是单例模式,custom-store.js只会被解析执行一次,但问题出在模块内的注册逻辑未加判断,导致每次导入都尝试注册。
  • 组件中的导入方式无需修改,多次导入不会重复执行模块代码,只会复用同一个导出的store对象。

内容的提问来源于stack exchange,提问作者Studio Wai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:05:01