步骤1:构建PagesList组件
函数MyFirstApp(){ const页面=[{id:“模拟”,标题:“示例页面”}] return<PagesList pages={pages}/>; } 函数PagesList({pages}){ 返回( <ul> {pages?.map(第=>页( <li key={page.id}> {页面标题} </li> ) ) } </ul> ); }
步骤2:获取数据
wp.data.select('core').getEntityRecords('postType','page')
从“@wordpress/data”导入{useSelect}; 从“@wordpress/core-data”导入{store as coreDataStore}; 函数MyFirstApp(){ const pages=使用选择( 选择=> select(coreDataStore).getEntityRecords('postType','page'), [] ); // ... } 函数PagesList({pages}){ // ... <li键={page.id}> {page.title.rentered} </li> // ... }
从“@wordpress/data”导入{useSelect}; 从“@wordpress/core-data”导入{store as coreDataStore}; 从“@wordpress/html-entities”导入{decodeEntities}; 函数MyFirstApp(){ const页面=使用选择( 选择=> select(coreDataStore).getEntityRecords('postType','page'), [] ); return<PagesList pages={pages}/>; } 函数PagesList({pages}){ 返回( <ul> {pages?.map(第=>页( <li键={page.id}> {decodeEntities(page.title.rendered)} </li> ) ) } </ul> ) }
第三步:把它变成一张桌子
函数PagesList({pages}){ 返回( <table className=“wp-list-table widefat fixed striped table-view-list”> <头部> <tr> 标题 </tr> </thead> <t车身> {pages?.map(第=>页( <tr密钥={page.id}> <td>{decodeEntities(page.title.rendered)}</td> </tr> ) ) } </tbody> </表格> ); }
步骤4:添加搜索框
从'react'导入{useState}; 从“@wordpress/components”导入{SearchControl}; 函数MyFirstApp(){ const[searchTerm,setSearchTerm]=使用状态(''); // ... 返回( <div> <搜索控制 onChange={setSearchTerm} value={searchTerm} /> {/* ... */ } </div> ) }
wp.data.select('core').getEntityRecords('postType','page',{search:'home'})
从“@wordpress/data”导入{useSelect}; 从“@wordpress/core-data”导入{store as coreDataStore}; 函数MyFirstApp(){ // ... const{pages}=useSelect(select=>{ 常量查询={}; 如果(searchTerm){ query.search=搜索术语; } 返回{ 页面:select(coreDataStore).getEntityRecords('postType','page',query) } },[searchTerm]); // ... }
从'react'导入{useState}; 从“react-dom”导入{createRoot}; 从“@wordpress/components”导入{SearchControl}; 从“@wordpress/data”导入{useSelect}; 从“@wordpress/core-data”导入{store as coreDataStore}; 函数MyFirstApp(){ const[searchTerm,setSearchTerm]=使用状态(“”); const pages=useSelect(选择=>{ 常量查询={}; if(searchTerm){ query.search=搜索术语; } return select(coreDataStore).getEntityRecords('postType','page',query); },[searchTerm]); 返回( <div> <搜索控制 onChange={setSearchTerm} 值={searchTerm} /> <PagesList pages={pages}/> </div> ) }
使用核心数据代替直接调用API
从“@wordpress/api-fetch”导入apiFetch; 函数MyFirstApp(){ // ... const[pages,setPages]=使用状态([]); 使用效果(()=>{ consturl='/wp-json/wp/v2/pages? search='+搜索术语; apiFetch({url}) .then(设置页面) },[searchTerm]); // ... }
步骤5:装载指示器
从“@wordpress/components”导入{SearchControl,Spinner}; 函数PagesList({hasResolved,pages}){ if(!已解决){ return<微调器/> } if(!页?.长度){ return<div>无结果</div> } // ... } 函数MyFirstApp(){ // ... 返回( <div> // ... <PagesList hasResolved={hasResorved}pages={pages}/> </div> ) }
从“@wordpress/data”导入{useSelect}; 从“@wordpress/core-data”导入{store as coreDataStore}; 函数MyFirstApp(){ // ... const{pages,hasResolved}=useSelect(select=>{ // ... 返回{ 页面:select(coreDataStore).getEntityRecords('postType','page',query), 已解决: select(coreDataStore).hasFinishedResolution('getEntityRecords',['postType','page',query]), } },[searchTerm]); // ... }
从“@wordpress/data”导入{useSelect}; 从“@wordpress/core-data”导入{store as coreDataStore}; 函数MyFirstApp(){ // ... const{pages,hasResolved}=useSelect(select=>{ // ... const selectorArgs=['postType','page',query]; 返回{ 页面:select(coreDataStore).getEntityRecords(…selectorArgs), 已解决: select(coreDataStore).hasFinishedResolution('getEntityRecords',selectorArgs), } },[searchTerm]); // ... }
将其连接在一起
从'react'导入{useState}; 从“react-dom”导入{createRoot}; 从“@wordpress/components”导入{SearchControl,Spinner}; 从“@wordpress/data”导入{useSelect}; 从“@wordpress/core-data”导入{store as coreDataStore}; 从“@wordpress/html-entities”导入{decodeEntities}; 函数MyFirstApp(){ const[searchTerm,setSearchTerm]=使用状态(“”); const{pages,hasResolved}=useSelect( (选择)=>{ 常量查询={}; if(searchTerm){ query.search=搜索术语; } const selectorArgs=['postType','page',query]; 返回{ 页面:选择(coreDataStore).getEntityRecords( …选择器参数 ), hasResolved:选择(coreDataStore).hasFinishedResolution( '获取实体记录', 选择器参数 ), }; }, [搜索术语] ); 返回( <div> <SearchControl onChange={setSearchTerm}value={searchTerm}/> <PagesList hasResolved={hasResorved}pages={pages}/> </div> ); } 函数PagesList({hasResolved,pages}){ if(!已解决){ return<微调器/>; } if(!页?长度){ return无结果; } 返回( <table className=“wp-list-table widefat fixed striped table-view-list”> <头部> <tr> <td>标题</td> </tr> </thead> <t车身> {pages?.map((page)=>( <tr键={page.id}> <td>{decodeEntities(page.title.rendered)}</td> </tr> ) ) } </tbody> </表格> ); } const根=创建根( document.querySelector('#my first gutenberg app') ); window.addEventListener( “加载”, 函数(){ 根.根.根( <MyFirstApp/> ); }, 假 );