From 3f4318e1931e0d5bc355deb5461ee464a75934a4 Mon Sep 17 00:00:00 2001 From: MrKBear Date: Sun, 20 Mar 2022 14:52:05 +0800 Subject: [PATCH] Detach connect function --- source/Context/Context.tsx | 31 +++++++++++++++++++++++++------ source/Context/Setting.tsx | 26 +++++++++++--------------- source/Context/Status.tsx | 15 +++------------ 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/source/Context/Context.tsx b/source/Context/Context.tsx index c5cd4c7..72c052f 100644 --- a/source/Context/Context.tsx +++ b/source/Context/Context.tsx @@ -3,16 +3,18 @@ import { Component, FunctionComponent, ReactNode, Consumer } from "react"; type RenderComponent = (new (...p: any) => Component) | FunctionComponent; -function superConnect, E extends Record>( - consumer: Consumer +function superConnectWithEvent, E extends Record>( + consumer: Consumer, keyName: string ) { return (...events: Array) => { return (components: R): R => { - const C = components as any; + const Components = components as any; + const Consumer = consumer; return class extends Component { private status: C | undefined; private isEventMount: boolean = false; + private propsObject: Record = {}; private handelChange = () => { this.forceUpdate(); @@ -37,12 +39,12 @@ function superConnect, E extends Record>( } public render(): ReactNode { - const Consumer = consumer; return {(status: C) => { this.status = status; + this.propsObject[keyName] = status; this.mountEvent(); - return ; + return ; }} } @@ -56,4 +58,21 @@ function superConnect, E extends Record>( } } -export { superConnect }; \ No newline at end of file +function superConnect>(consumer: Consumer, keyName: string) { + return (components: R): R => { + return ((props: any) => { + + const Components = components as any; + const Consumer = consumer; + + return + {(status: C) => } + + }) as any; + } +} + +export { superConnectWithEvent, superConnect }; \ No newline at end of file diff --git a/source/Context/Setting.tsx b/source/Context/Setting.tsx index eacc522..3665667 100644 --- a/source/Context/Setting.tsx +++ b/source/Context/Setting.tsx @@ -1,4 +1,5 @@ -import { createContext, Component, FunctionComponent } from "react"; +import { createContext } from "react"; +import { superConnect, superConnectWithEvent } from "./Context"; import { Emitter } from "@Model/Emitter"; import { Layout } from "@Model/Layout"; @@ -12,9 +13,11 @@ enum Themes { type Language = "ZH_CN" | "EN_US"; -class Setting extends Emitter< - Setting & {change: keyof Setting} -> { +interface ISettingEvents extends Setting { + change: keyof Setting; +} + +class Setting extends Emitter { /** * 主题 @@ -51,21 +54,14 @@ SettingContext.displayName = "Setting"; const SettingProvider = SettingContext.Provider; const SettingConsumer = SettingContext.Consumer; -type RenderComponent = (new (...p: any) => Component) | FunctionComponent; - /** * 修饰器 */ -function useSetting(components: R): R { - return ((props: any) => { - const C = components; - return - {(setting: Setting) => } - - }) as any; -} +const useSetting = superConnect(SettingConsumer, "setting"); + +const useStatusWithEvent = superConnectWithEvent(SettingConsumer, "setting"); export { - Themes, Setting, SettingContext, useSetting, Language, + Themes, Setting, SettingContext, useSetting, Language, useStatusWithEvent, IMixinSettingProps, SettingProvider, SettingConsumer }; \ No newline at end of file diff --git a/source/Context/Status.tsx b/source/Context/Status.tsx index c9b6b2f..62a19c5 100644 --- a/source/Context/Status.tsx +++ b/source/Context/Status.tsx @@ -9,7 +9,7 @@ import { AbstractRenderer } from "@Model/Renderer"; import { ClassicRenderer, MouseMod } from "@GLRender/ClassicRenderer"; import { Setting } from "./Setting"; import { I18N } from "@Component/Localization/Localization"; -import { superConnect } from "./Context"; +import { superConnectWithEvent, superConnect } from "./Context"; function randomColor(unNormal: boolean = false) { const color = [ @@ -259,21 +259,12 @@ StatusContext.displayName = "Status"; const StatusProvider = StatusContext.Provider; const StatusConsumer = StatusContext.Consumer; -type RenderComponent = (new (...p: any) => Component) | FunctionComponent; - /** * 修饰器 */ -function useStatus(components: R): R { - return ((props: any) => { - const C = components; - return - {(status: Status) => } - - }) as any; -} +const useStatus = superConnect(StatusConsumer, "status"); -const useStatusWithEvent = superConnect(StatusConsumer); +const useStatusWithEvent = superConnectWithEvent(StatusConsumer, "status"); export { Status, StatusContext, useStatus, useStatusWithEvent,