ReactNative 無限導航頁面的狀態(tài)管理

項目使用的主要框架:

  • React-native 0.61.5
  • React-redux 7.1.3
  • React-navigation 4.2.2
  • Dva 2.0.2

問題

RN項目中遇到了無限向下導航的場景,類似汽車之家論壇踩蔚,帖子明細畫面點擊某個用戶的頭像,進入其動態(tài)畫面再點擊他的帖子,又進入帖子詳情畫面,再點擊其他用戶頭像杀怠,又進入他人動態(tài)畫面....

無限向下導航,即A-->B-->C-->B-->C-->B-->C...到忽;每次畫面B或畫面C出現(xiàn)時吴菠,顯示的內容不同(根據(jù)ID從接口查詢數(shù)據(jù))者填,但畫面結構都是一樣的。

如果不集成Redux/Dva這種狀態(tài)管理橄务,應該是沒問題的幔托,因為狀態(tài)是和畫面實例綁定的,每次畫面B出現(xiàn)時蜂挪,是不同的畫面實例重挑。

如果集成了Redux/Dva狀態(tài)管理工具,則畫面B的所有實例狀態(tài)都被綁定在Redux中了棠涮,后一個畫面B的數(shù)據(jù)加載谬哀,會影響前一個畫面B的頁面顯示(返回的時候)!Model如下:

const defaultState = {
  loading: true,
  userId: null,
  userInfo: null,
  activites: [],
};
export default {
  namespace: 'profile',
  state: {...defaultState},
  reducers: {
    updateState(state, {payload}) {
      let obj = {...state, ...payload};
      return obj;
    },
    ...
  },
  effects: {
    *reset({payload = {}}, {call, put, select}) {
      yield put(createAction('updateState')({...defaultState}));
    },
    ...
  },
};

解決方法

區(qū)分開每次畫面B加載時严肪,保存在Redux中的狀態(tài)史煎,上面profile的model中的狀態(tài)要改為

state: {
  user0: {...defaultState},
  user1: {...defaultState},
  // ...
},

相當于畫面B在Redux中的state多了一個層級,sub state的key為“user” + ID驳糯,這樣每次畫面B出現(xiàn)時篇梭,就增加了一個sub state,這樣就不會影響前一個畫面B了酝枢。

另外恬偷,ID這個狀態(tài)值要維護在畫面B的實例里,畫面B的實例根據(jù)這個ID去Redux中查找對應的全部狀態(tài)帘睦。

@connect(({profile}) => ({...profile}))
class UserProfile extends React.PureComponent {

  constructor(props) {
    super(props);
    this.state = {
      // 當前畫面實例的state key
      stateKey:'user0',
    };
  }
  
  componentDidMount() {
    const {dispatch, navigation} = this.props;
    let {user_id} = navigation.state.params;
    let stateKey = "user" + user_id;
    this.setState({stateKey});
    // 之后每次action袍患,都要帶上sub state key,否則不知道要更新哪個畫面的狀態(tài)
    dispatch(createAction('profile/index')({forceRefresh: true, stateKey}));
  }
}
export default UserProfile;

參考:

https://stackoverflow.com/questions/55211289/stack-same-screen-multiple-times-with-react-navigation

https://stackoverflow.com/questions/49865165/redux-nested-state-with-dynamic-key

https://stackoverflow.com/questions/40023091/react-native-redux-multiple-instances-of-same-state-in-app

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末竣付,一起剝皮案震驚了整個濱河市诡延,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古胆,老刑警劉巖肆良,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逸绎,居然都是意外死亡妖滔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門桶良,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沮翔,你說我怎么就攤上這事陨帆∏” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵疲牵,是天一觀的道長承二。 經常有香客問我,道長纲爸,這世上最難降的妖魔是什么亥鸠? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮识啦,結果婚禮上负蚊,老公的妹妹穿的比我還像新娘。我一直安慰自己颓哮,他們只是感情好家妆,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冕茅,像睡著了一般伤极。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姨伤,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天哨坪,我揣著相機與錄音,去河邊找鬼乍楚。 笑死当编,一個胖子當著我的面吹牛,可吹牛的內容都是我干的炊豪。 我是一名探鬼主播凌箕,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼词渤!你這毒婦竟也來了牵舱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤缺虐,失蹤者是張志新(化名)和其女友劉穎芜壁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體高氮,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡慧妄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剪芍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞淹。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罪裹,靈堂內的尸體忽然破棺而出饱普,到底是詐尸還是另有隱情运挫,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布套耕,位于F島的核電站谁帕,受9級特大地震影響,放射性物質發(fā)生泄漏冯袍。R本人自食惡果不足惜匈挖,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望康愤。 院中可真熱鬧儡循,春花似錦、人聲如沸翘瓮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽资盅。三九已至调榄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呵扛,已是汗流浹背每庆。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留今穿,地道東北人缤灵。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蓝晒,于是被迫代替她去往敵國和親腮出。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353