98 votes

Comment corriger l'avertissement "Attendu pour retourner une valeur à la fin de la fonction flèche" ?

Tout fonctionne bien, mais j'ai cet avertissement Expected to return a value at the end of arrow function array-callback-return . J'ai essayé d'utiliser forEach au lieu de map mais alors <CommentItem /> ne se montre même pas. Comment puis-je réparer cela ?

  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

1 votes

Y a-t-il un autre retour si vous n'entrez pas dans le si ?

19 votes

Vous ne retournez que si commentReply.replyTo === comment.id . Si ce n'est pas le cas, vous ne rendez rien. Mettez simplement return null après le if bloc

0 votes

Mikael Lennholm, puis-je dire que vous êtes un génie ?

177voto

Zanon Points 13171

A map() crée un tableau, donc un return est attendu pour tous les chemins de code (if/elses).

Si vous ne voulez pas de tableau ou retourner des données, utilisez forEach à la place.

16 votes

Il s'agit d'une solution courte et générale. J'espère qu'elle ira à la première place

102voto

Kris Selbekk Points 828

L'avertissement indique que vous ne retournez pas toujours quelque chose à la fin de votre fonction flèche de carte.

Une meilleure approche de ce que vous essayez d'accomplir est d'utiliser d'abord une .filter et ensuite un .map comme ceci :

this.props.comments
  .filter(commentReply => commentReply.replyTo === comment.id)
  .map((commentReply, idx) => <CommentItem key={idx} className="SubComment"/>);

0 votes

Que faire si aucune correspondance n'est trouvée pour le filtre

4 votes

Si aucun commentaire ne correspond au filtre, un tableau vide sera retourné. Celui-ci sera passé à .map qui, à son tour, sera un no-op. En d'autres termes, s'il n'y a pas de correspondance, rien ne sera rendu.

0 votes

Comme Zanon l'a suggéré ci-dessous, une option plus facile et moins complexe est d'utiliser tout simplement forEach qui ne s'attend pas à retourner quelque chose au lieu de map qui s'attendent à retourner quelque chose.

10voto

Chris Points 3970

Le problème semble être que vous ne renvoyez pas quelque chose dans le cas où votre premier if -est faux.

L'erreur que vous obtenez indique que votre fonction de flèche (comment) => { n'a pas de déclaration de retour. Alors qu'il le fait pour quand votre if -est vrai, il ne renvoie rien lorsqu'il est faux.

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.
  }
});

modifier vous devriez jeter un coup d'œil à la réponse de Kris pour savoir comment mieux mettre en œuvre ce que vous essayez de faire.

5voto

La réponse la plus votée, celle de Kris Selbekk, est tout à fait juste. Il est important de souligner qu'il s'agit d'une approche fonctionnelle, vous bouclerez à travers le fichier this.props.comments deux fois, la deuxième fois (en boucle), il est probable qu'il saute quelques éléments qui ont été filtrés, mais dans le cas où il n'y a pas de comment a été filtré, vous bouclerez deux fois dans le tableau entier. Si la performance n'est pas un problème dans votre projet, c'est parfait. Si la performance est importante, un guard clause serait plus approprié car vous ne boucleriez le tableau qu'une seule fois :

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>          
  ) 
}

La raison principale pour laquelle j'attire l'attention sur ce point est qu'en tant que développeur junior, j'ai fait beaucoup de ces erreurs (comme boucler le même tableau plusieurs fois), et j'ai donc pensé que cela valait la peine de le mentionner ici.

PS : Je remanierais encore plus votre composant react, car je ne suis pas en faveur d'une logique lourde dans l'élément html part d'un JSX mais cela ne fait pas partie du sujet de cette question.

-2voto

Srinivasan N Points 47
class Blog extends Component{
    render(){
        const posts1 = this.props.posts;
        //console.log(posts)
        const sidebar = (
            <ul>
                {posts1.map((post) => {
                    //Must use return to avoid this error.
          return(
                        <li key={post.id}>
                            {post.title} - {post.content}
                        </li>
                    )
                })
            }

            </ul>
        );
        const maincontent = this.props.posts.map((post) => {
            return(
                <div key={post.id}>
                    <h3>{post.title}</h3>
                    <p>{post.content}</p>
                </div>
            )
        })
        return(
            <div>{sidebar}<hr/>{maincontent}</div>
        );
    }
}
const posts = [
  {id: 1, title: 'Hello World', content: 'Welcome to learning React!'},
  {id: 2, title: 'Installation', content: 'You can install React from npm.'}
];

ReactDOM.render(
  <Blog posts={posts} />,
  document.getElementById('root')
);

0 votes

Pourriez-vous ajouter quelques explications sur la façon dont votre code résout le problème de l'OP ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X