当 redux 状态更新时,React 组件不更新

Posted

技术标签:

【中文标题】当 redux 状态更新时,React 组件不更新【英文标题】:React component not updating when redux state is updating 【发布时间】:2019-06-13 15:02:09 【问题描述】:

我正在触发一个动作来执行一些切换功能,但是,即使 redux 状态是,我的 react 组件也没有重新渲染

const Countries = ( countries, toggleCountry ) => (
  <div>
    <h4> All Countries </h4>
    <div className="container">
      countries.map((country, index) => (
        <div
          key=index
          className=`countryContainer $country.visited ? 'visited' : ''`
        >
          <img src=country.flag  />
          <p className="countryName"> country.name </p>
          <button onClick=() => toggleCountry(country.name)>
            country.visited ? 'undo' : 'visited'
          </button>
        </div>
      ))
    </div>
  </div>
);

const mapStateToProps = ( countries ) => (
  countries
);

const mapDispatchToProps = dispatch =>
  bindActionCreators(
    
      toggleCountry
    ,
    dispatch
  );

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(Countries);

当我单击此按钮时,它会正确切换到 redux 状态,但组件不会重新渲染以显示新按钮标签或更改类名

这是我的减速器:

常量初始状态 = []

export default(state = initialState, action) => 
  switch(action.type)
    case 'UPDATE_INITIAL_COUNTRIES':
      return state.concat(action.countries)
    case 'UPDATE_COUNTRY_VISITED':
      return state.map(country => (
        country.name === action.name ? ...country, visited: !country.visited : country
      ))
    default:
      return state;
  

和我的动作创建者

export const toggleCountry = countryName => 
  return dispatch => 
    dispatch( type: 'UPDATE_COUNTRY_VISITED', countryName )
  

【问题讨论】:

你能显示你的toggleCountry动作创建者代码吗? @VuHuuCuong 完成 还有相应的reducer :) @VuHuuCuong 也完成了 翻转清酒,修复它。使用name 而不是`countryName` facepalm 【参考方案1】:

该操作需要action.name,但接收到的是action.countryName

问题来了

export const toggleCountry = countryName => 
  return dispatch => 
    dispatch( type: 'UPDATE_COUNTRY_VISITED', countryName )
  

修复:

export const toggleCountry = name => 
  return dispatch => 
    dispatch( type: 'UPDATE_COUNTRY_VISITED', name )
  

【讨论】:

【参考方案2】:

这里country.name === action.name ? ...country, visited: !country.visited : country 您正在搜索 action.name 但在下面的声明中您没有为有效负载提供正确的名称

export const toggleCountry = countryName => 
      return dispatch => 
        dispatch( type: 'UPDATE_COUNTRY_VISITED', countryName )
      
    

修复:

export const toggleCountry = countryName => 
      return dispatch => 
        dispatch( type: 'UPDATE_COUNTRY_VISITED', name :countryName )
      
    

【讨论】:

以上是关于当 redux 状态更新时,React 组件不更新的主要内容,如果未能解决你的问题,请参考以下文章

React Native 和 Redux:为啥子组件不会在每次状态更新时重新渲染?

React 中的 Redux 详解:

React Redux Store 更新,但组件不重新渲染

React redux 不更新全局状态

关于redux

Redux - 状态正在更新,但 React 组件没有