Skip to content

withLazyViewModel HOC

Optional for usage HOC that doing the same thing as withViewModel, but fetching ViewModel and View "lazy"

TIP

This HOC is using react-simple-loadable package

API Signature

tsx
function withLazyViewModel<TViewModel extends AnyViewModel>(
  loadFn: () => Promise<{
    Model: Class<TViewModel> | Promised<Class<TViewModel>>,
    Component: TView | Promised<TView>
  }>,
  config?: ViewModelHocConfig<TViewModel>
): ComponentWithLazyViewModel

Usage

Let's create a ViewModel with a lot blocks of code

ts
import { ViewModelBase } from "mobx-view-model";

export class FruitButtonHugeVM extends ViewMOdelBase {
  ... // large of code lines

  handleButtonClick = () => {
    //...
  }
}

Create a View component

tsx
import { ViewModelProps } from "mobx-view-model";
import { observer } from "mobx-react-lite";
import { FruitButtonHugeVM } from "./model";

export const FruitButtonView = observer(({
  model
}: ViewModelProps<FruitButtonHugeVM>) => {
  return (
    <div>
      <button onClick={model.handleButtonClick}>click me</button>
    </div>
  )
})

And connect them together with lazy loading this modules using this HOC

tsx
import { withLazyViewModel } from "mobx-view-model";

export const FruitButton = withLazyViewModel(() => {
  return {
    Model: import("./model").then(m => m.FruitButtonHugeVM),
    View: import("./view").then(m => m.FruitButtonView),
  }
})

Also you can use "default" exports if you need

tsx
... // model.ts
export default class MyVM extends ViewModelBase {}
... // view.tsx
export default function MyView() { return <div>1</div> }
... // index.ts
export const MyComponent = withLazyeViewModel(() =>{
  return {
    Model: import("./model"),
    View: import("./view"),
  }
})

Released under the MIT License.