React Prop 渲染为对象 - 不明白为啥

Posted

技术标签:

【中文标题】React Prop 渲染为对象 - 不明白为啥【英文标题】:React Prop rendering as object - don't understand whyReact Prop 渲染为对象 - 不明白为什么 【发布时间】:2017-02-06 20:14:58 【问题描述】:

我是 React 的新手,我只是想不通...

我正在尝试将我的状态传递给父组件中的道具,然后在子组件中呈现该状态。像这样:

父组件

class App extends Component 
   constructor(props) 
      super(props);
      this.state = 
         text: 'hello'
      
   
   render() 
      return (
         <div className="App">
            <MessageList textProp=this.state.text/>
         </div>
      );
   

子组件

const MessageList = textProp => 
   return (
   <div className='MessageList'>
      textProp
   </div>
   )

React 无法正确渲染,声称它是一个正在尝试渲染的对象。

我可以使用textProp.textProp 访问该属性,为什么它会渲染一个包含同名属性的对象?

我相信这很简单,但我可以解释一下!

提前致谢。

【问题讨论】:

【参考方案1】:

组件的 props 是一个对象,就像它们的状态是一个对象一样。因此,您想要更多类似的东西:

const MessageList = props => 
   return (
   <div className='MessageList'>
      props.textProp
   </div>
   )

或者,使用解构:

const MessageList = ( textProp ) => 
   return (
   <div className='MessageList'>
      textProp
   </div>
   )

【讨论】:

谢谢!完美解释。【参考方案2】:

当您声明无状态组件时,您需要指定您希望它接收的参数,在您的情况下可以是 (props)( specific )

const MessageList = ( textProp ) => (
 <div className='MessageList'>
      textProp
   </div>
);

请注意我如何使用=&gt; () 来返回标记,您不必对 return () 进行操作,这只是一个提示,可以更好地运行:)

【讨论】:

为小费干杯!我实际上忘记了箭头函数的额外优势......【参考方案3】:

MessageList 中的textProp 是来自父级的props 的集合。在您的情况下,该集合将只有 textProp. 要完成这项工作,您需要执行以下操作。

const MessageList = ( textProp ) => 
   return (
   <div className='MessageList'>
      textProp
   </div>
   )

const MessageList = (textProp) => 
   return (
   <div className='MessageList'>
      textProp.textProp
   </div>
   )

【讨论】:

以上是关于React Prop 渲染为对象 - 不明白为啥的主要内容,如果未能解决你的问题,请参考以下文章

React 和 React Router,使用不同的 prop 两次渲染相同的元素会导致两个元素具有相同的 prop?

为啥我的 React 组件列表在使用 Index 作为 key prop 时不会弄乱?

为啥系统在“prop-types”中寻找“react-is”?

React:为啥这个 React 组件不渲染?

为啥 React 组件库更喜欢基于 prop 的样式

如何在 React Native 的初始渲染中多次调用组件的 prop 方法?