最近、Reactに苦労して、いくつかの異なるもので表示できる条件付きレンダリング要素(ダイアログなど)を適切に制御する方法を理解しようとしています。たとえば、アイテムのリストはそれぞれ独自のモーダルコンテンツを持つことができますが、同じモーダルを共有します。必要がない場合はモーダル(display: none
)を隠し、必要に応じて表示を変更するだけです。トグル時の再マウントを引き起こすReactでの条件付きレンダリング
問題は、表示されるたびにモーダルを再初期化する必要があるときに発生します。たとえば、モーダルには、現在のタブインデックスがモーダル状態で格納された一連のタブが含まれているとします。モーダルを閉じて再び開くと、現在のタブインデックスはゼロにリセットされると予想されますが、そうではありません。むしろそれはモーダルを隠す前に残されたものである。
このためかなり明白な理由は、それが最初にレンダリングされるときにモーダルにのみ、一度をマウントされていることです。その後のレンダリングの更新は、マウントライフサイクルメソッドを再実行しません。明らかに、ソリューションには、必要に応じてコンポーネントを再マウントする必要があります(通常は再度表示された場合)。私は
可能な例– Dialog
べきのみアンマウントを思い付くとするときisDialogShown
変更を再マウントしました。私はかなり確かですReactはこれに気付き、isDialogShown
フラグの変更時にライフサイクルメソッドを正しく実行することができます。
...
const ParentElement = ({ isElementShown }) => {
return (
{!Boolean(isElementShown)
? null
: <ConditionalElement prop={stuff} />
}
);
}
...
CodePen Example - Conditional Rendering
これはそれを行うための最善の方法である場合しかし、私はわかりません。 ConditionalElement
自体にプロパティを渡して、再レンダリングさせる方法があることを願っています。プロパティが特定の値であればnull
をrender()
関数から返すかもしれませんか?問題は、これがConditionalElement
自体をリセットするとは思わないが、おそらくすべての子どもたちです。
const ParentElement = ({ isElementShown }) => {
return (
<ConditionalWrapper isShown={true}>
<ConditionalElement />
<ConditionalWrapper/>
}
);
}
const ConditionalWrapper = ({ children, isShown }) = {
// Don't render any children if the element should be hidden
// Also, styles would be applied to hide the wrapper if necessary
if (!isShown) {
return null;
}
// Render the children if not hidden
return children;
};
第2の方法は少し「ハッキー」と思われますが、もう少しネストされています。それはとにかくお勧めですか?素敵なことは、両方の方法でローカル状態を保持する必要がある場合、要素を「トグル」(un/re-mount)と「隠す」(display: none;
)が可能であることです。これには別のパラメータ(isToggled
とisShown
)が必要です。
'componentWillReceiveProps'の状態をリセットするのはどうですか? – Alik