安装
npm install@wordpress/data--保存
注册存储
从“@wordpress/api-fetch”导入apiFetch; 从“@wordpress/data”导入{createReduxStore,register}; 常量DEFAULT_STATE={ 价格:{}, 折扣百分比:0, }; 常量操作={ setPrice(项目、价格){ 返回{ 类型:'SET_PRICE', 项目, 价格, }; }, 开始销售(折扣百分比){ 返回{ 类型:“START_SALE”, 折扣百分比, }; }, fetchFromAPI(路径){ 返回{ 类型:“FETCH_FROM_API”, 路径, }; }, }; const store=createReduxStore('my-shop'{ 减速器(状态=DEFAULT_state,动作){ 开关(action.type){ 案例“SET_PRICE”: 返回{ …状态, 价格:{ …州价格, [action.item]:action.price, }, }; 案例“START_SALE”: 返回{ …状态, discountPercent:操作.discountPerson, }; } 返回状态; }, 行动, 选择器:{ getPrice(状态,项){ const{prices,discountPercent}=状态; 常量价格=价格[项目]; 回报价格*(1-0.01*discountPercent); }, }, 控件:{ FETCH_FROM_API(动作){ return apiFetch({path:action.path}); }, }, 解析器:{ *getPrice(项){ const路径='/wp/v2/prices/'+item; const price=收益actions.fetchFromAPI(路径); return actions.setPrice(item,price); }, }, } ); 寄存器(存储);
名称 ( 一串 )–商店名称 实例化 ( 功能 )–它返回一个 类似Redux的存储对象 使用以下方法:
重做存储选项
减速器
行动
选择器
解析器
控制
initialState(初始状态)
普通商店
获取选择器() :返回预先映射到存储区的选择器函数对象。 获取操作() :返回预先映射到存储区的操作函数对象。 订阅(侦听器:函数) :注册在状态值发生变化时调用的函数。 表现为Redux 订阅 具有以下区别: 不必实现退订,因为注册表从不使用它。 -只需支持一个侦听器(注册表)。
从“@wordpress/data”导入{register}; 从“导入现有选择器/ 现有应用程序/选择器; 从“导入现有操作/ 现有应用程序/操作'; 从“导入createStore/ 现有应用程序/商店'; const reduxStore=创建存储(); const mapValues=(obj,回调)=> Object.entries(obj).reduce( (acc,[键,值])=>({ …根据, [key]:回调(value), } ), {} ); const boundSelectors=映射值( 现有选择器, (选择器)=> (…args)=> 选择器(reduxStore.getState()。。。 参数) ); const boundActions=映射值( 现有操作, (动作)=> (…参数)=> reduxStore.dispatch(操作(…args)) ); const通用存储={ name:'现有应用程序', 实例化:()=>({ getSelectors:()=>boundSelectors, getActions:()=>绑定操作, 订阅:reduxStore.subscribe, } ), }; 寄存器(genericStore);
从“@wordpress/data”导入{register}; 函数customStore(){ 返回{ name:'自定义数据', 实例化:()=>{ const监听器=new Set(); 常量价格={hammer:7.5}; 函数storeChanged(){ for(const listener of listeners){ 侦听器(); } } 函数订阅(侦听器){ listeners.add(监听器); return()=>listeners.delete(listener); } 常量选择器={ getPrice(itemName){ 退货价格[itemName]; }, }; 常量操作={ setPrice(项目名称,价格){ prices[itemName]=价格; storeChanged(); }, }; 返回{ getSelectors:()=>选择器, getActions:()=>操作, 订阅, }; }, }; } 寄存器(customStore);
与Redux的比较
在Redux中 订阅 侦听器在每次调度时都被调用,而不管状态的值是否已更改。 在 @文字新闻/数据 ,只有在状态发生更改时才调用订户。
在React Redux中 将状态映射到属性 函数必须返回一个对象。 在 @文字新闻/数据 ,一个 使用Select 映射函数可以返回 未定义 如果它没有可以注射的道具。
在React Redux中 将调度映射到属性 自变量可以定义为对象或函数。 在 @文字新闻/数据 ,的 带Dispatch 高阶组件创建者必须传递一个函数。
美国石油学会
异步模式提供程序
从“@wordpress/data”导入{useSelect,AsyncModeProvider}; 从“@wordpress/block editor”导入{store as blockEditorStore}; 函数BlockCount(){ 常量计数=useSelect((select)=>{ return select(blockEditorStore).getBlockCount(); }, [] ); 返回计数; } 函数App(){ 返回( <AsyncModeProvider值={true}> <块计数/> </AsyncModeProvider> ); }
道具.value 布尔值 :启用异步模式。
组件 :要渲染的组件。
组合减速器
从“@wordpress/data”导入{combineReducers,createReduxStore,register}; 常量价格=(状态={},操作)=>{ return action.type===“SET_PRICE” ? { …状态, [操作项目]:操作价格, } :状态; }; const discountPercent=(state=0,action)=>{ return action.type===“START_SALE”? action.discountPercent:状态; }; const store=createReduxStore('my-shop'{ 减速器:组合减速器({ 价格, 折扣百分比, } ), } ); 寄存器(存储);
import('./types').combineReducers
减速器 对象 :一个对象,其值对应于需要组合为一个的不同的归约函数。
功能 :调用reducers对象内的每个reducer,并构造具有相同形状的状态对象的reducer。
控制
创建ReduxStore
从“@wordpress/data”导入{createReduxStore}; const store=createReduxStore(“演示”{ reducer:(state='OK')=>状态, 选择器:{ getValue:(state)=>状态, }, } );
钥匙 一串 :唯一的命名空间标识符。 选项 ReduxStoreConfig<状态、操作、选择器> :注册的存储选项,其属性描述了reducer、actions、selector和resolver。
StoreDescriptor<ReduxStoreConfig<状态、操作、选择器>> :存储对象。
创建注册表
存储配置 对象 :初始存储配置。 起源 目标? :父注册表。
WP数据注册表 :数据注册表。
创建注册表控件
(action)=>iteratorOrPromise;
(注册表)=>(action)=>iteratorOrPromise;
注册表控件 功能 :函数接收注册表对象并返回控件。
功能 :可以在存储中注册的注册表控件。
创建注册表选择器
(state,…selectorArgs)=>结果;
(选择)=> (状态,…selectorArgs)=> 结果;
从“@wordpress/core-data”导入{store as coreStore}; 从“@wordpress/editor”导入{store as editorStore}; const getCurrentPostId=createRegistrySelector((select)=>(state)=>{ return select(editorStore).getCurrentPostId(); } ); const getPostEdits=创建注册表选择器((select)=>(state)=>{ //像调用其他函数一样调用另一个注册表选择器 const postType=getCurrentPostType(状态); const postId=getCurrentPostId(状态); return select(coreStore).getEntityRecordEdits( “postType”, 职位类型, 帖子Id ); } );
注册表选择器 功能 :接收注册表的函数 选择 函数并返回状态选择器。
功能 :可以在存储中注册的注册表选择器。
创建选择器
的文档 记忆 从中 创建选择器 函数被重新导出。
选择器 功能 :从状态和参数计算值的选择器函数。 获取受抚养人 功能 :返回“从属”对象数组的函数。
功能 :的备忘录版本 选择器 缓存计算的返回值的。
派遣
从“@wordpress/data”导入{dispatch}; 从“my-custom-store”导入{store as myCustomStore}; dispatch(myCustomStore).setPrice('hammer',9.75);
存储名称或描述符 商店名称或描述符 :存储描述符。 还支持传递存储名称的传统调用约定。
调度返回<StoreNameOrDescriptor> :包含动作创建者的对象。
插件
对象
登记
从“@wordpress/data”导入{createReduxStore,register}; const store=createReduxStore(“演示”{ 减速器:(state='OK')=>状态, 选择器:{ getValue:(state)=>状态, }, } ); 寄存器(存储);
商店 店面描述人 :存储描述符。
寄存器GenericStore
已弃用 使用
寄存器(storeDescriptor) 而不是。
名称 一串 :存储注册表名称。 商店 对象 :存储实例( {获取选择器,获取操作,订阅} ).
寄存器存储
已弃用 使用
登记 而不是。
商店名称 一串 :存储的唯一命名空间标识符。 选项 对象 :存储描述(减速机、操作、选择器、解析器)。
对象 :已注册的存储对象。
注册消费者
导入{ 注册提供者, 注册消费者, 创建注册表 }来自'@wordpress/data'; const注册表=创建注册表({}); 常量应用程序=({props})=>{ return<RegistryProvider value={registry}> 你好 <注册消费者> {(注册表)=>( <组件使用注册表 {…道具} registry={registry} ) } </RegistryConsumer> </RegistryProvider> }
注册表提供程序
解决选择
从“@wordpress/data”导入{resolveSelect}; 从“my-custom-store”导入{store as myCustomStore}; resolveSelect(myCustomStore).getPrice('hammer').then(console.log);
存储名称或描述符 StoreDescriptor |字符串 :存储描述符。 还支持传递存储名称的传统调用约定。
对象 :包含商店的promise-wrapped选择器的对象。
选择
从“@wordpress/data”导入{select}; 从“my-custom-store”导入{store as myCustomStore}; select(myCustomStore).getPrice(“锤子”);
存储名称或描述符 字符串|T :存储描述符。 还支持传递存储名称的传统调用约定。
当前选择器 :包含存储的选择器的对象。
订阅
从“@wordpress/data”导入{subscribe}; const unsubscribe=订阅(()=>{ //您可以利用此机会测试 //选择器随后因状态更新而更改。 } ); //稍后,如有必要。。。 取消订阅();
听众 功能 :回调函数。 存储名称或描述符 string|StoreDescriptor? :可选的存储名称。
挂起并选择
存储名称或描述符 StoreDescriptor |字符串 :存储描述符。 还支持传递存储名称的传统调用约定。
对象 :包含商店挂起的选择器的对象。
使用
插件 对象 :插件对象。
使用Dispatch
从'react'导入{useCallback}; 从“@wordpress/data”导入{useDispatch,useSelect}; 从“my-custom-store”导入{store as myCustomStore}; 功能按钮({onClick,children}){ 返回( <button type=“button”onClick={onClick}> {儿童} </按钮> ); } const SaleButton=({children})=>{ const{stockNumber}=useSelect( (select)=>选择(myCustomStore).getStockNumber(), [] ); const{startSale}=useDispatch(myCustomStore); const onClick=使用回调(()=>{ const discountPercent=stockNumber>50? 10 : 20; startSale(discountPercent); },[stockNumber]); return<Button onClick={onClick}>{children}</Button>; }; //在应用程序中的某处呈现: // //开始销售</ 销售按钮>
存储名称或描述符 [商店名称或描述符] :可以选择提供要从中检索动作创建者的存储或其描述符的名称。 如果未提供,则返回registry.dispatch函数。
使用DispatchReturn<StoreNameOrDescriptor> :自定义反作用挂钩。
使用注册表
从“@wordpress/data”导入{RegistryProvider、createRegistry、useRegistry}; const registry=createRegistry({}); const SomeChildUsingRegistry=(props)=>{ const注册表=useRegistry(); // ... 在其他反应挂钩中实现注册表的逻辑。 }; const ParentProvidengRegistry=(props)=>{ 返回( <RegistryProvider value={registry}> <SomeChildUsingRegistry{…props}/> </RegistryProvider> ); };
功能 :自定义反应挂钩公开注册表上下文值。
使用Select
从“@wordpress/data”导入{useSelect}; 从“我的自定义商店”导入{store as myCustomStore}; 功能HammerPriceDisplay({currency}){ 常量价格=useSelect( (选择)=>{ return select(myCustomStore).getPrice('hammer',currency); }, [货币] ); 返回新的Intl.NumberFormat('en-US'{ style:'货币', 货币, }).格式(价格); } //在应用程序中呈现: //<HammerPriceDisplay货币=“USD”/>
从“@wordpress/data”导入{useSelect}; 从“我的自定义商店”导入{store as myCustomStore}; 函数Paste({children}){ const{getSettings}=useSelect(myCustomStore); 函数onPaste(){ //对设置进行处理。 const settings=getSettings(); } return<div onPaste={onPaste}>{childrens}</div>; }
地图选择 T型 :在每次状态更改时调用函数。 返回的值向实现此挂钩的组件公开。 该函数接收 注册表。选择 方法和 注册表 关于第二个论点。 传递存储密钥后,将返回存储的所有选择器。 这仅用于在事件回调中使用这些选择器,而不是用于创建元素树所需的数据。 deps公司 未知[] :如果提供,此选项会将mapSelect记忆为相同 地图选择 在每次状态更改时调用,除非依赖关系更改。
使用SelectReturn :自定义反作用挂钩。
使用暂停选择
地图选择 T型 :在每次状态更改时调用函数。 使用这个钩子将返回的值公开给组件。 该函数接收 注册表.spendSelect 方法作为第一个参数 注册表 作为第二个。 deps公司 阵列 :用于存储 地图选择 所以还是一样 地图选择 在每次状态更改时调用,除非依赖关系更改。
返回类型<T> :由返回的数据对象 地图选择 功能。
带Dispatch
功能按钮({onClick,children}){ 返回( <button type=“button”onClick={onClick}> {子} </按钮> ); } 从“@wordpress/data”导入{withDispatch}; 从“my-custom-store”导入{store as myCustomStore}; const SaleButton=withDispatch((dispatch,ownProps)=>{ const{startSale}=分派(myCustomStore); const{discountPercent}=ownProps; 返回{ onClick(){ 开始销售(折扣百分比); }, }; })(按钮); //在应用程序中呈现: // //<SaleButton discountPercent=“20”>开始销售</ 销售按钮>
功能按钮({onClick,children}){ 返回( <button type=“button”onClick={onClick}> {子} </按钮> ); } 从“@wordpress/data”导入{withDispatch}; 从“my-custom-store”导入{store as myCustomStore}; const SaleButton=withDispatch((dispatch,ownProps,{select})=>{ //库存编号经常变化。 const{getStockNumber}=选择(myCustomStore); const{startSale}=分派(myCustomStore); 返回{ onClick(){ const discountPercent=getStockNumber()>50? 10 : 20; startSale(discountPercent); }, }; })(按钮); //在应用程序中呈现: // //开始销售</ 销售按钮>
将调度映射到属性 功能 :返回属性名称对象的函数,其中值为分派绑定的动作创建者,或使用组件的属性调用的函数并返回动作创建器。
组件类型 :具有合并调度程序属性的增强组件。
带注册表
原始组件 组件 :原始组件。
组件 :增强组件。
使用Select
从“@wordpress/data”导入{withSelect}; 从“my-custom-store”导入{store as myCustomStore}; 函数PriceDisplay({price,currency}){ 返回新的Intl.NumberFormat('en-US'{ style:'货币', 货币, }).格式(价格); } const HammerPriceDisplay=withSelect((select,ownProps)=>{ const{getPrice}=选择(myCustomStore); const{currency}=ownProps; 返回{ price:getPrice('hammer',currency), }; })(价格显示); //在应用程序中呈现: // //<HammerPriceDisplay货币=“USD”/>
将所选内容映射到属性 功能 :在每次状态更改时调用函数,期望返回props的对象以与组件自己的props合并。
组件类型 :具有合并状态数据属性的增强组件。
批处理
选择器以更新状态调用。 如果选择器返回的值与前一个不同(严格相等),则组件将重新呈现。
从“@wordpress/data”导入{useRegistry}; 函数Component(){ const注册表=useRegistry(); 函数回调(){ //这将只重新渲染组件一次。 registry.batch(()=>{ registry.dispatch(someStore).someAction(); registry.dispatch(someStore).someOtherAction(); } ); } return单击我; }
选择器
从“@wordpress/core-data”导入{store as coreDataStore}; 从“@wordpress/data”导入{useSelect}; 函数Component(){ const结果=useSelect((select)=>{ 常量查询={per_page:20}; const selectorArgs=['postType','page',query]; 返回{ 页面:select(coreDataStore).getEntityRecords(…selectorArgs), hasStartedResolution:选择(核心数据存储)。hasStartedResolution( 'getEntityRecords',//_selectorName_ 选择器参数 ), has Finished解决方案:选择( 核心数据存储 ).hasFinishedResolution('getEntityRecords',selectorArgs), 正在解析:选择(coreDataStore)。正在解析( '获取实体记录', 选择器参数 ), }; } ); if(结果已开始解决){ return正在获取数据; } if(结果正在解决){ 返回( <> { //显示微调器 } </> ); } if(result.hasFinishedResolution){ 返回( <> { //数据准备就绪 } </> ); } }
已完成解决
状态 州 :数据状态。 选择器名称 一串 :选择器名称。 参数 未知[]? :传递给选择器的参数。
布尔值 :解决是否已完成。
已开始解决
状态 州 :数据状态。 选择器名称 一串 :选择器名称。 参数 未知[]? :传递给选择器的参数。
布尔值 :是否已触发解决。
正在解决
状态 州 :数据状态。 选择器名称 一串 :选择器名称。 参数 未知[]? :传递给选择器的参数。
布尔值 :是否正在进行解决。
规范化选择器参数
//参数为数字 getSomeDataById(123); //参数为字符串 按Id获取数据('123');
例子
const getItemsSelector=(名称,类型,id)=>{ return state.items[name][type][id]| | null; };
//定义规范化方法。 获取项目选择器__ unstableNormalizeArgs=(args){ //第二个索引处的“id”参数 if(参数[2]和参数[2]的类型===“字符串”){ args[2]===数量(args[2]); } 返回参数; }
const getItemsSelector=(名称,类型,id)=>{ //这里的id现在保证是一个数字。 return state.items[name][type][id]| | null; }; const getItemsResolver=(名称、类型、id)=>{ //“id”在解析器中也是一个数字。 返回{}; }; registry.registerStore(“存储”{ // ... 选择器:{ getItems:getItemsSelector, }, 解析器:{ getItems:getItemsResolver, }, } ); //用正确的号码类型呼叫。 registry.select('store').getItems('foo','bar',54); //调用错误的字符串类型,**但**在这里我们避免了 //需要解析程序调用,因为“54”被保证 //通过“__unstatibleNormalizeArgs”方法强制为一个数字。 registry.select('store').getItems('foo','bar','54');