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

使用React Hooks获取WordPress自定义文章类型并传递给组件的问题求助

解决React中向WordPress Guide组件传递异步获取的自定义文章类型数据问题

看起来你遇到的核心问题有两个:一是异步数据加载的时机处理,二是对React组件props传递逻辑的小误解。咱们一步步来解决:

首先纠正你的认知误区

你在WelcomeTourGuide里打印props看不到guides是完全正常的——因为guides是DynamicGuide组件内部通过useFetch获取的局部状态,并不是从WelcomeTourGuide传递进去的属性。如果想在WelcomeTourGuide里拿到guides,需要把数据获取逻辑上移,再通过props传给DynamicGuide;如果只是要把guides传给内置的Guide组件,那只需要保证DynamicGuide在数据准备好后再渲染Guide即可。

方案1:在DynamicGuide内处理异步状态,直接传递给Guide组件

假设你的useFetch是返回{ data, loading, error }结构的自定义Hook(这是异步请求Hook的常见设计),修改data.js如下:

import useFetch from './helper';
import { Guide } from '@wordpress/components';

const DynamicGuide = (props) => {
  // 解构异步请求的状态和数据
  const { data: guides, loading, error } = useFetch('/wp-json/wp/v2/guides');

  // 加载中时显示占位符,避免传递undefined给Guide
  if (loading) {
    return <div>加载指南中...</div>;
  }

  // 处理请求错误
  if (error) {
    return <div>加载指南失败:{error.message}</div>;
  }

  // 确保传递给Guide的是有效数组(避免null/undefined)
  const validGuides = guides || [];

  console.log('传递给Guide组件的指南数据:', validGuides);
  return (
    <Guide {...props} guides={validGuides} />
  );
}

export default DynamicGuide;

方案2:将数据获取逻辑上移到父组件(如果需要在WelcomeTourGuide里使用guides)

如果你需要在WelcomeTourGuide中也用到guides数据,可以把useFetch移到父组件,再通过props传递给DynamicGuide:

修改templates/guide.js

import { __ } from '@wordpress/i18n';
import DynamicGuide from './../data';
import useFetch from './../helper'; // 导入useFetch

const WelcomeTourGuide = (props) => {
  const { data: guides, loading, error } = useFetch('/wp-json/wp/v2/guides');

  if (loading) {
    return <div>加载中...</div>;
  }

  if (error) {
    return <div>加载错误:{error.message}</div>;
  }

  console.log('WelcomeTourGuide中的指南数据:', guides); // 现在能看到数据了
  return (
    <DynamicGuide 
      {...props} 
      guides={guides || []} 
      pages={ [
        {
          image: <img src="https://s.w.org/images/block-editor/welcome-canvas.gif" />,
          content: (
            <div>
              <h2 className="edit-post-welcome-guide__heading">{__('Welcome to the block editor')}</h2>,
              <p className="edit-post-welcome-guide__text">{__('In the WordPress editor, each paragraph, image, or video is presented as a distinct “block” of content.')}</p>
            </div>
          )
        },
      ] } 
    />
  )
}

export default WelcomeTourGuide;

修改data.js(改为纯传递props的组件)

import { Guide } from '@wordpress/components';

const DynamicGuide = ({ guides, ...props }) => {
  return (
    <Guide {...props} guides={guides || []} />
  );
}

export default DynamicGuide;

额外提醒:检查useFetch的实现

如果你的useFetch没有正确处理异步状态,也会导致数据传递异常。这里给你一个标准的useFetch实现参考,确保它能正确返回加载状态、错误和数据:

// helper.js
import { useState, useEffect } from 'react';

const useFetch = (url) => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error(`请求失败:${response.status}`);
        }
        const result = await response.json();
        setData(result);
      } catch (err) {
        setError(err);
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, [url]);

  return { data, loading, error };
};

export default useFetch;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:52:34