I am trying to understand how to use observable array with Mobx.
I have a hard time to figure out why this:
let entities = observable([]);
entities[0] = "foo";
autorun(() =>{
console.log(entities);
});
writes:
[$mobx: Object]
0: (...)
1: (...)
2: (...)
3: (...)
4: (...)
5: (...)
6: (...)
7: (...)
8: (...)
9: (...)
10: (...)
11: (...)
12: (...)
13: (...)
14: (...)
15: (...)
16: (...)
17: (...)
...
999: (...)
Instead of a classic array?
I am trying to understand how to use observable array with Mobx.
I have a hard time to figure out why this:
let entities = observable([]);
entities[0] = "foo";
autorun(() =>{
console.log(entities);
});
writes:
[$mobx: Object]
0: (...)
1: (...)
2: (...)
3: (...)
4: (...)
5: (...)
6: (...)
7: (...)
8: (...)
9: (...)
10: (...)
11: (...)
12: (...)
13: (...)
14: (...)
15: (...)
16: (...)
17: (...)
...
999: (...)
Instead of a classic array?
Share Improve this question edited Mar 11, 2016 at 8:38 dagatsoin asked Mar 10, 2016 at 23:26 dagatsoindagatsoin 2,6566 gold badges26 silver badges59 bronze badges2 Answers
Reset to default 38Figure out!
As stated in the docs
Bear in mind that Array.isArray(observable([])) will yield false, so whenever you need to pass an observable array to an external library, it is a good idea to create a shallow copy before passing it to other libraries or built-in functions (which is good practice anyway) by using array.slice() or array.peek(). So Array.isArray(observable([]).slice()) will yield true.
The doc exemple show us a todos.filter()
which could lead to confusion because todos
looks like a real JS Array. But it is not.
So for my exemple to work I just have to console.log(entities.slice())
which will display a real JS array.
Another way to log mobx observable is with toJS
method
import { toJS } from 'mobx';
class Store {
@observable
fruits = ['Apple', 'Banana'];
constructor() {
console.log('this.views :', toJS(this.data));
}
}
export default new Store();
Hope this help. Source