admin管理员组文章数量:1434904
I have following model:
const AnotherModel = types.model({
foo: types.string
});
export const SomeCollectionModel = types
.model({
data: types.array(AnotherModel),
})
.views((self) => ({
getData: () => self.data,
}))
.actions((self) => ({
fetchData: flow(function* fetchData() {
try {
const data =
yield service.fetchData();
self.data.replace(
data.map((f) => AnotherModel.create(f)),
// Using plain json instead of create does the same
);
} catch (err) {
console.error(err);
}
})
}));
Then I have two React ponents, which I pose with inject
and observer
.
Parent one (view/page):
pose(
inject((states) => ({
fetchData: () =>
states.myModel.fetchData(),
})),
observer,
)
Child one:
pose(
inject(states => ({
data: states.myModel.getData()
})),
observer
)
I have a re-rednering problem. Initially child ponent doesn't render anything. In the meantime data is fetched (action triggers itself). However data is not updated in child. ponentWillReact
doesnt trigger.
After changing routes (rerender by router) view gets updated
Do you have any idea? I'm stuck for hours.
I have following model:
const AnotherModel = types.model({
foo: types.string
});
export const SomeCollectionModel = types
.model({
data: types.array(AnotherModel),
})
.views((self) => ({
getData: () => self.data,
}))
.actions((self) => ({
fetchData: flow(function* fetchData() {
try {
const data =
yield service.fetchData();
self.data.replace(
data.map((f) => AnotherModel.create(f)),
// Using plain json instead of create does the same
);
} catch (err) {
console.error(err);
}
})
}));
Then I have two React ponents, which I pose with inject
and observer
.
Parent one (view/page):
pose(
inject((states) => ({
fetchData: () =>
states.myModel.fetchData(),
})),
observer,
)
Child one:
pose(
inject(states => ({
data: states.myModel.getData()
})),
observer
)
I have a re-rednering problem. Initially child ponent doesn't render anything. In the meantime data is fetched (action triggers itself). However data is not updated in child. ponentWillReact
doesnt trigger.
After changing routes (rerender by router) view gets updated
Do you have any idea? I'm stuck for hours.
Share Improve this question asked Oct 25, 2018 at 11:42 Łukasz OstrowskiŁukasz Ostrowski 1,0304 gold badges14 silver badges26 bronze badges 2- what versions are you using? i switched to mobx-state-tree from mobx and have had issues described in their docs about nesting observers mobx-react.js/observer-ponent#nesting-caveat – Daniel Lizik Commented May 20, 2020 at 12:34
- also see this github./mobxjs/mobx-state-tree/issues/1060 – Daniel Lizik Commented May 20, 2020 at 12:38
1 Answer
Reset to default 4- You don't need to create a view to access your raw data, you can use the prop directly:
inject(states => ({
data: states.myModel.data
}))
- You don't need to use
observer
if you useinject
. MyComponent will observe what's inside the inject just fine:
inject(states => ({
data: states.myModel.data
}))(MyComponent)
- In this case, you are observing the array, which is a reference. If you update the items of the array, the array itself doesn't change so MyComponent is not re-rendered. You could observe the array length, that way if the length changes, MyComponent is re-rendered, but it's only useful when you add or remove items from the array:
inject(states => ({
data: states.myModel.data,
length: states.myModel.data.length
}))(MyComponent)
- Finally, if want to observe changes to the items of the array even if the length doesn't change, you need to observe the items internally:
inject(states => ({
data: states.myModel.data,
length: states.myModel.data.length
}))(MyComponent)
const MyComponent = ({ data }) => (
<div>{data.map(item => (
<MyDataItem item={item} />
))}
</div>
)
inject((states, props) => ({
foo: props.item.foo
}))(MyDataItem)
本文标签: javascriptMobX state treearray of models doesn39t trigger updateStack Overflow
版权声明:本文标题:javascript - MobX state tree - array of models doesn't trigger update - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745644077a2668031.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论