Skip to content

Instantly share code, notes, and snippets.

@doasync
Created April 28, 2020 17:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save doasync/f6f2c45d3526fc7ef08a6072e9101970 to your computer and use it in GitHub Desktop.
Save doasync/f6f2c45d3526fc7ef08a6072e9101970 to your computer and use it in GitHub Desktop.
Effector modal model
// Публичный API модалки
export { NameModal } from "./NameModal";
export { openModal as openNameModal, nameIsUpdated } from "./model";
// Для модалки лучше создать собственную модель. К примеру у тебя модалка с инпутом name и кнопкой save:
import { createEvent, createStore, restore, sample } from "effector";
// Public
export const nameIsUpdated = createEvent();
// Modal
export const openModal = createEvent();
export const closeModal = createEvent();
export const $isOpenModal = createStore(false);
// Actions
export const saveNameAction = createEvent();
// Name
export const updateName = createEvent();
export const $name = restore(updateName, "");
// Init
$isOpenModal.on(openModal, () => true);
$isOpenModal.on(closeModal, () => false);
sample({
source: $name,
clock: saveNameAction,
target: nameIsUpdated,
});
// Сам компонент модалки при этом будет выглядеть примерно так:
// ...
const onSubmit = () => {
closeModal();
saveNameAction();
};
// Component
export const NameModal = () => (
<Modal
isOpen={useStore($isOpenModal)}
title="Enter new name”
onClose={closeModal}
onCancel={closeModal}
cancelText="Cancel"
onSubmit={onSubmit}
submitText="Save”
>
<NameInput />
</Modal>
);
// в другой модели подключаешь эту модалку к какому-нибудь экшену и подписываешься на основной ивент:
// ...
sample({
source: changeNameAction,
target: openNameModal,
});
sample({
source: nameIsUpdated,
target: changeNameFx,
});
// ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment