Mobx计算不起作用

时间:2018-05-24 03:23:06

标签: javascript mobx

我正在使用mobx 4.2.0 当我尝试使用计算属性时,我遇到了一些问题 像这样的代码:

class ODOM {
  constructor(props) {
    console.log('how many times')
  }
  @observable speed = 0
  @action change(obj) {
    console.log(obj)
    Object.keys(obj).forEach(item => {
      this[item] = obj[item]
    })
  }
  @computed get velocity() {
    console.log('entry')
    return this.speed*60*60/1000
  }
}
const model = new ODOM()
let total = 0
setInterval(() => {
  model.change({
    speed: ++total
  })
}, 3000)
export default model

控制台'条目'只运行一次 那些代码有什么问题

4 个答案:

答案 0 :(得分:2)

必须遵守您的计算,以便在它取决于变化的可观察量时重新计算它。

This example使用autorun来显示行为:

class ODOM {
  @observable speed = 0

  @action change(obj) {
    Object.keys(obj).forEach(item => {
      this[item] = obj[item]
    })
  }

  @computed get velocity() {
    console.log('entry')
    return this.speed*60*60/1000
  }
}

const model = new ODOM()
let total = 0
setInterval(() => {
  model.change({
    speed: ++total
  })
}, 1000);

autorun(() => {
  console.log(model.velocity);
});

答案 1 :(得分:0)

我发现了问题。因为观察者没有正确使用。

答案 2 :(得分:0)

计算重新计算仅由在渲染函数中直接使用此属性的组件中的mobx触发,并且这些反应组件必须使用@observer属性进行注释。

否则使用非计算/普通属性或自己缓存值。

答案 3 :(得分:0)

如果@withRouter 在@observer 之下,将会使@observer,@computed 失败 像这样(错误):

@observer 
// @ts-ignore
@withRouter

你需要这样写(正确):

// @ts-ignore 
@withRouter
@observer