Alles funktioniert gut, aber ich habe diese Warnung Expected to return a value at the end of arrow function array-callback-return
, ich versuche, forEach
statt map
zu verwenden, aber dann zeigt <CommentItem />
nicht einmal. Wie kann man das beheben?
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
Die Warnung zeigt an, dass Sie am Ende Ihrer Kartenpfeilfunktion nicht in jedem Fall etwas zurückgeben.
Ein besserer Ansatz für das, was Sie zu erreichen versuchen, ist zuerst einen .filter
und dann einen .map
wie folgt:
this.props.comments
.filter(commentReply => commentReply.replyTo === comment.id)
.map((commentReply, idx) => <CommentItem key={idx} className="SubComment"/>);
Da map()
ein Array erstellt, wird für alle Codepfade (if/elses) eine return
erwartet.
Wenn Sie kein Array oder Daten zurückgeben möchten, verwenden Sie stattdessen forEach
.
Das Problem scheint zu sein, dass Sie nichts zurückgeben, falls Ihre erste if
- False falsch ist.
Der Fehler, den Sie erhalten, besagt, dass Ihre Pfeilfunktion (comment) => {
keine Rückgabeanweisung enthält. Während dies für den Fall gilt, dass Ihre if
- wahr ist, gibt es nichts zurück, wenn es falsch ist.
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.
}
});
edit Sie sollten einen Blick auf Kris 'Antwort werfen, wie Sie das, was Sie versuchen, besser umsetzen können.
Der einfachste Weg nur Wenn Sie etwas nicht zurückgeben müssen, ist es nur return null
Die beste Antwort von Kris Selbekk ist völlig richtig. Es ist jedoch wichtig hervorzuheben, dass ein funktionaler Ansatz erforderlich ist. Sie durchlaufen zweimal das this.props.comments
-Array. Beim zweiten Mal (Looping) werden höchstwahrscheinlich einige Elemente übersprungen, die gefiltert wurden. Falls jedoch keine comment
-Datei gefiltert wurde, werden Sie dies tun Schleife zweimal durch das gesamte Array. Wenn Leistung in Ihrem Projekt kein Anliegen ist, ist das vollkommen in Ordnung. Falls Leistung wichtig ist, wäre ein guard clause
besser geeignet, als würden Sie das Array nur einmal schleifen:
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>
)
}
Der Hauptgrund, warum ich darauf hinweise, ist, dass ich als Junior-Entwickler viele dieser Fehler gemacht habe (zum Beispiel dasselbe Array mehrmals durchläuft). Ich dachte, ich wäre es wert, es hier erwähnt zu haben.
PS: Ich würde Ihre Reakt-Komponente noch mehr umgestalten, da ich mich nicht für eine starke Logik im html part
einer JSX
aussprechen würde, aber das ist nicht das Thema dieser Frage.
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')
);