Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeError:this.props.messages.map不是函数_Javascript_Reactjs_React Redux - Fatal编程技术网

Javascript TypeError:this.props.messages.map不是函数

Javascript TypeError:this.props.messages.map不是函数,javascript,reactjs,react-redux,Javascript,Reactjs,React Redux,我正在使用React Redux,在解析数组时遇到问题 我使用选择器将数据返回到组件,但得到错误TypeError:this.props.messages.map不是函数。但如果Iconsole.log值,它将返回正常数组。我做错了什么 组件渲染方法: render() { const {loading, error, messages} = this.props; const mes = JSON.stringify(messages); console.log(m

我正在使用React Redux,在解析数组时遇到问题

我使用选择器将数据返回到组件,但得到错误
TypeError:this.props.messages.map不是函数
。但如果I
console.log
值,它将返回正常数组。我做错了什么

组件渲染方法:

render() {

    const {loading, error, messages} = this.props;
    const mes = JSON.stringify(messages);

    console.log(mes); //<------------- returns [{"key":"value"}]
return (
     <div>
       <MessageList
         messages={mes}
       />
   );
 }
render(){
const{loading,error,messages}=this.props;
const mes=JSON.stringify(消息);
控制台日志(mes);//(

你在评论中说:

消息返回以下内容:列表,而不是数组

JavaScript没有列表类型,从
JSON.stringify
的结果可以清楚地看出
messages
是一个数组,或者至少是
JSON.stringify
认为是数组的东西

我想如果你仔细一看,你会发现
消息
是一个数组,你可以直接在
消息列表中使用它

如果
消息
真的、真的没有
映射
方法,您可以使用
数组将其从任何内容转换为数组。from

mes = Array.from(messages);
…或可能(取决于它是什么)排列符号:

mes = [...messages];
您当然不需要JSON.stringify,它会创建一个字符串

,您可以做的是

render() {
const {loading, error, messages} = this.props;
return (
      <div>
         <MessageList
           messages={messages}
         />
      </div>
   );
 }
render(){
const{loading,error,messages}=this.props;
返回(
);
}
看起来消息来自redux状态。因此,最初消息道具将未定义。因此,在执行映射之前,请使用下面的条件运算符检查消息是否未定义

  {this.props.messages && this.props.messages.map((item, i) => (
        <MessageItem
          key={i}
          message={item.message}
          />
       ))}
{this.props.messages&&this.props.messages.map((项目,i)=>(
))}

这只是一个打字错误,投票决定按此关闭。PrEto-您将
mes
,而不是
消息
,传递到您的
MessageList
mes
是一个字符串(由
JSON.stringify
生成)。我假设
mes
是用于调试的,您想将
消息
传递给
MessageList
消息
是一个数组,带有
map
方法;
mes
是一个字符串,没有
map
。(哎呀,我不能投票以打字错误的形式关闭,我错误地投票以重复的形式关闭,因为我最初误读了这个问题。)此外,您不应该只为组件键使用整数索引。您应该通过添加前缀/后缀使其唯一。类似于
key={I+'mi'}
。请参阅.@T.J.Crowder,messages returns List,我想将其转换为JSON的数组's@PrEto,不要使用
json.stringify
,正如T.j建议的那样,它会将其转换为字符串,并且无法迭代。您应该传递
message={messages}
@PrEto-“我想将其转换为json的数组”JSON是一种用于数据交换的文本表示法。如果您处理的是JavaScript源代码,而不是字符串,那么您就不是在处理JSON。谢谢您,它完成了任务!有一个问题,我将接受您的回答。我可以在componentDidMount中使用redux状态还是在ComponentWillMount中使用SetState?您通常从映射中的redux状态获取值组件中的stateTrops,然后将MapStateTrops传递给redux connect方法。现在,您可以使用组件中任何位置的例如this.props.messages来访问这些值。@正确地预处理您的问题是组件实际从
redux store
接收
道具的时刻。您可以查看他的:@再三考虑,再次感谢。最后一个问题是,如果我连接到websockets以每秒获得1k saga请求是否正常?当我使用
获取
时,它只执行了一次?我同意你的回答!对不起,我不知道web sockets和redux saga。我从未使用过这些库。请不要忘记更新投票还有:)
  {this.props.messages && this.props.messages.map((item, i) => (
        <MessageItem
          key={i}
          message={item.message}
          />
       ))}