2017-02-06 54 views
3

該問題可能看起來多餘,但在調用mapStateToProps後,組件似乎沒有更新。下面是我在Home Component(類聲明之外的ofc)中編寫的一段代碼。React Redux:連接到redux後組件未更新

function mapStateToProps(state) { 
    const { tickets } = state; 
    console.tron.log(tickets) 
    if(!tickets.isLoading) { 
    return { 
     loading: false, 
     ticketsModel: tickets.chunkedData 
    } 
    } 
    return { 
    loading: true 
    } 
} 
export default connect(mapStateToProps)(Home); 

一切工作正常,但對道具的更改不會觸發組件中的更新。 PS:我檢查是否有任何狀態突變發生,但沒有它din't。我喜歡重新

case RECEIVE_TICKETS : 
     return Object.assign({},state,{ 
     isLoading: false, 
     chunkedData: action.data.extractChunkedData(), 
     completeData: action.data.getCompleteData(), 
     }); 

A picture demonstrating the last Action Dispatch

編輯一個新的狀態:該問題已排序。我傻了檢查內部componentWillMount更新,而不是componentWillReceiveProps

+0

或許真的是不是就在你家的組成部分?你可以發佈嗎?你是說如果你把一個控制檯登錄到'render',它在狀態改變後不會觸發? – azium

+0

你能分享你的組件代碼嗎? –

+0

@azium確切地。我還沒有完成我的組件代碼。但是當狀態改變時,componentWillUpdate應該被調用。這就是問題出現的地方。 –

回答

1

你可以寫你mapStateToProps更簡明,像這樣:

function mapStateToProps(state) { 
    const { isLoading, chunkedData } = state.tickets; 
    return { 
    loading: isLoading, 
    ticketsModel: chunkedData 
    }; 
} 
export default connect(mapStateToProps)(Home); 

看着你mapStateToProps功能後,和終極版記錄儀,你的問題是最有可能在組件本身。如果您要在組件中渲染this.props.loading,則應該看到true,然後再看到false

另外,我看到你的chunkedData數組沒有初始狀態。當您設置tickets對象的初始狀態時,應將其設置爲空數組。

所以首先你減速的幾行應該是這樣的:

const tickets = (
    state = { 
    isLoading: false, 
    chunkedData: [], 
    // Need more info to know what would go in this object 
    completeData: {} 
    }, 
    action 
) => { 

看看你是否可以看到道具的componentWillReceiveProps生命週期的方法來更改。你應該可以在接下來的練習中使用,只要道具改變就會改變。

瞭解更多關於這裏的生命週期方法:http://busypeoples.github.io/post/react-component-lifecycle/