React Native出现Objects are not valid as a React child报错
报错原因
报错触发点在MessageList组件的返回值写法错误,你实际返回了一个普通JavaScript对象,而非React可识别的渲染节点。
你当前写的返回逻辑:
return( {listmessages} );
这段代码里的大括号不在JSX标签内部,不属于JSX表达式语法,会被JavaScript引擎解析为对象字面量,等价于执行return { listmessages: listmessages }——也就是返回了一个键为listmessages、值为元素数组的普通对象,React Native无法直接渲染普通对象,就会抛出Objects are not valid as a React child错误。
你之前在React Web中运行相似代码未报错,大概率是当时的代码要么在外层包裹了容器标签,要么直接返回数组没有额外套大括号,和当前写法并不完全一致。
修复方法
两种合法写法任选其一即可:
- 方法1:直接返回生成的元素数组,去掉多余的大括号
class MessageList extends Component { render() { const listmessages = this.props.msgConst.map((msg) => <Text key={msg.key}>{msg.title}</Text> ); // 直接返回数组,不要额外包裹大括号 return listmessages; } }
- 方法2(推荐):用容器组件包裹列表,此时大括号才是JSX语法中插入表达式的正确写法,也能避免多根节点的潜在兼容问题
import { View } from 'react-native'; class MessageList extends Component { render() { const listmessages = this.props.msgConst.map((msg) => // 列表项必须传入key属性,避免出现渲染警告 <Text key={msg.key}>{msg.title}</Text> ); return( <View> {listmessages} </View> ); } }
注意:原代码中map生成Text节点时没有传入必填的key属性,修复主问题后控制台会抛出列表项缺少key的警告,直接使用你数据里预定义的key字段传入即可。
内容的提问来源于stack exchange,提问作者DenDirk
相关产品推荐
相关产品推荐

