重新加载页面时丢失道具状态数据

时间:2020-10-02 17:06:54

标签: reactjs redux mapstatetoprops

代码如下:

const mapStateToProps = (state, ownProps) => {
  const id = ownProps.match.params.id;
  const sheets = state.firestore.data.sheets;
  const sheet = sheets && sheets[id];
  const rows = sheet.rows;

  return {
    rows: rows,
  };
};

export default compose(
  firestoreConnect(() => ["sheets"]),
  connect(mapStateToProps)
)(Table); 

数据结构:

sheets:[
  filename:'abc.txt',
  rows:[ {somedata} , {somedata} ]
]

在加载页面时,我能够加载行,但是在重新加载时,我会丢失状态中的数据。这是错误:

TypeError:无法读取未定义的属性“行”

errorpage

2 个答案:

答案 0 :(得分:0)

由于您使用的是redux,因此有一个软件包可帮助您将数据持久存储在本地存储中,这称为redux-persist。即使刷新/关闭页面,您也可以保持状态

答案 1 :(得分:0)

如果您认为使用redux-persist对于您的项目而言过于矫kill过正,则可以采用以下一种方法。 在化简器中,您可以设置初始状态,使其看起来像本地存储中的特定数据。

const INIT_STATE = { pieceOfData: JSON.parse(localStorage.getItem("pieceOfData")) }

第一次获取数据将为空。 在减速器中,您将获得正常状态的更新。

case SET_DATA: { return {...state, pieceOfData: action.payload } }

在操作分派器中,当您获取数据时,将其写入LS并分派相应的操作以更新redux存储:

localStorage.setItem("pieceOfData", JSON.stringify(pieceOfData));
dispatch({type: SET_DATA, payload: pieceOfData});

每当您需要从Redux存储访问该数据时:

const TestComponent = () => {
    const {pieceOfData} = useSelector((state) => state);
    
    return (
        {/*  Remember to check if pieceOfData is already available  */}
        pieceOfData
        ? <p> { pieceOfData.field } </p>
        : <Loader />
    )
}

对于大型项目,我不会建议使用这种方法。在这种情况下,请查看redux-persist之类的插件。