it-roy-ru.com

Ожидается, что вернет значение в конце функции стрелки

Все работает нормально, но у меня есть это предупреждение 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"/>
                 ) // returnt
                } // if-statement
              }) // map-function
              } // map-function __begin
            
          </div> // comment.id
          
        ) // return

22
Ramzan Chasygov

Предупреждение указывает, что вы не возвращаете что-либо в конце функции стрелки карты в каждом случае.

Лучший подход к тому, что вы пытаетесь сделать, - это сначала использовать .filter, а затем .map, например так:

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

map() создает массив, поэтому return ожидается для всех путей кода (если/elses).

Если вы не хотите использовать массив или возвращать данные, используйте вместо него forEach.

33
Zanon

Кажется, проблема в том, что вы не возвращаете что-то в том случае, если ваш первый if- случай ложный.

Получаемая ошибка говорит о том, что у вашей функции-стрелки (comment) => { нет оператора return. Несмотря на то, что ваш случай if- имеет значение true, он ничего не возвращает, если он ложный.

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

редактировать вы должны взглянуть на ответ Криса о том, как лучше реализовать то, что вы пытаетесь сделать.

4
Chris

Самый решительный ответ от Криса Сельбека, это совершенно верно. Важно подчеркнуть, что хотя он и использует функциональный подход, вы будете дважды проходить по массиву this.props.comments, во второй раз (зацикливание) он, скорее всего, пропустит несколько элементов, которые были отфильтрованы, но в случае, если никакая comment не была отфильтрована, вы будете цикл через весь массив дважды. Если производительность не является проблемой в вашем проекте, это совершенно нормально. В случае, если важна производительность, guard 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: я бы реорганизовал ваш компонент реагирования еще больше, поскольку я не одобряю тяжелую логику в html part для JSX, но это не входит в тему этого вопроса.

0
Anderson Saunders

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
Srinivasan N