Closed
Description
I'm not sure when should i use the @computed decorator (without asStructure option) in class instead of the getter function for example
class Test {
@observable firstName = 'first'
@observable lastName = 'last'
@computed
get fullName () {
return `${this.firstName} ${this.lastName}`
}
getFullName () {
return `${this.firstName} ${this.lastName}`
}
}
const test = new Test()
autorun(() => {
console.log('computed:', test.fullName)
})
autorun(() => {
console.log('getter:', test.getFullName())
})
test.firstName = 'salmon'
test.lastName = 'sushi'
// computed: first last
// getter: first last
// computed: salmon last
// getter: salmon last
// computed: salmon sushi
// getter: salmon sushi
Thanks
Activity
OscarBarrett commentedon Mar 15, 2016
From the docs
...
So if you're going to observe it, make it a computed property.
boatkorachal commentedon Mar 15, 2016
What I think is firstName and lastName is being observed in both computed and getter function. At first I thought the use case is for optimize as the docs said that the computed properties will not invoked when there input parameters didn't modify.
But after I tried, the getter function didn't print duplicate fullName when I assign the firstName "salmon" again.
Thanks.
mweststrate commentedon Mar 15, 2016
Both solutions will exhibit the same behavior, but introducing
@computed
is better in the sense that it allows MobX to optimized it away more smartly.If
getFullName
is not computed, and you changefirstName
, everyone usinggetFullName
will recompute as well.If, in contrast,
@computed get fullName
is used, thefullname
is cached, so if thefirstname
is changed, thefullname
is recomputed as well, but if the output of fullname doesn't change, nobody would be notified.Also, if you read
test.fullName
somwhere, you will (usually) get a cached result back if decorated, while without decorator it would always be recomputed (which is the normal function behavior after all)So, when in doubt, use it (if your function is pure in terms of depending only on observable values, which it should be)
boatkorachal commentedon Mar 15, 2016
Got it! thank you very much :)
ghost commentedon Jul 25, 2017
@mweststrate so it seems there is not much difference between using a computed decorator and a simple getter? (besides optimization?)
mweststrate commentedon Jul 26, 2017
DmitryOlkhovoi commentedon Nov 26, 2017
Who can be notified? I tried hard, and every time I get not a cached value. So I confused :)
@mweststrate
windwalker commentedon Jan 4, 2018
@mweststrate
When would I get a cached result instead of getting the function recomputed? I tried the following example and it recomputes.
royriojas commentedon Jan 5, 2018
@windwalker I was confused by that too, but it seems values are cached when used inside a
reaction
,autorun
or in therender
of an observableReact
component.Something like https://jsbin.com/rujuxe/edit?js,console,output you can see that the computed values are only called once even when we show then twice.
Also the value will be reevaluated if called directly. (check the click handler of the button)
@mweststrate are there any plans to also return a cached value from the normal usages outside of
autorun
,reaction
andrender
?mweststrate commentedon Jan 5, 2018