我们已经使用redux建立了一个项目。在此项目中,我们从api获取信息对象并将其插入商店。现在我们注意到,即使api返回与上一个请求相同的状态,功能组件也会重新呈现。

我们认为这是因为我们要覆盖商店,但我们不确定。

ChatContainer.js

const mapStateToProps = function (state) {
  return {
    content: state.info.content,
    loading: state.info.loading,
  }
}

const ChatContainer = connect(
  mapStateToProps,
)(Chat)
export default ChatContainer


Chat.js

function Chat(props) {

    const { content, loading } = props;
    return (
        <Info content={content} loading={loading} />
    )
}



action.js


export function setInfo(info) {
  return {
    type: SET_INFO, info: {
      content: info,
      loading: false
    }
  }
}


reducer.js

function setInfo(state = { content: [], loading: true }, action) {
  switch (action.type) {
    case SET_INFO:
      return action.info
    default:
      return state
  }
}

const appReducer = combineReducers({
...
  info: setInfo,
...
})
export default appReducer

最佳答案

如果state.info.content是一个对象,则每次使用setInfo对其进行更改时,都会有一个新引用。 React-redux对mapStateToProps的结果进行了浅浅的比较,因此,如果每次重新渲染组件时,您的内容都是不同的引用。 connect HOC具有一个options参数,可用于实现自定义比较。

我的建议是将检查添加到您的setInfo或调用setInfo的代码中,如果数据已经加载/未更改(不知道您的业务逻辑),则不调用您的API。

关于javascript - 即使没有变化,也要重新渲染,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60040908/

10-16 14:11