Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.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
Javascript 如何在类似Om的不可变应用程序状态下对关系数据建模_Javascript_Reactjs_Immutability_Immutable.js - Fatal编程技术网

Javascript 如何在类似Om的不可变应用程序状态下对关系数据建模

Javascript 如何在类似Om的不可变应用程序状态下对关系数据建模,javascript,reactjs,immutability,immutable.js,Javascript,Reactjs,Immutability,Immutable.js,我正在尝试决定是使用更传统的Flux实现还是使用类似Om的结构。我非常喜欢在javascript中使用带有游标的单个不可变应用程序状态对象,但我不确定如何对关系数据建模。我正在考虑使用类似的方法 我的问题是如何避免重复数据并处理从服务器发送的嵌套关系数据?假设我有一个REST端点,它为我提供库存,每个库存项目都有一个嵌套的供应商。我还有一个供应商的端点。我希望有一个在我的应用程序状态下的所有供应商的列表,但也要在我的库存项目上引用这些供应商。当我对某个供应商进行更新时,我希望它对引用该供应商的所

我正在尝试决定是使用更传统的Flux实现还是使用类似Om的结构。我非常喜欢在javascript中使用带有游标的单个不可变应用程序状态对象,但我不确定如何对关系数据建模。我正在考虑使用类似的方法

我的问题是如何避免重复数据并处理从服务器发送的嵌套关系数据?假设我有一个REST端点,它为我提供库存,每个库存项目都有一个嵌套的供应商。我还有一个供应商的端点。我希望有一个在我的应用程序状态下的所有供应商的列表,但也要在我的库存项目上引用这些供应商。当我对某个供应商进行更新时,我希望它对引用该供应商的所有库存项目进行更改


类似于Om的结构是否适用于此类应用程序,或者更传统的Flux风格的应用程序(具有谨慎的商店)是否更好?

您可能希望研究类似于“Flux”框架的东西。这是绝对优秀的-我们在Docker使用它。这就是为什么它是好的,以及它如何帮助你

为什么要使用redux? 它使用单一商店模式。所有存储都将Redux自身的状态保存在自己的密钥中。状态重复保存的一个示例是:

{
  vendors: [{...}, ...], // The "vendor" store updates this part of the state
  inventory: [...] // the "inventory" store updates this part of the state
}
Redux或Redux提供者是所有组件的父级。因此,所有组件都将状态作为道具接收

单一商店模式如何改善情况?
  • 响应Redux中操作的每个“存储”只更新状态对象的一部分。例如,“vendor”存储仅更新状态的“vendor”键。每次操作发生时,将为单个存储提供当前状态。这使得商店完全纯净。这是伟大的测试,不可变数据,热重新加载,倒带等

  • 因为您的单个顶级Redux存储保存了所有状态,所以每个组件都可以作为道具接收该状态,并在该状态更改时自动重新渲染,即使是来自层次结构之外的无关组件

  • 下面是一个单一商店的实例,因此您可以了解:

    import assign from 'object-assign';
    import consts, { metrics, loading, URLS } from 'consts';
    
    const actions = {
      // As you can see, each action within a store accepts the current "state" 
      // and can modify that state by returning new data.
      [metrics.FETCH_METRICS_PENDING]: (state, data) => {
        return assign({}, state, {status: loading.PENDING});
      },
    
      [metrics.FETCH_METRICS_SUCCESS]: (state, data) => {
        return assign({}, state, {status: loading.SUCCESS, metrics: data.payload});
      },
    
      [metrics.FETCH_METRICS_FAILURE]: (state, data) => {
        return assign({}, state, {status: loading.FAILURE});
      },
    
      [metrics.OBSERVE_METRICS_DATA]: (state, data) => {
        let metrics = state.metrics.slice().concat(data.payload);
        return assign({}, state, {metrics});
      }
    }
    
    // This is the single method that's exported and represents our store.
    // It accepts the current state as its primary argument, plus the action
    // data as a payload.
    //
    // This delegates to the methods above depending on `data.type`.
    export default function metricStore(state = {}, data) {
      if (typeof actions[data.type] === "function") {
        return actions[data.type](state, data);
      }
      return state;
    }
    
    这个模型如何处理关系数据?
    每次通过操作创建者请求数据时,它都可以调度多个操作,同时更新供应商和库存状态。这将在一次渲染中反映在你的应用程序中。

    我有一个非常类似的决定要做。也可以查看Baobab的数据结构。我没有使用过这个,但您可能想查看一下。