reactjs - 状态减少后 Redux 组件没有重新渲染
问题描述
我有一个问题,即在调度操作后组件没有重新渲染。即使在 redux 开发工具中。动作和状态按预期工作。但是,它(App.js)不会重新渲染(在触发DATE_ClickChange操作之后)。
以下是代码。请帮我解决这个问题。谢谢你。
这是index.js
import React, { Component } from "react";
import ReactDOM from "react-dom";
import "./index.scss";
import "bootstrap/dist/css/bootstrap.min.css";
import App from "./components/App/App";
import { Provider } from "react-redux";
import store from "./store";
class Index extends Component {
render() {
return (
<Provider store={store}>
<div className="indexStyle">
<App />
</div>
</Provider>
);
}
}
ReactDOM.render(<Index />, document.getElementById("index"));
store.js
import { createStore, applyMiddleware, compose } from "redux";
import thunk from "redux-thunk";
import rootReducer from "./reducers/rootReducer";
const initialState = {};
const middleware = [thunk];
const store = createStore(
rootReducer,
initialState,
compose(
applyMiddleware(...middleware),
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)
);
export default store;
rootReducer.js
import { combineReducers } from "redux";
import weatherReducer from "./weatherReducer";
import dateReducer from "./dateReducer";
export default combineReducers({
weatherData: weatherReducer,
dateData: dateReducer
});
dateReducer.js
import { DATE_HandlChange, DATE_ClickChange } from "../actions/types";
import moment from "moment";
const initialState = {
startDate: moment()
};
export default (state = initialState, action) => {
switch (action.type) {
case DATE_HandlChange:
return {
startDate: action.payload.startDate
};
case DATE_ClickChange:
return {
...state,
startDate: action.payload.startDate
};
default:
return state;
}
};
日期动作
import { DATE_HandlChange, DATE_ClickChange } from "./types";
export const dateHandleChange = date => dispatch => {
dispatch({
type: DATE_HandlChange,
payload: {
startDate: date
}
});
};
export const dateClickChange = number => (dispatch, getState) => {
dispatch({
type: DATE_ClickChange,
payload: {
startDate: getState().dateData.startDate.add(number, "d")
}
});
};
应用程序.js
import React, { Component } from "react";
import "./app.scss";
import "react-datepicker/dist/react-datepicker.css";
import DatePicker from "react-datepicker";
import { Button } from "reactstrap";
import Content from "../Content/Content";
import { connect } from "react-redux";
import {
dateHandleChange,
dateClickChange } from "../../actions/dateAction";
class App extends Component {
render() {
return (
<div className="mainPanel">
<div className="datePanel">
<Button
outline
onClick={() => this.clickChange(-1)}
color="info"
className="prevDate"
size="md"
>
Previous
</Button>
<DatePicker
dateFormat="YYYY/MM/DD"
selected={this.props.dateData}
onChange={date => this.props.dateHandleChange(date)}
className="dateInput"
/>
<Button
outline
onClick={() => this.props.dateClickChange(1)}
color="info"
className="nextDate"
size="md"
>
Next
</Button>
</div>
<Content />
</div>
);
}
}
const mapStateToProps = state => ({
dateData: state.dateData.startDate
});
export default connect(
mapStateToProps,
{ dateHandleChange, dateClickChange }
)(App);
解决方案
我在这里不完全确定,但似乎您正在使用此代码直接修改状态startDate: getState().dateData.startDate.add(number, "d")
据我所知,getState() 不会返回状态的副本。这意味着您必须先复制它。这可能是它不会重新渲染的原因。当你直接修改状态时,Redux 不会重新渲染。你不应该直接修改状态。将其视为不可变的并首先制作副本并且不要改变状态。=)
推荐阅读
- python - 如何在字符串中删除模式“On x John 写:”之后的所有内容
- angular - 仅给出单个值的多值可观察流
- javascript - 根据来自 jquery ajax 请求的状态更改徽章颜色
- angular - 在 Angular 中为 Form Builder 组添加模拟类
- android-studio - 方法不会覆盖继承的方法
- python - 将超链接添加到pdf中的匹配字符串
- javascript - 只有一个功能在工作:无法读取 null 的属性
- apache-nifi - 如何重置 nifi 中的等待通知计数器
- c# - Emgu CV制作透明背景
- r - 数值向量列与数值列的比较