Reactjs 是否对(redux)状态更改没有响应?
由于某些原因,(redux)状态更改时,react不会重新渲染。可能是因为它嵌套在1层中?此外,在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 (
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()
。