【发布时间】:2018-12-05 05:35:04
【问题描述】:
我正在使用 React + Redux + Redux-Saga。
在我的场景中,我调用 2 个 api - 用于配置和数据(在获取配置后)
我在调用 Data 时遇到问题。简而言之:
这是有效的:
TestRoute.jsx 文件(尚未使用isConfig):
import React from 'react';
import { connect } from 'react-redux';
import TestComponent from '../components/Test';
const Test = ({ isConfig }) => <div>
<TestComponent />
<TestComponent />
<TestComponent />
<TestComponent />
</div>
const mapStateToProps = state => ({
isConfig: !!state.config.payload.tenantId
});
export default connect(mapStateToProps)(Test);
TestComponent.jsx
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { dataRequestInit } from '../state/actions/data';
class Test extends Component {
componentDidMount() {
this.props.dataRequestInit('https://data/api/url');
}
render() {
return <p>hello</p>;
}
}
const mapStateToProps = state => ({})
export default connect(
mapStateToProps,
{ dataRequestInit }
)(Test);
传奇文件:
const getIsFetching = (state, url) => state.data.isFetching.includes(url);
function* fetchData(url) {
try {
const isFetching = yield select(getIsFetching, url);
if (!isFetching) {
yield put(actions.fetchDataIsFetching(url));
const response = yield call(api, url);
console.log('response', response);
}
} catch (err) {
console.log('handle error', err);
}
}
export default function* DataSaga() {
yield takeEvery(actionTypes.FETCH_DATA_INIT, fetchData);
}
在这种情况下一切正常 - 第一次调用设置 isFetching 并且正在执行一个 api 请求。 Redux DevTools view
但如果我重新创建我的 Route 文件以开始使用 isConfig 标志并有条件地呈现 TestComponents:
const Test = ({ isConfig }) =>
isConfig && (
<div>
<TestComponent />
<TestComponent />
<TestComponent />
<TestComponent />
</div>
);
一切都变得疯狂,4 个 api 调用将发送到服务器。这是因为首先启动了 4x DATA/FETCH_INIT 和随后的 4x DATA/SET_IS_FETCHING 操作 Redux DevTools view 而不是预期的:1x DATA/FETCH_INIT 1x DATA/SET_IS_FETCHING 3x DATA/FETCH_INIT 像以前一样。
有人可以向我解释为什么会这样吗?我在这里缺少什么以及如何解决这个问题?
【问题讨论】:
标签: reactjs react-redux redux-saga