Reactjs 是否对(redux)状态更改没有响应?

Reactjs 是否对(redux)状态更改没有响应?,reactjs,redux,react-redux,Reactjs,Redux,React Redux,由于某些原因,(redux)状态更改时,react不会重新渲染。可能是因为它嵌套在1层中?此外,在redux检查器中,我可以看到状态已正确更改,并且与预期的一样。在手动刷新页面时,我还可以看到它工作正常。但我不明白为什么它不会自动重新渲染 简化类组件 class Users extends Component { render() { const something = this.props.users.users; return (

由于某些原因,(redux)状态更改时,react不会重新渲染。可能是因为它嵌套在1层中?此外,在redux检查器中,我可以看到状态已正确更改,并且与预期的一样。在手动刷新页面时,我还可以看到它工作正常。但我不明白为什么它不会自动重新渲染

简化类组件

class Users extends Component {
    render() {
        const something = this.props.users.users;

        return (
            <div>
                <div className='MAIN_SECTION'>
                    <SearchBar handleChange={(value) => this.setState({searchQuery: value})} />

                    <div className='LIST'>
                        {something.mapObject((user) => <div onClick={() => this.props.deleteUser(user.id)}>{user.name}</div>)}
                    </div>
                </div>
            </div>
        );
    }
}

function mapStateToProps(state) {
    return {
        users: state.users
    };
}

export default connect(mapStateToProps, { deleteUser })(Users);
减速器

export function deleteUser(userhash) {
    return function (dispatch, getState) {
        return new Promise(resolve => setTimeout(resolve, 1000)).then(() => {
            const data = {
                status: 200,
                data: {
                    status: 200
                }
            };

            if (data.status === 200) {
                const newState = getState().users.users;
                delete newState[userhash];

                dispatch({
                    type: DELETE_USER,
                    payload: {
                        data: newState
                    }
                });
            }
        });
    };
}
const INITIAL_STATE = {
    isFetching: true,
    users: {}
};

case DELETE_USER:
    return {
        ...state,
        users: action.payload.data
    };

一旦您分派了删除用户的操作

const something = this.props.users.users;
看起来不对

您正在执行此操作,这意味着必须是this.props.user

            const newState = getState().users.users;
            delete newState[userhash];

            dispatch({
                type: DELETE_USER,
                payload: {
                    data: newState
                }
            });
在渲染中,this.props.users本身就是用户数组

要进行脏修复,请将mapStateToProps更改为:

function mapStateToProps(state) {
  return {
    users: state.users.users || state.users
  };
}
渲染中的更改:

const something = this.props.users;

代码对我来说并不是那么简单。在一个点中,您正在对
用户使用
.map()
,而在另一个点中,您正在对其使用
删除[newHash]
。那么它是数组还是对象

但假设它确实起了作用。你说状态已经正确地改变了

假设初始状态为

{
    isFetching: true,
    users: { users: ['12345', '67890'] }
}
假设用户“12345”被删除,在操作中,我们有以下事件序列

const newState = getState().users.users; // ['12345', '67890']
delete newState[userhash]; // ['67890'] if you use your imagination

dispatch({
     type: DELETE_USER,
     payload: {
         data: newState // ['67890']
})
最后,在减速器中

case DELETE_USER:
return {
    ...state,
    users: action.payload.data // ['67890']
};
所以最后的状态是

{
    isFetching: true,
    users: ['67890']
}

它的形状与原始状态不同-用户不再具有users.users。

因为您在操作中使用Promise,所以必须使用thunk中间件。你在用它吗?@bartekfr是的,我在用,一切都在按预期工作(正如我可以使用的.then()等),状态正在按预期变化。仅react不会重新渲染。如果他的减速机名为
users
一切正常。无论如何,他在构造函数中写什么并不重要,只要props映射是正确的。此外,如果这不正确,初始用户渲染就不会工作。@OmriAharon那么react不会看到道具中嵌套的更改吗?@NealVDV可能是,很难说。。您可以放置断点/console.log并检查它。@OmriAharon我应该把这个
console.log()
函数mapstatetrops(state){console.log(state.users);返回{users:state.users};}
很抱歉,它本来是一个对象,但我使用的是一个自创的“mapObject”函数,该函数的行为与
array.map()相同,但用于对象。因此,为了简单起见,我将其更改为
.map()