我正在尝试使用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);
在这个页面上,我希望锚标记执行&#34; startTimer&#34;将减少&#34; todoTimer&#34;的值的函数。 state by 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(
}
其他一切正常,因为我可以看到&#34; timerTodo&#34;状态在控制台中每1秒打印一次(由startTimer函数执行)。然而,todoTimer的价值永远不会改变,即使我通过&#34; todoTimer - 1&#34; startTimer操作的值。
我对这种情况感到奇怪的一件事是&#34; dispatch(actions.startTimer(todoTimer - 1));&#34;火,但只有一次。因此,一旦todoTimer状态的值减1,它就会停止更新todoTimer状态,而setInterval函数中的其他代码就像&#34; console.log(todoTimer)&#34;每隔一秒运行一次。
我可以做什么来每秒减少todoTimer状态的值?
答案 0 :(得分:0)
您每次都发出相同的值。因此,组件只渲染一次。 如需快速测试,请尝试:
startTimer () {
setInterval(() => {
var {dispatch, todoTimer} = this.props;
dispatch(startTimer(todoTimer - 1));
}, 1000);
},
setInterval每次都应该获得todoTimer值。
<强> webpackbin DEMO 强>