reactjs - React Redux Store 更新,但组件未重新渲染

标签 reactjs redux render react-redux

使用终端测试我的分派(dispatch)操作,Redux-logger 显示我的状态正在正确更新。但是,我的组件不会因状态更改而重新渲染。我查看了有关组件不重新渲染的 SO 答案,大多数答案声称状态正在发生变化;因此,Redux 不会重新渲染。然而,我正在使用 Lodash 的合并来深度重复一个对象,我很确定我不会返回修改后的对象。 (请参阅下面所附的片段)

很想听听你们的一些建议,在这个问题上我很烦恼!

const usersReducer = (state = {}, action) => {
  Object.freeze(state); // avoid mutating state

  console.log(state); 
  // returns an empty object  
  let newState = merge({}, state);
  console.log(newState); 
  // returns my state with my dispatched action object inside  already???
  // newState for some reason already has new dispatched action
  switch (action.type) {
    case RECEIVE_USER:
      let newUser = {[action.user.id] = action.user};
      return merge(newUser, newUser);
    case RECEIVE_USERS:
      newState = {};
      action.users.forEach(user => {
        newState[user.id] = user;
      });
      return merge({}, newState);
    default:
      return state;
  }
};

react 容器组件

import { connect } from 'react-redux';
import { receiveUsers, receiveUser, refreshAll, requestUsers, requestUser } from '../../actions/user_actions';
import allUsers from '../../reducers/selectors';
import UserList from './user_list';

const mapStateToProps = (state) => ({
  users: allUsers(state), // allUsers (selector that takes the state specfically the user Object and returns an array of user Objects)
  state
});

const mapDispatchToProps = (dispatch) => ({
  requestUser: () => dispatch(requestUser()),
  requestUsers: () => dispatch(requestUsers()),
  receiveUsers: (users) => dispatch(receiveUsers(users)),
  receiveUser: (user) => dispatch(receiveUser(user)),
  refreshAll: (users) => dispatch(refreshAll(users))
});

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

React 展示组件

import React from 'react';

class UserList extends React.Component {
  render() {
    const { users, state } = this.props;

    const userItems = users.map((user, idx) => {
        return(<li key={idx}>{user.username}</li>);
    });

    return (
      <div>
        <ul>
          { userItems }
        </ul>
      </div>
    );
  }
}

export default UserList;

react 商店

import { createStore, applyMiddleware } from 'redux';
import createLogger from 'redux-logger';
import RootReducer from '../reducers/root_reducer';

const logger = createLogger();
const configureStore = (preloadedState = {}) => {
  return createStore(
    RootReducer, 
    preloadedState,
    applyMiddleware(logger));
};

// const configureStore = createStore(rootReducer, applyMiddleware(logger));

// oddly enough, when I have the store as a constant and not a function that returns the store constant, dispatching actions through the terminal will correctly update the state and rerender the component 

export default configureStore;

react 选择器

const allUsers = ({ users }) => {
  return Object.keys(users).map(id => (
    users[id]
  ));
};

export default allUsers;

最佳答案

我遇到了类似的问题,以防万一有人偶然发现这个问题,我需要克隆数组才能重新渲染 View :

export const addFieldRow = () => (
    (dispatch: any, getState: any) => {
        const state = getState();
        const myArrayOfObjects = myArrayOfObjectsProp(state);
        const newObject = {
            key: "",
            value: "",
        };
        myArrayOfObjects.push(newObject);
        dispatch(addFieldRowAction({ myArrayOfObjects: [...myArrayOfObjects] })); <== here
    }
);

关于reactjs - React Redux Store 更新,但组件未重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41964204/

相关文章:

reactjs - JSX 文件中的 "&nbsp;"在某些浏览器中被转换为 "Â"

javascript - react : how to load and render external html file?

node.js - 部署到heroku后,后端的req.query在React前端变成了json,如何修复?

javascript - 在 ngrx 中的订阅内部进行管道传输

angular - Meteor 不渲染 html 模板,只渲染路径

javascript - 类型错误 : Cannot read property after refresh or after manipulation

javascript - 如何检查名称是否已存在于 Firebase 实时数据库(Firebase 和 JS)中

redux - 在 Redux Reducer 中执行 Ajax Fetch?

c# - 如何使用 OnRender 事件但仅呈现到 WPF 中的控制区域?

javascript - 使用javascript渲染 map