2017-04-19 23 views
1

我一直在搞一些代碼,我想我只是意識到了一些愚蠢的東西。在沒有Flux或Redux的情況下在React中使用Immutable.js是一個愚蠢的錯誤。在沒有Flux或Redux的情況下使用Immutable.js

toggleTask(task) { 
    const found = _.find(this.state.taskList, task => task.name === task); 
    found.isDone = !found.isCompleted; 
    const index = _.findIndex(this.state.taskList, task => task.name === task); 

    const temp = Immutable.fromJS(this.state.taskList); 
    temp.setIn([index, 'isDone'], found.isDone).toJS(); 

    this.setState({ taskList: temp.toJS() }); 

} 

所以基本上我才意識到有多少傻瓜我是我是在製造一個不可變對象,改變了它使用Immutable.js方法再變回一個數組。它沒用,因爲淺比較應該沒有不可變對象。

shouldComponentUpdate(nextProps) { 

    return (this.props.name !== nextProps.name || this.props.priority !== nextProps.priority || this.props.isDone !== nextProps.isDone ); 
} 

我一直在使用lodash方法,但由於我單獨比較道具,因爲他們原語(如字符串和布爾值不能immutables反正元),我不認爲這真的事情,即使我沒有使用它也可能會起作用。

toggleTask(task) { 
    const found = _.find(this.state.taskList, task => task.name === task); 
    found.isDone = !found.isDone; 
    this.setState({ taskList: this.state.taskList }); 
} 

所以我說錯了,React中的Immutable.js在沒有Redux或Flux的情況下是無用的嗎?有沒有我不正確的理解?我看過示例,因爲我從未使用過Flux或Redux,所以它們對我來說並不合適。

+0

您沒有正確使用庫...與Flux/Redux無關。 – c0deNinja

回答

1

是的,你實際上是在正確的軌道上。爲什麼Immutable.js在Redux/Flux中更有用是因爲Immutable.js允許您使用深嵌套的json對象進行廉價的淺層比較。這是它的主要優勢。在你的情況中,我懷疑你有一個簡單的待辦事項應用程序,其中你的狀態是一個簡單數組列表,在這種情況下,你不會從使用Immutable.js中得到任何東西,因爲你可以比較屬性,這並不昂貴。你也許在Redux應用程序中不需要它,但是在大型項目中,你可能經常會有非常大的嵌套json對象,在這種情況下,Immutable.js非常有用。

+0

即使沒有Redux/Flux,淺比較也很好。 – Sulthan

1

Immutable與Redux或Flux無關。

您可以在沒有Immutable的情況下使用Flux和Redux,您可以在沒有Flux和Redux的情況下使用Immutable

Immutable有助於促進基於不可變數據結構的良好編程風格。就這樣。這種編程風格在函數式編程和React方面非常好。

Immutable不是唯一的框架在做同樣的事情。 Javascript有它自己的Object.freeze方法,使對象不可變,沒有額外的容器。您也可以使用icepick等。

+0

但是它沒用,因爲你不能用setState和Immutable對象。 – aLex

+0

@aLex你爲什麼認爲你不能在一個不可變的對象上使用'setState'? – Sulthan

+0

因爲它不起作用,除非我用toJS()將它轉換回javascript對象。 – aLex

相關問題