2016-03-04 31 views
-1

有很多在線的待辦事項列表示例。那些特別是你可以編輯待辦事項的地方。在商店中存儲您正在編輯的內容似乎很明顯。如何從不同來源存儲編輯狀態

但現在圖像,如果你有兩個待辦事項列表在同一頁面上。假設這兩個待辦事項清單是相同的,也就是同一個實體。

如果您在一個待辦事項列表中編輯並顯示他們正在編輯。

在商店中表示源的最佳方式是什麼?你會如何將它發送給動作創建者?

+0

我不清楚你試圖達到什麼目的。這是什麼意思是「同一個實體」?總是完全一樣?所以列表1中的所有編輯都實時反映在列表2中?這兩個列表都指向商店中的同一個列表? – wintvelt

+0

@wintvelt是的兩個列表顯示了完全相同的待辦事項。兩方面都有變化。但是,當在一個列表中編輯待辦事項時,另一個列表不顯示它正在編輯,直到完成 – jshthornton

回答

0

根據您的評論,您希望兩個Todo組件都可以引用相同的數據,即如果您將Todo添加到您想要的其中一個列表中,則反之亦然。這意味着他們共享相同的數據,這實際上簡化了事情。簡化爲簡潔

class Store extends EventEmitter { 
    constructor() { 
    super() 
    this.data = [ 'a', 'b', 'c' ] 
    } 

    mutate(index, value) { 
    this.data[ index ] = value 
    this.onChange() 
    } 

    onChange() { 
    this.emit('change', this.data) 
    } 
} 

var store = new Store() 

class MyComponent extends React.Component { 
    constructor(props) { 
    super(props) 
    this.state = store.data 
    } 

    componentWillMount() { 
    store.on('change', data => this.setState(data)) 
    } 
} 

setTimeout(() => { 
    store.mutate(1, 100) 
}, 1000) 

類在本普通的例子的關鍵是,MyComponent實例偵聽改變底層數據存儲(你可以通過註冊回調,或採用實現相同的Flux風格的調度程序或許多其他方法)。當數據發生變化時,它會發出事件並將數據傳遞給任何用戶。在這種情況下,用戶將獲取數據並設置其狀態,從而觸發重新呈現以保持UI同步。

如果您真的想重複使用您的Todo組件,以便您的應用中可以有多個待辦事項列表,那麼您只需要有一種方法來區分組件需要的數據。實現此目的的一種非常簡單的方法是觸發一個從您的商店請求數據源的函數(而不是如示例中的硬編碼),任何更改數據的請求都需要識別正確的數據源,但UI通過傾聽和響應突變事件將保持一致。

+0

製作可重用組件或存儲數據時沒有任何問題。我正在考慮的部分是在屏幕上同時出現兩個待辦事項列表。但是,一方正在編輯一個項目,另一個則不是。 – jshthornton

+0

那麼你的問題還不夠清楚,你的評論只會讓它更加混亂。您可能希望兩個組件引用相同的數據,或者您希望兩個組件具有不同的數據源,我的答案解決了這兩種情況並解決了其中一個問題。如果你有不同的要求,可能值得關閉這個問題並開始一個新的問題。如果您實例化組件的兩個實例,則它們的狀態將有所不同,除非您專門同步它們(即通過監聽單個數據源)。 –

+0

+1這個答案。我同意@MattStyles,你需要澄清,如果答案不符合你的需要。 – wintvelt