2016-12-07 73 views
0

是的,我知道setState()更新了商店的狀態並向所有訂戶發出了更改事件,但我發現不是每個人都使用它並在更新狀態時省略它。setState()是否可選,用於更新Alt.js存儲中的狀態?

例如在下面的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 }); 
    } 
} 

所以我不知道有什麼差異兩種方式?

回答

3

沒有一個,真正做到:

的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()

+0

因此,如果'this.setState()'被忽略,那麼它被默認調用,對吧? –

+0

不會。你只會覆蓋整個狀態而不是合併它。 – MoeSattler

+0

我也注意到直接賦值狀態並不總是激發'emitChange()' – Avdept

相關問題