Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
React native 反应本机+;Redux:第三方库的函数放在哪里?_React Native_Redux - Fatal编程技术网

React native 反应本机+;Redux:第三方库的函数放在哪里?

React native 反应本机+;Redux:第三方库的函数放在哪里?,react-native,redux,React Native,Redux,我正在创建一个使用地理位置库()的电子商务应用程序 我有一个orderState: const ordersInitState = { lineItems: [], status: ORDER_STATUSES.AWAITING_CHECKOUT, }; const ordersReducer = (prevState=ordersInitState, action) => { switch(action.type) { ... case actions.OR

我正在创建一个使用地理位置库()的电子商务应用程序

我有一个
orderState

const ordersInitState = {
  lineItems: [],
  status: ORDER_STATUSES.AWAITING_CHECKOUT,
};

const ordersReducer = (prevState=ordersInitState, action) => {
  switch(action.type) {
    ...
    case actions.ORDERS.REMOVE_ITEM:
      const lineItems = [...prevState.lineItems];
      const indexToRemove = action.payload;
      lineItems.splice(indexToRemove, 1);

      const status = lineItems.length > 0 ? prevState.status : ORDER_STATUSES.AWAITING_CHECKOUT;

      return {
        ...prevState,
        status,
        lineItems,
      };
    default:
      return prevState;
  }
}

export default ordersReducer;
如您所见,允许客户端从购物车中删除项目。如果他们最终删除了所有内容,他们的订单状态将重置。如果他们最终清空了购物车(
lineItems.length==0
),我还想从地理位置库运行一个简单的行:

BackgroundGeolocation.removeGeofence(“blah”)

我该把这个放在哪里?在减速器中这样做感觉不对,因为它与状态无关。它也不是特定于某个特定组件的,所以将它放在我的某个组件中是没有意义的


我对redux还是有点陌生,所以我不确定将非状态相关的方法放在哪里。

您正在寻找的东西的常用名称是“副作用”中间件。抽象地说,当应用程序状态更改时,您希望在外部系统(在本例中为地理位置库)中产生影响

这个用例有很多库。一些比较流行的是和。它们都是很好的工具,有助于为管理复杂的副作用提供结构,但它们都带来了巨大的概念开销,应该只在真正需要时使用

如果您想要一个快速而简单的解决方案,您可以创建一个简单的JavaScript模块,
subscribe
s来订阅您的商店更改,并为您执行副作用:

import store from '../your/redux/store;

let previousCount = 0;
store.subscribe(() => {
  const count = store.getState().orders.lineItems.length;
  if (count === 0 && previousCount > 0) {
    // someone just emptied the cart, so execute side-effect
    BackgroundGeolocation.removeGeofence("blah");
  }  
  previousCount = count;
});  

然后,如果您发现自己反复需要这种类型的解决方案,您可以访问上面提到的库之一。

太棒了!!我不知道这个存在!谢谢