gpt4 book ai didi

reactjs - 如果注入(inject)不同的容器,Redux Sagas 会多次触发

转载 作者:行者123 更新时间:2023-12-03 13:34:41 25 4
gpt4 key购买 nike

我们正在使用https://github.com/react-boilerplate/react-boilerplate并拥有包含多个组件的经典商店布局。

我们有一个 redux 商店,用于将产品添加到购物车,它有一个副作用传奇,可以将添加的产品保存到购物车数据库。

由于有多个位置可以将产品添加到购物车,因此我们在一页上使用了同一个 CartContainer 3 次(购物车本身、产品列表和另一个产品列表)。

我们现在遇到的问题是该 api 将被调用 3 次。

我猜这是因为,通过使用容器 3 次,我们也注入(inject)了 3 次 Saga。

我现在的问题是:只注入(inject) Saga 一次,而不必一次又一次重写所有 Saga 的正确方法是什么?

这是我的传奇:

import {
call,
put,
select,
takeLatest,
} from 'redux-saga/effects';
import {getRequest, putRequest} from '../../utils/request';

import {ADD_PRODUCT, LOAD_PRODUCTS} from './constants';
import {
addProductSuccess,
addProductError,
productsLoaded,
productsLoadingError,
} from './actions';
import {makeSelectProduct, makeSelectUserId} from './selectors';


/**
* Github repos request/response handler
*/
export function* getProducts() {
const requestURL = '/api/orders';
const user_id = yield select(makeSelectUserId());
try {
let itemsData = yield call(getRequest, requestURL, user_id);
if (itemsData) {
itemsData = itemsData.slice(-1).items;
}
yield put(productsLoaded(itemsData));
} catch (err) {
yield put(productsLoadingError(err));
}
}

/**
* Github repos request/response handler
*/
export function* addProduct() {
const requestURL = '/api/cart';
const productData = yield select(makeSelectProduct());

try {
const orderData = yield call(putRequest, requestURL, productData);
yield put(addProductSuccess(orderData.id));
} catch (err) {
yield put(addProductError(err));
}
}

/**
* Root saga manages watcher lifecycle
*/
export default function* root() {
yield [
takeLatest(ADD_PRODUCT, addProduct),
takeLatest(LOAD_PRODUCTS, getProducts),
];
}

这是我的容器的导出部分:

export function mapDispatchToProps(dispatch) {
return {
onAddProduct: (id, quantity, variant) => {
dispatch(addProduct(id, quantity, variant));
},
onLoadProducts: (user_id) => {
dispatch(loadProducts(user_id));
},
};
}

const mapStateToProps = createStructuredSelector({
products: makeSelectProducts(),
});

const withConnect = connect(mapStateToProps, mapDispatchToProps);

const withReducer = injectReducer({key: 'cart', reducer});
const withSaga = injectSaga({key: 'cart', saga});


export default compose(withReducer, withConnect)(CartContainer);

最佳答案

您必须更改注入(inject)传奇的方式,以便仅注入(inject)一次。

在您的containers/App/index.js

// ...
import { compose } from 'redux';
import injectSaga from 'utils/injectSaga';
import injectReducer from 'utils/injectReducer';
import reducer from 'containers/CartContainer/reducer';
import saga from 'containers/CartContainer/saga';

function App() { // We don't change this part
// ...
}


// Add this lines
const withReducer = injectReducer({ key: 'cartContainer', reducer });
const withSaga = injectSaga({ key: 'cartContainer', saga });

export default compose(
withReducer,
withSaga,
)(App);

现在在你的`containers/CartContainer/index.js``

import React from 'react':

// ...

class CartContainer extends React.Component {
// ...
}

const withConnect = connect(mapStateToProps, mapDispatchToProps);

// REMOVE THIS LINES //
// const withReducer = injectReducer({ key: 'cartContainer', reducer });
// const withSaga = injectSaga({ key: 'cartContainer', saga });

export default compose(
// withReducer,
// withSaga,
withConnect,
)(CartContainer);

关于reactjs - 如果注入(inject)不同的容器,Redux Sagas 会多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com