传递给子组件的道具未定义,但 console.log 显示道具的值

Posted

技术标签:

【中文标题】传递给子组件的道具未定义,但 console.log 显示道具的值【英文标题】:Props passed to child component is undefined but console.log shows props' value 【发布时间】:2020-07-03 06:57:18 【问题描述】:

我尝试在基于 Gatsby 的应用中创建轮播。我在将道具从父功能组件传递给子功能组件时遇到问题。我收到错误 TypeError: props.slide is undefined 但是当我在控制台中检查日志时,我可以看到 props.slide 有价值

我只是想知道控制台的第一行(上面的屏幕截图)显示了空道具,对吧? 奇怪的是codesandbox没有给出任何错误:https://codesandbox.io/s/ecstatic-snyder-9hjpf

父组件:

//imports...

const carouselItems = [
  
    title: "Laser scanning",
    picture: "../../../../assets/images/RTC360.png",
    content:
      "Lorem ipsum dolor sit amet, consectetur adipisicing elit. A ad deserunt, enim est exercitationem facilis illum ipsum iure, mollitia placeat quia temporibus voluptatem. Asperiores assumenda id nesciunt totam. Eligendi, neque."
  ,
  
    title: "Mobile mapping",
    picture: "../../../../assets/images/RTC360.png",
    content:
      "Lorem ipsum dolor sit amet, consectetur adipisicing elit. A ad deserunt, enim est exercitationem facilis illum ipsum iure, mollitia placeat quia temporibus voluptatem. Asperiores assumenda id nesciunt totam. Eligendi, neque."
  
];

interface CarouselState 
  activeIndex: number;


class Carousel extends React.Component<any, CarouselState> 
  constructor(props: any) 
    super(props);

    this.state = 
      activeIndex: 0
    ;
  

  render() 
    return (
      <div>
        <ul>
          carouselItems.map((slideDescription, index) => (
            <CarouselDescriptionRCTypes
              key=index
              index=index
              activeIndex=this.state.activeIndex
              slide=slideDescription
            />
          ))
        </ul>
      </div>
    );
  


export default Carousel;

子组件:

//imports...

interface CarouselDescriptionProps 
  index: number;
  activeIndex: number;
  slide: 
    title: string;
    picture: string;
    content: string;
  ;


const CarouselDescriptionRCTypes: React.FC<
  CarouselDescriptionProps
> = props => 

  if (!props) 
    return null;
  

  console.log(`props$JSON.stringify(props)`);
  console.log(`props.slide.title$props.slide.title`);

  return (
    <div>
      <strong className="carousel-slide__author">props.slide.title</strong>
      <small className="carousel-slide__source">props.slide.content</small>
    </div>
  );
;

export default CarouselDescriptionRCTypes;

【问题讨论】:

日志的第一行将 props 显示为空数组,我猜那是您遇到错误的时候。查看代码,我看不出有任何理由让它为空。您的示例与您遇到问题的代码完全相同吗? 它工作正常,您将不带道具的&lt;CarouselDescriptionRCTypes /&gt; 添加到您的IndexPage,这样您就会得到错误,并且您的保护子句if(!props) 不起作用,因为道具始终是一个对象,所以你需要单独检查每个道具或使用类似 lodash _.isEmpty!Object.keys(props).lenght 谢谢@Shlang!这样可行!这对我来说很有意义! :) 【参考方案1】:

@Shlang 回答了我的问题。 我一直在通过

检查 IF 子句中的道具
 if (!props) 
    return null;
  

总是返回 true 因为 props 总是对象并且永远不会是未定义的。我相信检查道具可以防止返回未定义的错误。

正如@Shlang 提到的,应该通过相同的子句检查 props 中的每个值,例如:

if (!props.slide) 
    return null;
  

,或使用例如Lodash 库及其 isEmpty 函数。

【讨论】:

以上是关于传递给子组件的道具未定义,但 console.log 显示道具的值的主要内容,如果未能解决你的问题,请参考以下文章

将两个道具从父组件传递给子组件会导致父组件未定义

反应:子组件未接收通过“this.state”传递的道具

反应:作为道具的数组显示为未定义

VUE/NUXT:将随机数作为道具传递给子组件

如何将函数作为道具传递给子组件并在Vue中从那里调用它?

Vue父组件道具没有传递给子组件