すでに使用しているのは、Reduxで実装した集中化された状態です。
Reactを行う必要があるコンポーネントだけがRerenderedされるようにReact Baobabで実装がより明確になるかもしれません。
注:デモンストレーションの理由から、モーダルを使用する多くのコンポーネントで動作しない1つのプロパティ "isOpened"を使用して作業しています。これが当てはまる場合は、あなたの状態に何かを追加する必要があります。例えば、あなたが開きたいモダルのidと、このidが(SomeComponentの中で)設定されているかどうかを確認する必要があります。
モーダル:
import React from "react";
export default class Modal extends React.Component {
render() {
return (
<div className="myModal"></div>
);
}
}
SomeComponent:
import React from "react";
import { branch as BaobabBranch } from "baobab-react/higher-order";
import PropTypes from "prop-types";
import { openModal } from "./actions/Modal";
@BaobabBranch({
modal: ["modal"]
})
export default class SomeComponent extends React.Component {
static propTypes = {
dispatch: PropTypes.func.isRequired,
modal: PropTypes.object.isRequired
}
onOpenModal() {
this.props.dispatch(openModal);
}
render() {
return (
<div className="someComponent">
{ this.props.modal.isOpened ?
<Modal />
:
<div class="content" onClick={::this.onOpenModal}></div>
}
</div>
);
}
}
アクション/モーダル:
export const openModal = state => {
state.select("modal").set(Object.assign({}, state.get("modal"), {
isOpened: true
}));
};
状態:
import Baobab from "baobab";
const state = new Baobab({
modal: {
isOpened: false,
content: "someContent"
}
});
短い説明:
状態は、上記の値で初期化されるグローバル状態を保持します。 SomeComponentのcontent divをクリックすると、openModalアクションが実行されます。すべてのアクションの最初の引数は、常に状態そのものです。状態の値が変更されるとすぐに(@BaobabBranchを使用して)すべてのリッスンコンポーネントが新しい小道具について再通知し、再レンダリングします。
他のコンポーネントを追加すると、モーダル値も聞くことができます。これにより、モーダル処理を集中化し、レイヤー間のバブル値を上下させないために必要なものがすべて用意されています。
コンポーネントが問題を更新する必要があるのはなぜですか?具体的な例を挙げて少し詳しく説明してください。 @DanielZuzevich Absolutely。 –
モーダルコンポーネントの1つに 'input'フィールドが含まれていたので、このフィールドに文字を入力するたびにRedux呼び出しを作成して' component'状態を更新する必要がありました。 – topic
入力値が変わると、コンポーネントが更新され、モーダルが閉じられると言っていますか? –