Using at Component Level
First create a model
import { defineModel } from 'doura'
const countModel = defineModel({
  state: {
    count: 0,
  },
  actions: {
    inc() {
      this.count += 1
    },
  },
})
Then bind your components.
import { useModel } from 'react-doura'
function Counter() {
  const counter = useModel(countModel)
  return (
    <div>
      <h1>Count: {counter.count}</h1>
      <button onClick={counter.inc}>inc</button>
    </div>
  )
}
Selector
If we only care a part of states, we should use selecotr to pick exact what we want:
import { useModel } from 'react-doura'
const userModel = defineModel({
  state: {
    name: 'aclie',
    isLogin: false,
  },
  actions: {
    login() {
      this.isLogin = true
    },
  },
})
function Login() {
  const { isLogin, login } = useModel(
    userModel,
    (s) => ({
      isLogin: s.isLogin,
      login: s.login,
    }),
    [] // deps of selector, empty means the seletor function won't change
  )
  return isLogin ? <div>Welcome</div> : <button onClick={login}>Login</button>
}
We could also pass a pre-defined selector function insteand of an inline function to eliminate the need of passing a dependencies array.
import { Selector } from 'react-doura'
const selector: Selector<typeof userModel> = (s) => ({
  isLogin: s.isLogin,
  login: s.login,
})
function Login() {
  const { isLogin, login } = useModel(userModel, selector)
  return isLogin ? <div>Welcome</div> : <button onClick={login}>Login</button>
}