Redux/React。在 Redux-Saga 中间件中获取 stackoverflow 循环

Redux/React. Getting a stackoverflow loop in Redux-Saga Middleware

我无法理解我的 Redux Saga middleWare 有什么问题,因为每次当我尝试启动我的 Saga 函数并在下面的组件 MainComponent 中调度它时 - 我得到一个Whosebug 在页面上循环,所有元素因内存泄漏而变得不可复制。

如有任何帮助信息,我将不胜感激!

=== 我的 Redux Saga 中间件:

import { takeEvery } from 'redux-saga'; 
import addData from '../actions';

const createSaga = function* createSaga(dispatch) {
    try {
        yield takeEvery("ADD_DATA", (action) => {
            console.log(action); // getting a Whosebug loop in this Saga function
            dispatch(action);
        });
    } catch (e) { 
        console.log(e) 
    }
}

export default createSaga;

=== 我的行动:

function addData(data) {
    return {
        type: "ADD_DATA",
        data
    }
};

export default addData;

=== 我的索引:

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore, applyMiddleware } from 'redux';
import { Provider } from 'react-redux';
import createSaga from './saga/saga'
import reducers from './reducers';
import createSagaMiddleware from 'redux-saga';

const sagaMidleWare = createSagaMiddleware();
const store = createStore(
    reducers,
    applyMiddleware(sagaMidleWare)
)

sagaMidleWare.run(createSaga, store.dispatch);

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('root')
);

=== 我的组件(如果需要):

import React, { Component } from 'react';
import { connect } from 'react-redux';

function addData(data) {
    return {
        type: "ADD_DATA",
        data
    }
};

class MainComponent extends Component {
    handleUpdate = () => {
        const { dispatch } = this.props;
        const data = 'hi';
        dispatch(addData(data));
    }

    render() {
        const { store } = this.props;
        return (
            <div>
                <button onClick={this.handleUpdate}>Click me!</button>
                <p>{store.state.toString()}</p>
            </div> 
        )
    }
}

export default connect(store => ({store}), dispatch => ({dispatch}))(MainComponent);

问题就在这里

yield takeEvery("ADD_DATA", (action) => {
    console.log(action);
    dispatch(action);
});

你是说每次派遣 ADD_DATA 应该再次派遣另一个 ADD_DATA,一次又一次...

此外,在旁注中,您应该将另一个传奇作为 takeEvery 的第二个参数传递,这样您就可以使用 put 效果而不是像这样的 dispatch

import { put, takeEvery } from 'redux-saga/effects'; 
yield takeEvery('ADD_DATA', function*(action) {
    yield put({type: 'ANOTHER_ACTION'});
});