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 值。

webpackbin DEMO