【问题标题】:Avoid usage of JS Map with Immutable Map避免将 JS Map 与 Immutable Map 一起使用
【发布时间】:2019-01-15 11:47:24
【问题描述】:

如何避免原生 Map 与 Immutable.Map 的混淆?

我在 react 项目(ES6 或更高版本,使用 babel 转译)中使用 immutable.js。 所以很多文件都以这样的导入开头:

import { Map } from 'immutable';

在有人将上述导入添加到使用native JS Map 的文件之前,一切都很好,这样new Map() 就变成了Immutable.Map

因此,我可以导入整个不可变库 (import Immutable from 'immutable';) 并使用 Immutable.Map 引用它。但是,这可能会影响生成代码的大小(编译器可能无法确定没有使用整个导入的库)并且可能看起来不太好。

有更好的解决方案吗?我可以以某种方式专门引用原生 JS Map 吗?

【问题讨论】:

    标签: javascript ecmascript-6 immutable.js


    【解决方案1】:

    这里有两个选择。我喜欢第一个,但是 YMMV。

    1. 本机 JavaScript 模块不仅允许您为整个库导入命名,还可以为 individual named imports:import {Map as IMap} from 'immutable'; 命名。现在没有冲突,您的捆绑包大小应该更小。额外的好处:未来的维护者可能会更清楚代码的意图,他们现在会立即知道他们不是在处理普通的原生地图。

    2. 实际的构造函数是全局上下文的一个属性:只需引用window.Map,它不会与您导入到模块命名空间中的那个冲突。

    【讨论】:

      【解决方案2】:

      我建议在您的高阶组件中导入 Map 并将其作为道具传递给您的组件,或者使用import alias(如@Jared Smiths 回答中所建议的那样)

      高阶组件

      import { Map } from 'immutable';
      
      
      class HigherOrderComponent extends React.Component { 
          render() {
              return <myChildComponent map={Map} />;
          }
      }
      

      我的孩子组件

      class HigherOrderComponent extends React.Component { 
          componentDidMount () {
              this.myMap = new this.props.Map();
          }
          render() {
             // ...
          }
      }
      

      【讨论】:

      • 感谢您的意见。我想这会将问题转移到另一个地方而没有真正解决它
      • @dube 如果您在高阶组件中同时使用这两个库,是的。
      猜你喜欢
      • 2016-12-19
      • 2010-10-22
      • 2020-02-09
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多