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改变触发的钩子函数