reactjs 状态不通过 redux 更新
reactjs state not updating via redux
我正在尝试使用 ReactJS 和 Redux 构建一个简单的计时器应用程序,但在 redux 中遇到了一些状态问题。
这是代码。
import React from "react";
var {connect} = require('react-redux');
var actions = require('actions');
export var TodoBtns = React.createClass({
startTimer: function (todoTimer) {
var {dispatch} = this.props;
setInterval(() => {
console.log(todoTimer);
dispatch(actions.startTimer(todoTimer - 1));
}, 1000);
render: function () {
var {todoTimer} = this.props;
return (
<div>
<a className="button" onClick={() => {
this.startTimer(todoTimer);
}}>Start</a>
<p>{todoTimer}</p>
</div>
);
}
});
export default connect(
(state) => {
return {
todoTimer: state.todoTimer
};
}
)(TodoBtns);
在此页面上,我希望锚标记执行 "startTimer" 函数,该函数会将 "todoTimer" 状态的值减 1 并将其呈现在视图中以创建计时器效果。
这是操作页面的样子。
export var startTimer = (todoTimer) => {
return {
type: "START_TIMER",
todoTimer
};
};
这是 reducer 页面的样子。
export var startTimerReducer = (state = 0, action) => {
switch (action.type) {
case "START_TIMER":
return action.todoTimer;
default:
return state;
}
};
这就是商店配置页面的样子。
import * as redux from "redux";
import {startTimeReducer} from "reducers";
export var configure = (initialState = {}) => {
var reducer = redux.combineReducers({
todoTimer: startTimeReducer
});
var store = redux.createStore(reducer, initialState, redux.compose(
}
其他一切正常,因为我可以看到每 1 秒在控制台中打印出 "timerTodo" 状态(由 startTimer 函数执行)。但是,即使我将 "todoTimer - 1" 值传递给 startTimer 操作,todoTimer 的值也永远不会改变。
我觉得这种情况很奇怪的一件事是 "dispatch(actions.startTimer(todoTimer - 1));" 确实会触发,但只会触发一次。因此,一旦 todoTimer 状态的值递减 1,它就会停止更新 todoTimer 状态,而 setInterval 函数中的其他代码,如 "console.log(todoTimer)" 每隔一秒保持 运行。
如何每隔一秒递减 todoTimer 状态的值?
您每次都发送了相同的值。因此组件只渲染一次。
要进行快速测试,请尝试:
startTimer () {
setInterval(() => {
var {dispatch, todoTimer} = this.props;
dispatch(startTimer(todoTimer - 1));
}, 1000);
},
setInterval 应该每次都获取 todoTimer 值。
我正在尝试使用 ReactJS 和 Redux 构建一个简单的计时器应用程序,但在 redux 中遇到了一些状态问题。
这是代码。
import React from "react";
var {connect} = require('react-redux');
var actions = require('actions');
export var TodoBtns = React.createClass({
startTimer: function (todoTimer) {
var {dispatch} = this.props;
setInterval(() => {
console.log(todoTimer);
dispatch(actions.startTimer(todoTimer - 1));
}, 1000);
render: function () {
var {todoTimer} = this.props;
return (
<div>
<a className="button" onClick={() => {
this.startTimer(todoTimer);
}}>Start</a>
<p>{todoTimer}</p>
</div>
);
}
});
export default connect(
(state) => {
return {
todoTimer: state.todoTimer
};
}
)(TodoBtns);
在此页面上,我希望锚标记执行 "startTimer" 函数,该函数会将 "todoTimer" 状态的值减 1 并将其呈现在视图中以创建计时器效果。
这是操作页面的样子。
export var startTimer = (todoTimer) => {
return {
type: "START_TIMER",
todoTimer
};
};
这是 reducer 页面的样子。
export var startTimerReducer = (state = 0, action) => {
switch (action.type) {
case "START_TIMER":
return action.todoTimer;
default:
return state;
}
};
这就是商店配置页面的样子。
import * as redux from "redux";
import {startTimeReducer} from "reducers";
export var configure = (initialState = {}) => {
var reducer = redux.combineReducers({
todoTimer: startTimeReducer
});
var store = redux.createStore(reducer, initialState, redux.compose(
}
其他一切正常,因为我可以看到每 1 秒在控制台中打印出 "timerTodo" 状态(由 startTimer 函数执行)。但是,即使我将 "todoTimer - 1" 值传递给 startTimer 操作,todoTimer 的值也永远不会改变。
我觉得这种情况很奇怪的一件事是 "dispatch(actions.startTimer(todoTimer - 1));" 确实会触发,但只会触发一次。因此,一旦 todoTimer 状态的值递减 1,它就会停止更新 todoTimer 状态,而 setInterval 函数中的其他代码,如 "console.log(todoTimer)" 每隔一秒保持 运行。
如何每隔一秒递减 todoTimer 状态的值?
您每次都发送了相同的值。因此组件只渲染一次。 要进行快速测试,请尝试:
startTimer () {
setInterval(() => {
var {dispatch, todoTimer} = this.props;
dispatch(startTimer(todoTimer - 1));
}, 1000);
},
setInterval 应该每次都获取 todoTimer 值。