Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mobX: TypeError: Cannot read properties of undefined

I just playground with some code with mobX, and this happened, don't know why but i'm sure it not much different from offical docs

Here is store.tsx

import { observable, computed, action, makeObservable, override, makeAutoObservable } from "mobx"

class CounterStore {
  initValue = 0
  powValue = Math.pow(this.initValue, 2)
  constructor() {
    makeAutoObservable(this)
  }
  increaseNumber() {
    this.initValue = this.initValue + 1
  }
}
const Store = new CounterStore()
export default Store

Here is where i use this. called increasement.tsx

import { observer } from "mobx-react"

export const IncrementButton = observer(({ store }) => {
  return (
    <div>
      <button onClick={store.increaseNumber}>Increase</button>
      <h1>{store.initValue}</h1>
    </div>
  )
})

And index.tsx

ReactDOM.render(
  <React.StrictMode>
    <IncrementButton store={Store} />
    {/* <TestUseState /> */}
    {/* <TestEffect />
     <UseMemoTest /> */}
  </React.StrictMode>,
  document.getElementById("root"),

Weird is, it show initValue, but when i click increase it show can't not read properties Please help, thanks

like image 762
Lê Quốc Khánh Avatar asked Oct 22 '25 10:10

Lê Quốc Khánh


2 Answers

as @mimoid noticed, your method is not bound to the class and losing context (this). It is not MobX problem, it is just regular javascript feature called late binding.

Although you don't really need to change makeAutoObservable to makeObservable, you can just use arrow functions, in my opinion it is more "native" way:

class CounterStore {
  initValue = 0
  powValue = Math.pow(this.initValue, 2)
  constructor() {
    makeAutoObservable(this)
  }
  // Just make it an arrow function
  increaseNumber = () => {
    this.initValue = this.initValue + 1
  }
}

Alternatively you can pass autoBind option to the makeAutoObservable:

autoBind: true uses action.bound/flow.bound by default, rather than action/flow. Does not affect explicitly annotated members.

https://mobx.js.org/observable-state.html#options-

like image 145
Danila Avatar answered Oct 25 '25 01:10

Danila


Change makeAutoObservable to makeObservable and manually assign action.bound to every action instead of action. I had a similar error and it solved it.

like image 41
Mimoid Avatar answered Oct 25 '25 01:10

Mimoid



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!