setState() 是不是可用于更新 Alt.js 商店中的状态?

Posted

技术标签:

【中文标题】setState() 是不是可用于更新 Alt.js 商店中的状态?【英文标题】:Is setState() optional for updating the state in Alt.js store?setState() 是否可用于更新 Alt.js 商店中的状态? 【发布时间】:2017-04-22 13:36:58 【问题描述】:

是的,我知道 setState() 会更新 Store 的状态并向所有订阅者发出更改事件,但我发现并不是每个人都使用它并在更新状态时忽略它。

例如在下面的alt-todo repo,他们不使用setState()

class TodoStore 
    constructor() 
        this.bindActions(TodoActions);

        this.todos = ;
    

    onCreate(text) 
        text = text.trim()
        if (text === '') 
            return false
        
        // hand waving of course.
        const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36)
        this.todos[id] = 
            id: id,
            complete: false,
            text: text
        
    

但是在official alt.js repo 他们使用它:

class LocationStore 
    constructor() 
        this.bindAction(locationActions.updateLocation, this.onUpdateLocation);

      this.state = 
        city: 'Denver',
        country: 'US'
      ;
    

    onUpdateLocation(obj) 
        const  city, country  = obj
        this.setState( city, country );
    

所以我想知道这两种方式有什么区别?

【问题讨论】:

【参考方案1】:

真的没有:

setState 在 Alt 内部用于设置状态。您可以覆盖它以提供您自己的 setState 实现。在内部,setState 是 Object.assign 的别名。 setState 必须返回一个对象。

http://alt.js.org/docs/createStore/#setstate

一个例子: 假设您的状态是:


  city: 'Denver',
  country: 'US',

更新状态的两种方式:

this.setState(city: 'Colorado Springs')
console.log(this.state) // city: 'Colorado Springs', country: 'US' )

this.state =  city: 'Elbert' 
console.log(this.state) // state is city: 'Elbert'

如您所见,this.state = 覆盖状态,而this.setState() 将新状态合并到旧状态。见Object.assign()

【讨论】:

那么如果this.setState()被省略了,那么默认会调用,对吧? 没有。你只会覆盖你的整个状态而不是合并它。 我还注意到直接分配状态并不总是触发emitChange()

以上是关于setState() 是不是可用于更新 Alt.js 商店中的状态?的主要内容,如果未能解决你的问题,请参考以下文章

React生命周期, setState、props改变触发的钩子函数

在父 setState 之后,子状态对象被替换(initState)而不是更新(didUpdateWidget)

listview 不使用 setState 更新

setState实现原理

如何访问已调用 setState 的函数主体中的更新状态?

React JS:调用 setState 后组件未更新