Skip to content

Instantly share code, notes, and snippets.

@wobsoriano
Last active August 12, 2021 12:44
Show Gist options
  • Save wobsoriano/7d118b304c5b3faad99c4d74ce6f1585 to your computer and use it in GitHub Desktop.
Save wobsoriano/7d118b304c5b3faad99c4d74ce6f1585 to your computer and use it in GitHub Desktop.
mobx-react-lite in Composition API
import { observable, observe, AnnotationsMap } from "mobx"
import { getCurrentInstance, shallowRef, Ref, triggerRef, readonly, onUnmounted } from "vue"
// Composable
export function useLocalObservable<TStore extends Record<string, any>>(
initializer: () => TStore,
annotations?: AnnotationsMap<TStore, never>
): Readonly<Ref<TStore>> {
const localObservable = shallowRef(observable(initializer(), annotations, { autoBind: true }))
const dispose = observe(localObservable.value, () => {
triggerRef(localObservable)
})
onUnmounted(() => {
if (getCurrentInstance()) {
dispose()
}
})
return readonly(localObservable) as Readonly<Ref<TStore>>
}
// Some component
export default defineComponent({
setup() {
const state = useLocalObservable(() => ({
count: 0,
get double() {
return this.count * 2
},
increment() {
this.count++
}
}))
return {
state
}
}
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment