如何修复“预期在箭头函数末尾返回值”警告?

IT技术 javascript reactjs ecmascript-6 redux react-redux
2021-03-26 17:02:38

一切正常,但我有这个警告Expected to return a value at the end of arrow function array-callback-return我尝试使用forEach而不是map,但后来<CommentItem />甚至没有显示。我该如何解决?

  return this.props.comments.map((comment) => {
  
      if (comment.hasComments === true) {
      
        return (
          <div key={comment.id}>
          
            <CommentItem className="MainComment"/>

              {this.props.comments.map(commentReply => {
              
                if (commentReply.replyTo === comment.id) { 
                  return (
                    <CommentItem className="SubComment"/>
                 ) // return
                } // if-statement
              }) // map-function
              } // map-function __begin
            
          </div> // comment.id
          
        ) // return

6个回答

Amap()创建一个数组,因此return所有代码路径(if/elses)都需要 a。

如果您不想要数组或返回数据,请forEach改用。

这是一个简短而通用的解决方案。希望这是第一个
2021-06-05 17:02:38

该警告表明您不会在每种情况下都在地图箭头函数的末尾返回某些内容。

更好的方法是首先使用 a .filter,然后使用 a .map,如下所示:

this.props.comments
  .filter(commentReply => commentReply.replyTo === comment.id)
  .map((commentReply, idx) => <CommentItem key={idx} className="SubComment"/>);
正如 Zanon 在下面建议的那样,一个更简单、更简单的选择是简单地使用forEach不期望返回任何东西的东西,而不是使用map它期望返回的东西。
2021-05-22 17:02:38
如果没有评论匹配过滤器,将返回一个空数组。这将传递给.map,而这又将是一个空操作。换句话说 - 如果没有匹配项,则不会呈现任何内容。
2021-06-12 17:02:38
如果没有找到匹配的过滤器怎么办
2021-06-20 17:02:38

最简单的方法只有当您不需要返回某些东西时return null

在这种情况下,只需按照@Zanon 的建议使用 forEach
2021-05-28 17:02:38

问题似乎是,如果您的第一个if-case 为 false ,您将不会返回某些内容

您收到的错误表明您的箭头函数(comment) => {没有 return 语句。虽然它在您的if-case 为真起作用,但在它为假时它不会返回任何内容。

return this.props.comments.map((comment) => {
  if (comment.hasComments === true) {
    return (
      <div key={comment.id}>
        <CommentItem className="MainComment" />
        {this.props.comments.map(commentReply => {
          if (commentReply.replyTo === comment.id) { 
            return (
              <CommentItem className="SubComment"/>
            )
          }
        })
        }
      </div>
    )
  } else {
     //return something here.
  }
});

编辑您应该看看 Kris 的答案,以了解如何更好地实施您正在尝试做的事情。

来自 Kris Selbekk 的最高票答案是完全正确的。重要的是要强调,尽管它采用函数式方法,但您将循环遍历this.props.comments数组两次,第二次(循环)它很可能会跳过一些已过滤的元素,但如果没有comment被过滤,您将循环遍历整个阵列两次。如果您的项目不关心性能,那完全没问题。如果性能很重要,aguard clause会更合适,因为您只会循环数组一次:

return this.props.comments.map((comment) => {
  if (!comment.hasComments) return null; 

  return (
    <div key={comment.id}>         
      <CommentItem className="MainComment"/>
        {this.props.comments.map(commentReply => {             
          if (commentReply.replyTo !== comment.id) return null;

          return <CommentItem className="SubComment"/>
        })} 
    </div>          
  ) 
}

我指出这一点的主要原因是因为作为一名初级开发人员,我犯了很多这样的错误(比如多次循环同一个数组),所以我认为我在这里值得一提。

PS:我会重构你的react成分就更多了,因为我赞成重逻辑的我不是html partJSX,但就是这个问题的话题了。