Reactプロジェクトでモーダルを作成しています。モーダルが開いている場合はボディにクラスを追加し、閉じている場合は削除する必要があります。
クラスを追加/削除するVanilla javascriptを実行することで、これを古いjQueryの方法で実行できましたが、これは通常のReact哲学のようには感じません。
代わりに、トップレベルコンポーネントでsetStateを使用して、モーダルが開いているか閉じているかを示す必要がありますか?これを行ったとしても、ページのdivにレンダリングされるため、まだbody要素を編集する副作用があるので、この余分な配線には利点がありますか?
TL; DRuse document.body.classList.add
およびdocument.body.classList.remove
状態の一部を切り替えて、外部コンポーネント内のモーダルを表示/非表示にする2つの関数があります。
これらの関数内では、document.body.classList.add
メソッドとdocument.body.classList.remove
メソッドを使用して、以下のようにモーダルの状態に依存するボディクラスを操作します。
openModal = (event) => {
document.body.classList.add('modal-open');
this.setState({ showModal: true });
}
hideModal = (event) => {
document.body.classList.remove('modal-open');
this.setState({ showModal: false });
}
新しいReact(16.8)では、これは hooks で解決できます:
import {useEffect} from 'react';
const addBodyClass = className => document.body.classList.add(className);
const removeBodyClass = className => document.body.classList.remove(className);
export default function useBodyClass(className) {
useEffect(
() => {
// Set up
className instanceof Array ? className.map(addBodyClass) : addBodyClass(className);
// Clean up
return () => {
className instanceof Array
? className.map(removeBodyClass)
: removeBodyClass(className);
};
},
[className]
);
}
次に、コンポーネントで
export const Sidebar = ({position = 'left', children}) => {
useBodyClass(`page--sidebar-${position}`);
return (
<aside className="...">
{children}
</aside>
);
};
@brianが述べたように、他のコンポーネントをラップするトップレベルのコンテナコンポーネントを試してください。 (アプリでreduxを使用していない場合)
この最上位コンポーネントでは:
modalOpen
)を追加して、CSSクラスを切り替えますhandleOpenModal
&handleCloseModal
)を追加します。<Modal />
コンポーネントに渡しますReactJSには公式のReactモーダルコンポーネントがあり、それを使用するだけです。 https://github.com/reactjs/react-modal