跳到主要内容
For AI agents: a documentation index is available at /llms.txt

Composing Models

Use the models option to compose models. Each child model is mounted by its own $options.name, and is available on the parent ModelInstance and on $models.

const countModel = defineModel({
name: 'counter',
state: {
count: 0,
},
actions: {
inc() {
this.count++
},
},
})

const userModel = defineModel({
name: 'user',
state: {
name: 'alice',
isLogin: false,
},
models: [countModel],
actions: {
login() {
this.counter.inc()
this.isLogin = true
},
},
views: {
loginCount() {
return this.counter.count
},
},
})

Outside the model, store.getModel() returns a ModelInstance; the same child is available through both direct instance access and $models:

const user = douraStore.getModel(userModel)

user.counter.inc()
user.$models.counter.inc()
警告

Child model keys come from childModel.$options.name. Reusing a child name that conflicts with parent state, action, view, or query keys throws during defineModel().

Shared Instances​

Named models are shared by the model manager. If multiple parents compose the same child model, they point to the same child instance for that manager.

const modelOne = defineModel({
name: 'one',
state: { value: 0 },
models: [countModel],
})

const modelTwo = defineModel({
name: 'two',
state: { value: 0 },
models: [countModel],
})

store.getModel(modelOne).counter and store.getModel(modelTwo).counter refer to the same counter instance when both parents are created from the same doura store.