私のコンポーネントのレンダリング関数には次のものがあります:
render() {
const items = ['EN', 'IT', 'FR', 'GR', 'RU'].map((item) => {
return (<li onClick={this.onItemClick.bind(this, item)} key={item}>{item}</li>);
});
return (
<div>
...
<ul>
{items}
</ul>
...
</div>
);
}
すべて正常にレンダリングされますが、<li>
要素をクリックすると次のエラーが表示されます。
キャッチされないエラー: 不変違反: オブジェクトは React の子として有効ではありません (見つかったオブジェクト: キー {dispatchConfig、dispatchMarker、nativeEvent、target、currentTarget、type、eventPhase、bubbles、cancelable、timeStamp、defaultPrevented、isTrusted、view、detail、screenX、screenY、clientX、clientY、ctrlKey、shiftKey、altKey、metaKey、getModifierState、button、buttons、relatedTarget、pageX、pageY、isDefaultPrevented、isPropagationStopped、_dispatchListeners、_dispatchIDs} を持つオブジェクト)。子のコレクションをレンダリングする場合は、代わりに配列を使用するか、React アドオンの createFragment(object) を使用してオブジェクトをラップします。のレンダリング メソッドを確認してください
Welcome
。
map 関数内で に変更すると、すべてが期待どおりに動作しthis.onItemClick.bind(this, item)
ます。(e) => onItemClick(e, item)
誰かが私が何を間違っているのか、なぜこのエラーが発生するのかを説明してくれると嬉しいです
更新 1:
onItemClick 関数は次のようになり、this.setState を削除するとエラーが消えます。
onItemClick(e, item) {
this.setState({
lang: item,
});
}
しかし、このコンポーネントの状態を更新する必要があるため、この行を削除することはできません。
ベストアンサー1
このエラーが発生しましたが、文字列値であると想定していたオブジェクトを JSX コードに意図せず含めていたことが判明しました。
return (
<BreadcrumbItem href={routeString}>
{breadcrumbElement}
</BreadcrumbItem>
)
breadcrumbElement
以前は文字列でしたが、リファクタリングによりオブジェクトになりました。残念ながら、React のエラー メッセージでは、問題のある行をうまく特定できませんでした。スタック トレースを遡って、コンポーネントに渡される「props」を認識し、問題のあるコードを見つける必要がありました。
文字列値であるオブジェクトのプロパティを参照するか、オブジェクトを適切な文字列表現に変換する必要があります。 1 つのオプションは、JSON.stringify
実際にオブジェクトのコンテンツを表示する場合です。