2015-12-30 22 views
3

我試圖用從商店收到的新道具重新渲染我的React組件,但道具似乎沒有得到更新。這種方法通常適用於我,只是在這種情況下它不適用。Flux/Alt沒有從商店更新道具

組件

class Cart extends React.Component { 

    static getStores() { 
     return [CartStore]; 
    } 

    static getPropsFromStores() { 
     return CartStore.getState(); 
    } 

    componentDidMount() { // tried componentWillMount also 
     CartActions.updateCart(); 
    } 

    render() { 
     console.log(this.props.cart); // empty object 

     return (
      <div className="cart"> 
       {this.props.cart.map((item, i) => <div key={i}>{item.get('name')}</div>)} 
      </div> 
     ); 
    } 

} 

export default connectToStores(Cart); 

操作

class CartActions { 

    updateCart() { 
     this.dispatch(); 
    } 

} 

export default alt.createActions(CartActions); 

商店

class CartStore { 

    constructor() { 
     this.bindActions(CartActions); 

     this.cart = Immutable.fromJS([]); 
    } 

    updateCart() { 
     this.cart = Immutable.fromJS(JSON.parse(localStore.getItem('cart'))); 
     console.debug('cart', this.cart); // returns the correct object 
    } 

} 

export default alt.createStore(CartStore, 'CartStore'); 

商店接收活動e從localStorage發泄並檢索正確的對象。但是,組件的道具不會像往常一樣更新。

任何幫助表示讚賞!謝謝:)

版本

  • 陣營0.14.3
  • alt.js 0.17.9

回答

0

你需要的地方聽你的店在您看來,通常componentDidMount ,同樣,如果你從商店出售某些商品並且它會發生變化,它應該來自更高級的組件或者只是成爲一個狀態。在這種情況下,狀態變量更適合。

所以,像這樣的工作

componentDidMount() { 
    CartStore.listen(this.onChange) 
    CartActions.updateCart() 
} 

onChange() { 
    this.setState({ 
    xxx: xxxx 
    }) // or change props like yours if you insist 
} 

render() { 
    return (
     <div className="cart"> 
      {this.state.cart.map((item, i) => <div key={i}>{item.get('name')}</div>)} 
     </div> 
    ); 
} 
+0

通量實現alt.js是做對我來說。 connectToStores方法負責處理這個問題。正如我所說,如果我,例如查詢API,它就會起作用。但與localStore它不知道。 –

+0

這種方法可以工作,但是它可以防止真正的同構渲染,在服務器和客戶端上生成不同的散列。 –

+0

這個問題是舊的,但我現在有同樣的問題,我使用connectToStores,我可以看到商店收到的行動,但視圖不會更新狀態。 – elaich