Ожидается возвращение значения в конце функции стрелки
Все работает нормально, но у меня есть это предупреждение 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
Ответы
Ответ 1
Предупреждение указывает, что вы не возвращаете что-то в конце своей функции со стрелкой в каждом случае.
Лучший подход к тому, что вы пытаетесь выполнить, - сначала использовать .filter
, а затем .map
, например:
this.props.comments
.filter(commentReply => commentReply.replyTo === comment.id)
.map((commentReply, idx) => <CommentItem key={idx} className="SubComment"/>);
Ответ 2
A map()
создает массив, поэтому ожидается return
для всех путей кода (если/elses).
Если вы не хотите массив или возвращаете данные, используйте forEach
вместо этого.
Ответ 3
Проблема заключается в том, что вы не возвращаете что-то в том случае, если ваш первый if
-case имеет значение false.
Ошибка, которую вы получаете, указывает, что ваша функция стрелок (comment) => {
не имеет оператора возврата. Пока это происходит, когда ваш if
-case имеет значение 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
Самый решительный ответ от Криса Сельбека, это совершенно верно. Важно подчеркнуть, что хотя он и использует функциональный подход, вы дважды будете проходить по массиву 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
, но это не входит в тему этого вопроса.
Ответ 5
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')
);
Ответ 6
Самый простой способ только, если вам не нужно возвращать что-то, это просто return null