当前位置: 首页 > 知识库问答 >
问题:

React/Flux Dispatcher as Singleton in Typescript

魏毅
2023-03-14

我正在TypeScript中重建Atlassian React-Flux教程(使用来自tsd的React、Flux和Node的绑定),但在实现dispatcher时遇到了一个问题,它本质上是一个单例。

我正在尝试以下方法:

AppDispatcher.ts

export var instance = AppDispatcher.getInstance();
class AppDispatcher extends Flux.Dispatcher<AppPayload> {

    private static _instance:AppDispatcher = new AppDispatcher();

    constructor() {
        super()
        if(AppDispatcher._instance){
            throw new Error("Error: Using this constructor should not be possible...WTH javascript");
        }
        AppDispatcher._instance = this;
    }

    public static getInstance():AppDispatcher
    {
        return AppDispatcher._instance;
    }
...
}

就像在教程中一样,我使用localStorage上的JSON文件来伪造Web API。所以我的ActionCreator执行以下操作:

ActionCreator.ts

import AppDispatcherInstance = require('../dispatcher/AppDispatcher');

//ActionCreator
//In Flux ActionCreators
export function receiveAll(rawNodes:any) {
    AppDispatcherInstance.instance.handleServerAction(AppDispatcherInstance.ActionIdentifier.REFRESH_FROM_SERVER, rawNodes)
}

不幸的是,我得到一个运行时异常Uncaught TypeError:无法读取指向转译的Javascript行的未定义属性“getInstance”

exports.instance = AppDispatcher.getInstance();
  1. 我在TypeScript中实现单例错误吗?
  2. 有没有更好的方法来做到这一点?我想过根本不写类,只导出某些函数(就像其他SO问题中推荐的那样)到单例,但我仍然想扩展Flux.Dispatcher类?

共有2个答案

锺离锦
2023-03-14

正如评论所建议的,您需要将使用类的代码移动到该类的声明下方。类只是变量,JavaScript中的变量按顺序初始化。

通常,您不需要在 TypeScript 中使用显式类单例模式。请参阅如何在 TypeScript 中定义单例

class Singleton {
    /* ... lots of singleton logic ... */
    public someMethod() { ... }
}

// Using
var x = Singleton.getInstance();
x.someMethod();
namespace Singleton {
    export function someMethod() { ... }
}
// Usage
Singleton.someMethod();
var x = Singleton; // If you need to alias it for some reason
李跃
2023-03-14

以下是我在React/Flux项目中如何使用模块的单例:

class AppDispatcher extends Flux.Dispatcher {
    // ...
}

export default new AppDispatcher();

单例可以导入到另一个文件中,例如:

import AppDispatcher from "./AppDispatcher";
AppDispatcher.dispatch(...);

如果您需要导出的类类型,您可以将export添加到class AppDispatcher并以不同的名称导入单例,如果您需要两者在同一个文件中(我倾向于需要这在单元测试中):

< code >从导入AppDispatcherInstance,{AppDispatcher}。/AppDispatcher"

 类似资料:
  • 问题内容: 我注意到可以这样导入: …或像这样: 第一个导入模块中的所有内容(请参阅:导入整个模块的内容) 第二个仅导入模块导出(请参阅:导入默认值) 似乎这两种方法是不同的,并且根本上是不兼容的。 为什么它们都起作用? 请参考源代码并解释该机制…我有兴趣了解其工作原理。 ES6常规模块信息回答了该问题。 我在问使模块像这样工作的机制。在这里,它似乎与源代码中的 “ hacky”导出机制有关,但尚

  • 这篇快速上手指南会教你如何将TypeScript与React结合起来使用。 在最后,你将学到: 使用TypeScript和React创建工程 使用TSLint进行代码检查 使用Jest和Enzyme进行测试,以及 使用Redux管理状态 我们会使用create-react-app工具快速搭建工程环境。 这里假设你已经在使用Node.js和npm。 并且已经了解了React的基础知识。 我们之所以使

  • 我已经改用react Native制作跨平台应用程序(虽然没有制作)。我只是想要一个答案,我的问题,反应和反应之间的区别。我在网上搜索了一下,但没有找到合适的答案。

  • 问题内容: 与 哪个更好,为什么? 还是除了以后编写更少的代码外没有其他区别? 写作是否意味着只导入Component对象? 问题答案: 让您代替。它减少了React名称空间的键入和重复,这通常是一种理想的现代编码约定。 此外,Webpack 2和Rollup之类的工具会“摇晃”,这意味着任何未使用的导出都不会捆绑到您的最终代码中。使用/,您可以保证所有React的源代码都将被捆绑。使用,某些工具

  • 本文向大家介绍react-native 启动React Native Packager,包括了react-native 启动React Native Packager的使用技巧和注意事项,需要的朋友参考一下 示例 在最新版本的React Native上,无需运行打包程序。它将自动运行。 默认情况下,这将在端口8081上启动服务器。要指定服务器所在的端口            

  • 我正在使用“React admin”创建一个管理界面(前端)。我正在使用spring boot作为我的REST API。我的React应用程序的url是:“http://localhost:3000”。我的spring boot API的url是:“http://localhost:8080”。 下面是CORS配置的spring boot代码,它在一个单独的类中,称为CORSCONFIG: 下面是

  • 主要内容:React 实例React 支持一种非常特殊的属性 Ref ,你可以用来绑定到 render() 输出的任何组件上。 这个特殊的属性允许你引用 render() 返回的相应的支撑实例( backing instance )。这样就可以确保在任何时间总是拿到正确的实例。 使用方法 绑定一个 ref 属性到 render 的返回值上: 在其它代码中,通过 this.refs 获取支撑实例: 完整实例 你可以通过使用

  • 主要内容:React 实例React 组件的数据可以通过 componentDidMount 方法中的 Ajax 来获取,当从服务端获取数据时可以将数据存储在 state 中,再用 this.setState 方法重新渲染 UI。 当使用异步加载数据时,在组件卸载前使用 componentWillUnmount 来取消未完成的请求。 以下实例演示了获取 Github 用户最新 gist 共享描述: React 实例 cla