Loading...
Loading...
Compare original and translation side by side
database/models/findAndObservequery.observe()withObservablesdatabase/models/findAndObservequery.observe()withObservablesfindAndObservefindAndObservefindAndObserve(id)model.update()@writerfindAndObserve(id)model.update()@writeruseStateuseStateuseStateObject.issetPhrase(model)useStateObject.issetPhrase(model)findAndObserveconst [phraseState, setPhraseState] = useState<
{ phrase: Phrase; _key: number } | null
>(null);
useEffect(() => {
if (!id) return;
const sub = db.collections
.get<Phrase>(PHRASE_TABLE)
.findAndObserve(id)
.subscribe((result) => {
setPhraseState({ phrase: result, _key: result.updatedAt });
});
return () => sub.unsubscribe();
}, [id, db]);
const phrase = phraseState?.phrase ?? null;phrasephraseStatefindAndObserveconst [phraseState, setPhraseState] = useState<
{ phrase: Phrase; _key: number } | null
>(null);
useEffect(() => {
if (!id) return;
const sub = db.collections
.get<Phrase>(PHRASE_TABLE)
.findAndObserve(id)
.subscribe((result) => {
setPhraseState({ phrase: result, _key: result.updatedAt });
});
return () => sub.unsubscribe();
}, [id, db]);
const phrase = phraseState?.phrase ?? null;phrasephraseStateobserve()observe()query.observe()setState(results)linked.filter(...)assignmentssetStatequery.observe()setState(results)linked.filter(...)assignmentswithObservableswithObservableswithObservables(triggerProps, getObservables)setState{ values, isFetching }withObservables(['attempt'], ({ attempt }) => ({ attempt: attempt.observe(), ... }))AttemptCardfeatures/lesson/components/AttemptCard.tsxiduseEffectfindAndObserve(id)withObservables(triggerProps, getObservables){ values, isFetching }setStatewithObservables(['attempt'], ({ attempt }) => ({ attempt: attempt.observe(), ... }))features/lesson/components/AttemptCard.tsxAttemptCardiduseEffectfindAndObserve(id)database/models/PhraseLessonAttemptTranslationDeck@field@writerPhrase.findOrCreatePhraseLesson.addLessonuseDatabase()@nozbe/watermelondb/reactcollection.findAndObserve(id)query.observe().subscribe(...)database/schema.tsdb.collections.get<Model>(TABLE)database/models/PhraseLessonAttemptTranslationDeck@field@writerPhrase.findOrCreatePhraseLesson.addLesson@nozbe/watermelondb/reactuseDatabase()collection.findAndObserve(id)query.observe().subscribe(...)database/schema.tsdb.collections.get<Model>(TABLE)| Scenario | Pattern | Re-render guarantee |
|---|---|---|
Single model by | | Yes |
| Query results (list) | | Yes (new array/refs) |
| Model passed as prop | | Yes (HOC uses new state shape) |
| 场景 | 实现模式 | 重新渲染保障 |
|---|---|---|
通过 | | 是 |
| 查询结果(列表页) | | 是(新数组/引用) |
| 模型作为props传入 | | 是(高阶组件使用新状态结构) |
findAndObserveobserve()withObservablesPhraseDetailScreenLessonDetailScreenSetDetailScreenAttemptCardfindAndObserveobserve()withObservablesPhraseDetailScreenLessonDetailScreenSetDetailScreenAttemptCard