2015-12-22 83 views
2

我有一個是通過一個「用戶」的終極版道具,看起來像這樣的組件:終極版沒有更新的組件

user: { 
    user: { 
     photos: [] 
    }, 
    userIsFetching: false, 
    userIsFetchError: false 
} 

當「照片」被更新,陣營不會重新呈現。我可以在Redux日誌中看到「照片」確實得到更新。這個問題是由於「照片」被深度嵌套的嗎?

這裏的減速機:

function deleteUserPhoto(user, id) { 
    return { 
     ...user, 
     photos: deletePhoto(user.photos, id) 
    }; 
} 

function deletePhoto(photos, id) { 
    return photos.filter(photo => 
     photo.id !== id 
    ); 
} 

export function user(state, action) { 

    if (typeof state === 'undefined') { 
     state = { 
      user: null, 
      userIsFetching: false, 
      userIsFetchError: false 
     } 
    } 

    switch (action.type) { 
     case USER_REQUEST: 
      return { 
       ...state, 
       userIsFetching: true 
      }; 
     case USER_RESPONSE: 
      return { 
       ...state, 
       user: action.user 
      }; 
     case USER_RESPONSE_ERROR: 
      return { 
       ...state, 
       userIsFetching: false, 
       userIsFetchError: true 
      }; 
     case PHOTO_DELETE: 
      return { 
       ...state, 
       user: deleteUserPhoto(state.user, action.id) 
      }; 
     default: 
      return state; 
    } 
} 

感謝。

+1

你很可能用別的東西來覆蓋'user'屬性。 –

+1

同意。雖然我無法立即發現問題,但是嵌套對象的正確性可能會非常棘手,並且可能會有微妙的方式來改變不應該改變的內容。你可能會考慮像https://github.com/gaearon/normalizr這樣的東西來平整你的商店。另外,當響應回來時,你是否撤消了你的標誌? – acjay

+0

標誌是爲原始用戶提取的。當我與網頁互動時(例如觸發onClick),頁面會更新爲正確的照片。 –

回答

0

我的愚蠢錯誤。道具正在更新,但我正在檢查狀態(由道具初始化),並且我沒有更新道具更改狀態。我只是使用狀態,因爲它是我使用的dropzone mixin所要求的。

1

這可能不是你的真實代碼的情況,但是從我可以在你的代碼樣本中看到:在deletePhoto方法,調用filter應該拋出一個TypeError作爲photos是在初始狀態不確定的。

沒有與只要回到一個新的狀態深深嵌套的屬性完全沒有問題。它在某些時候會變得很麻煩,但像ImmutableJS這樣的圖書館可以幫助我們管理非常複雜的狀態。 調用動作後未更新的視圖是通常由突變狀態引起的常見問題:http://rackt.org/redux/docs/Troubleshooting.html