Zum Hauptinhalt springen

Side Effects

Side Effects sind Transformationen, die auf das data Feld eines Dokuments angewendet werden, wobei die Änderungen aber nicht persistiert werden. Über Document.derivedData können die transformierten Daten, bspw. fürs Anzeigen im UI, abgefragt werden.

Reaktivität

Ein Side Effect stellt das Feld transformer zur Verfügung, welches die Transformations-Funktion (document: TypeDataMapping[Type]) => TypeDataMapping[Type] enthält. Dank mobx ist es möglich, den transformer computed zu machen, um automatisch die Änderungen zu verfolgen.

Beispiel

RandomState.ts
const States: StateType[] = ['checked', 'question', 'unset', 'star', 'star-half', 'star-empty'] as const;

class RandomState extends iSideEffect<DocumentType.TaskState> {
readonly store: UserStore;

constructor(userStore: UserStore) {
super('RandomState');
this.store = userStore;
}

@computed
get transformer() {
return (docData: TypeDataMapping[DocumentType.TaskState]) => {
if (!this.store.viewedUser) {
return docData;
}
const idxOf = States.indexOf(docData.state);
const totalClients = this.store.users.reduce((sum, u) => sum + u.connectedClients, 0);
return {
...docData,
state: States[(idxOf + totalClients) % States.length]
};
};
}

@computed
get canEdit() {
return true;
}
}

export default RandomState;

Im obigen Beispiel wird der transformer immer dann neu berechnet, wenn sich die Anzahl verbundener clients ändert.

Beispiel

const TransformedTaskState = observer(() => {
const doc = useFirstMainDocument('ff4e8ff4-8de8-48ea-aff8-77d198d32baf', new TaskMeta({}));
const userStore = useStore('userStore');
React.useEffect(() => {
if (doc) {
doc.registerSideEffect(
new RandomState(userStore)
);
}
}, [doc, userStore]);
return (
<>
<TaskStateComponent
taskState={doc}
states={['checked', 'question', 'unset', 'star', 'star-half', 'star-empty']}
label="Wenn sich die anzahl verbunden Clients ändert, ändert sich der State..."
/>
<TaskStateComponent
taskState={new TaskStateModel(doc.props, doc.store)}
readonly
label="TaskState ohne Side Effect"
/>
</>
)
})
http://localhost:3000
Wenn sich die anzahl verbunden Clients ändert, ändert sich der State...
TaskState ohne Side Effect [Read Only]