reactjs状态不通过redux进行更新

时间:2016-07-23 10:11:44

标签: javascript reactjs redux state

我正在尝试使用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状态的值?

1 个答案:

答案 0 :(得分:0)

您每次都发出相同的值。因此,组件只渲染一次。 如需快速测试,请尝试:

startTimer () {
    setInterval(() => {
       var {dispatch, todoTimer} = this.props;
        dispatch(startTimer(todoTimer - 1));
    }, 1000);
},

setInterval每次都应该获得todoTimer值。

<强> webpackbin DEMO