ES6 - 使用 getter 导出模块

9

我希望导出一个模块,该模块从某个全局对象中获取其定义。

大致如下:

export {
  get DynamicModule() {
    return __globalFluxStorage.state.property.property.property.property
  }
}

...

import {DynamicModule} from 'dynamic-module'

我们有一个复杂的flux存储,DynamicModule只是一种访问__globalFluxStorage.state.property.property.property.property的方式,无需输入长属性访问器。这可行吗?谢谢。
编辑:
由于我正在使用babel,尝试了以下代码:
Object.defineProperty(module.exports, "Forms", {
  get: function() {
    return __globalFluxStorage.state.property.property.property.property
  }
});

但是不起作用,即{DynamicModule}是未定义的undefined

2
你的 export 语法无效。 - Bergi
你能展示一下如何使用 DynamicModule 导入的例子吗? - Jivings
1
@Bergi 是的,它是无效的,我只是在演示我想要做什么。 - user3367701
@Jivings 看看导入语句,它基本上只是一种语法糖,可以避免输入长字段访问器。请注意,__globalFluxStorage也是动态加载的,因此需要一个getter函数来访问它。 - user3367701
3个回答

5

不可能为模块导出变量创建getter,因为它们是变量绑定,而不是属性。

但是,您可以将其作为默认导出项:

export default __globalFluxStorage.state.property.property.property.property;

import DynamicModule from 'dynamic-module';

如果您想要一个有名称的导入,您需要在导出时声明该名称:

export var DynamicModule = __globalFluxStorage.state.property.property.property.property;

import {DynamicModule} from 'dynamic-module';

这也允许在模块加载时无法立即获取值时稍后更改该值:
export var DynamicModule;
…
DynamicModule = __globalFluxStorage.state.property.property.property.property;

(虽然在这种情况下,您可能希望考虑导出Promise或EventEmitter)


谢谢!刚刚了解了更多关于export var以及导出值如何被引用的内容。 - user3367701

0

如果您需要在导入时每次重新评估值,则可以使用getter导出对象或导出函数。

export const _ = {
  get DynamicModuleGetter() {return __globalFluxStorage.state.property.property.property.property}
}

export function DynamicModuleFunction() {return __globalFluxStorage.state.property.property.property.property}

然后在导入中

import { _, DynamicModuleFunction } from 'dynamic-module'

// getter
const value1 = _.DynamicModuleGetter
const {DynamicModuleGetter} = _        // this evaluates the getter

// function
const value2 = DynamicModuleFunction()

一个更详细的例子

let obj = {
  foo: {
    bar: {
      baz: {
        bak: {
          value: 1
        },
        fak: {
          value: 2
        }
      }
    }
  }
}

export const _ = {
  get shortcut() {return obj.foo.bar.baz}
}

export function shortcut() {return obj.foo.bar.baz}

导入

import { _, shortcut } from './shortcut'

let g = _.shortcut.bak.value       // g = 1
let f = shortcut().fak.value       // f = 2
let {shortcut: {bak: {value}}} = _ // value = 1

-1

const temp = {
    get myGetter() { return 1; }
}
export const myGetter  = temp.myGetter;


为什么不直接写export const myGetter = 1;呢? - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接