diff --git a/preview/App.vue b/preview/App.vue
index 5ac3458..d39e012 100644
--- a/preview/App.vue
+++ b/preview/App.vue
@@ -1,13 +1,17 @@
按钮
-
+
-
\ No newline at end of file
diff --git a/src/components/button/index.ts b/src/components/button/index.ts
index f176da4..f487870 100644
--- a/src/components/button/index.ts
+++ b/src/components/button/index.ts
@@ -1,3 +1 @@
-import NiButton from './Button.vue'
-export { NiButton }
-export default NiButton
\ No newline at end of file
+export {default as NiButton} from './Button.vue'
diff --git a/src/components/config/ConfigProvider.vue b/src/components/config/ConfigProvider.vue
index 55d381c..875e008 100644
--- a/src/components/config/ConfigProvider.vue
+++ b/src/components/config/ConfigProvider.vue
@@ -1,18 +1,13 @@
-
-
-
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/config/defaultConfig.ts b/src/components/config/defaultConfig.ts
index ed70bfa..16fb7c4 100644
--- a/src/components/config/defaultConfig.ts
+++ b/src/components/config/defaultConfig.ts
@@ -1,17 +1,17 @@
import { reactive } from "vue"
-import { NiConfig } from "./types"
+import type { NiConfig } from "./types"
const defaultConfig = reactive({
logoName: ['星', '撰'],
+ messageOnMounted: false,
size: 'default',
zIndex: 2000,
namespace: 'ni',
})
-export default defaultConfig
-
function setNiConfig(config: Partial) {
Object.assign(defaultConfig, config)
}
export { setNiConfig }
+export default defaultConfig
diff --git a/src/components/config/index.ts b/src/components/config/index.ts
index ea3d110..1f20577 100644
--- a/src/components/config/index.ts
+++ b/src/components/config/index.ts
@@ -1,5 +1,3 @@
-import NiConfigProvider from './ConfigProvider.vue'
-export * from './types'
-export default NiConfigProvider
-export { useNiConfig } from './useConfig'
+export { default as NiConfigProvider } from './ConfigProvider.vue'
+export { useNiConfig } from './useConfig'
export { setNiConfig } from './defaultConfig'
diff --git a/src/components/config/types.ts b/src/components/config/types.ts
index 1acd67c..4870fba 100644
--- a/src/components/config/types.ts
+++ b/src/components/config/types.ts
@@ -1,5 +1,8 @@
export interface NiConfig {
+ // 配置logo
logoName?: [string, string]
+ // 消息挂载
+ messageOnMounted?: boolean
name?: string
size?: 'small' | 'default' | 'large'
zIndex?: number
diff --git a/src/components/config/useConfig.ts b/src/components/config/useConfig.ts
index 30cdf71..9f92a78 100644
--- a/src/components/config/useConfig.ts
+++ b/src/components/config/useConfig.ts
@@ -3,7 +3,7 @@ import type { NiConfig } from './types'
export function useNiConfig() {
const config = inject>('ni-config')
-
+
if (!config) {
throw new Error('useConfig must be used within NiConfigProvider')
}
diff --git a/src/components/index.ts b/src/components/index.ts
index 9bc4c32..a715597 100644
--- a/src/components/index.ts
+++ b/src/components/index.ts
@@ -1,19 +1,4 @@
-import NiButton from './button'
-import NiLogo from './logo'
-import NiConfigProvider, { useNiConfig } from './config'
-import { setNiConfig } from './config/defaultConfig'
-export {
- NiButton,
- NiLogo,
- NiConfigProvider,
- useNiConfig,
- setNiConfig,
-}
-
-export default {
- NiButton,
- NiLogo,
- NiConfigProvider,
- useNiConfig,
- setNiConfig,
-}
\ No newline at end of file
+export { NiButton } from './button'
+export { NiLogo } from './logo'
+export { NiConfigProvider, useNiConfig, setNiConfig } from './config'
+export { useNiMessage } from './message'
diff --git a/src/components/logo/Logo.vue b/src/components/logo/Logo.vue
index 231420e..64e05b3 100644
--- a/src/components/logo/Logo.vue
+++ b/src/components/logo/Logo.vue
@@ -1,7 +1,7 @@
diff --git a/src/components/logo/index.ts b/src/components/logo/index.ts
index fe5958f..d400407 100644
--- a/src/components/logo/index.ts
+++ b/src/components/logo/index.ts
@@ -1,3 +1 @@
-import NiLogo from './Logo.vue'
-export { NiLogo }
-export default NiLogo
\ No newline at end of file
+export { default as NiLogo } from './Logo.vue'
\ No newline at end of file
diff --git a/src/components/message/Message.vue b/src/components/message/Message.vue
new file mode 100644
index 0000000..290bab7
--- /dev/null
+++ b/src/components/message/Message.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+ {{ msg.content }}
+
+
+
+
+
+
+
+
diff --git a/src/components/message/index.ts b/src/components/message/index.ts
new file mode 100644
index 0000000..8e33d39
--- /dev/null
+++ b/src/components/message/index.ts
@@ -0,0 +1,76 @@
+import { reactive } from "vue"
+import type { MessageOptions, MessageInstance } from "./type"
+import defaultConfig from "~/config/defaultConfig"
+/*
+* 思路
+* 1. 外层message存储一个个进入队列的消息
+* 2. 每个消息实例包含定时器,定时器到时间自动销毁
+* 3. 每个消息实例包含暂停和恢复定时器的方法
+* 4. 每个消息实例包含销毁消息的方法
+* 5. 每个消息实例包含消息ID
+* 6. 每个消息实例包含消息内容
+* 7. 每个消息实例包含消息类型
+* 8. 每个消息实例包含消息持续时间设定
+* ---
+* Message组件被内嵌入ConfigProvider组件中,所以需要ConfigProvider组件先挂载
+*
+*/
+// 消息列表
+const message = reactive([]);
+
+// 使用消息组件
+export const useNiMessage = () => {
+ // 添加消息
+ const addMessage = (options: MessageOptions) => {
+ // 检测是否在NiConfigProvider组件中使用
+ if (!defaultConfig.messageOnMounted) {
+ throw new Error('useMessage must be used within NiConfigProvider!')
+ };
+ // 将时间戳作为消息ID
+ const messageId = new Date().getTime() + Math.random();
+ // 创建定时器,到时间消息自动销毁
+ let timer: NodeJS.Timeout | null = null;
+ // 定时器
+ const startTimer = () => {
+ clearTimer()
+ timer = setTimeout(() => {
+ const index = message.findIndex(item => item.messageId === messageId)
+ message.splice(index, 1)
+ }, options.duration || 3000);
+ }
+ // 销毁消息
+ const destroy = () => {
+ const index = message.findIndex(item => item.messageId === messageId)
+ message.splice(index, 1)
+ }
+ // 清除定时器
+ const clearTimer = () => {
+ timer && clearTimeout(timer)
+ timer = null;
+ }
+ // 执行初次定时器
+ startTimer()
+ // 添加消息
+ message.unshift({
+ ...options,
+ messageId,
+ timer,
+ pause: clearTimer,
+ resume: startTimer,
+ destroy: () => {
+ clearTimer()
+ destroy()
+ }
+ })
+ }
+ return {
+ message,
+ show: addMessage,
+ info: (content: string, option: MessageOptions) => addMessage({ ...option, content, type: 'info' }),
+ success: (content: string, option: MessageOptions) => addMessage({ ...option, content, type: 'success' }),
+ warning: (content: string, option: MessageOptions) => addMessage({ ...option, content, type: 'warning' }),
+ error: (content: string, option: MessageOptions) => addMessage({ ...option, content, type: 'error' }),
+ }
+}
+
+export default useNiMessage
\ No newline at end of file
diff --git a/src/components/message/type.ts b/src/components/message/type.ts
new file mode 100644
index 0000000..c940cfc
--- /dev/null
+++ b/src/components/message/type.ts
@@ -0,0 +1,18 @@
+export interface MessageOptions {
+ content: string
+ type?: 'info' | 'success' | 'warning' | 'error'
+ duration?: number
+}
+
+export interface MessageInstance extends MessageOptions {
+ // 消息ID
+ messageId: number,
+ // 定时器
+ timer: NodeJS.Timeout | null,
+ // 暂停消息延时销毁
+ pause: () => void,
+ // 恢复消息延时销毁
+ resume: () => void,
+ // 销毁消息
+ destroy: () => void,
+}
diff --git a/src/styles/style.scss b/src/styles/style.scss
index b566c1b..ff320a0 100644
--- a/src/styles/style.scss
+++ b/src/styles/style.scss
@@ -60,49 +60,18 @@
animation: $name $duration $timing $delay $iteration $direction $fill;
/*
* 1. $name(必需参数)
-* 动画名称
-* 必须与 @keyframes 定义的名称匹配
-* 例如:fade-in, slide-in-right 等
+* 动画名称 fade-in, slide-in-right 等
* 2. $duration(可选参数,默认值:1s)
-* 动画持续时间
-* 可选值:
-* 时间值:0.5s, 1s, 2s 等
-* 毫秒值:500ms, 1000ms 等
+* 动画持续时间 0.5s, 1s, 2s 500ms, 1000ms 等
* 3. $timing(可选参数,默认值:ease)
-* 动画的时间函数
-* 可选值:
-* linear:匀速
-* ease:缓入缓出(默认)
-* ease-in:缓入
-* ease-out:缓出
-* ease-in-out:缓入缓出
-* cubic-bezier(n,n,n,n):自定义贝塞尔曲线
-* steps(n):分步动画
-* 4. $delay(可选参数,默认值:0s)
-* 动画开始前的延迟时间
-* 可选值:
-* 时间值:0.5s, 1s 等
-* 毫秒值:500ms, 1000ms 等
-* 负值:提前开始动画
-* 5. $iteration(可选参数,默认值:1)
-* 动画重复次数
-* 可选值:
-* 数字:1, 2, 3 等
-* infinite:无限循环
+* 动画的时间函数 linear:匀速 ease:缓入缓出(默认) ease-in:缓入 ease-out:缓出 ease-in-out:缓入缓出
+* cubic-bezier(n,n,n,n):自定义贝塞尔曲线 steps(n):分步动画
+* 4. $delay(可选参数,默认值:0s) 延迟时间 负值:提前开始动画
+* 5. $iteration(可选参数,默认值:1) 数字:1, 2, 3 等 infinite:无限循环
* 6. $direction(可选参数,默认值:normal)
-* 动画方向
-* 可选值:
-* normal:正常播放
-* reverse:反向播放
-* alternate:交替播放(正向->反向)
-* alternate-reverse:交替反向播放(反向->正向)
+* 动画方向 normal:正常播放 reverse:反向播放 alternate:交替播放(正向->反向) alternate-reverse:交替反向播放(反向->正向)
* 7. $fill(可选参数,默认值:forwards)
-* 动画填充模式
-* 可选值:
-* forwards:保持最后一帧
-* backwards:应用第一帧
-* both:同时应用 forwards 和 backwards
-* none:不应用任何填充
+* 动画填充模式 forwards:保持最后一帧;backwards:应用第一帧;both:同时应用 forwards 和 backwards;none:不应用任何填充
*/
}
diff --git a/types/components/button/index.d.ts b/types/components/button/index.d.ts
index 53603e0..474570f 100644
--- a/types/components/button/index.d.ts
+++ b/types/components/button/index.d.ts
@@ -1,3 +1 @@
-import NiButton from './Button.vue';
-export { NiButton };
-export default NiButton;
+export { default as NiButton } from './Button.vue';
diff --git a/types/components/button/types.d.ts b/types/components/button/types.d.ts
index f0279c3..38aed1f 100644
--- a/types/components/button/types.d.ts
+++ b/types/components/button/types.d.ts
@@ -1,12 +1,12 @@
import { ExtractPropTypes, PropType } from 'vue';
export declare const buttonProps: {
readonly type: {
- readonly type: PropType<"default" | "primary" | "success" | "warning" | "danger">;
+ readonly type: PropType<"default" | "success" | "warning" | "primary" | "danger">;
readonly default: "default";
readonly validator: (value: string) => boolean;
};
readonly size: {
- readonly type: PropType<"small" | "medium" | "large">;
+ readonly type: PropType<"small" | "large" | "medium">;
readonly default: "medium";
readonly validator: (value: string) => boolean;
};
diff --git a/types/components/config/defaultConfig.d.ts b/types/components/config/defaultConfig.d.ts
new file mode 100644
index 0000000..cfe7f94
--- /dev/null
+++ b/types/components/config/defaultConfig.d.ts
@@ -0,0 +1,12 @@
+import type { NiConfig } from "./types";
+declare const defaultConfig: {
+ logoName?: [string, string] | undefined;
+ messageOnMounted?: boolean | undefined;
+ name?: string | undefined;
+ size?: "small" | "default" | "large" | undefined;
+ zIndex?: number | undefined;
+ namespace?: string | undefined;
+};
+declare function setNiConfig(config: Partial): void;
+export { setNiConfig };
+export default defaultConfig;
diff --git a/types/components/config/index.d.ts b/types/components/config/index.d.ts
new file mode 100644
index 0000000..a5f0aa2
--- /dev/null
+++ b/types/components/config/index.d.ts
@@ -0,0 +1,3 @@
+export { default as NiConfigProvider } from './ConfigProvider.vue';
+export { useNiConfig } from './useConfig';
+export { setNiConfig } from './defaultConfig';
diff --git a/types/components/config/types.d.ts b/types/components/config/types.d.ts
new file mode 100644
index 0000000..e1bcc78
--- /dev/null
+++ b/types/components/config/types.d.ts
@@ -0,0 +1,9 @@
+export interface NiConfig {
+ logoName?: [string, string];
+ messageOnMounted?: boolean;
+ name?: string;
+ size?: 'small' | 'default' | 'large';
+ zIndex?: number;
+ namespace?: string;
+}
+export type NiConfigKey = keyof NiConfig;
diff --git a/types/components/config/useConfig.d.ts b/types/components/config/useConfig.d.ts
new file mode 100644
index 0000000..682dbc8
--- /dev/null
+++ b/types/components/config/useConfig.d.ts
@@ -0,0 +1,13 @@
+import type { NiConfig } from './types';
+export declare function useNiConfig(): {
+ config: import("vue").ComputedRef<{
+ logoName?: [string, string] | undefined;
+ messageOnMounted?: boolean | undefined;
+ name?: string | undefined;
+ size?: "small" | "default" | "large" | undefined;
+ zIndex?: number | undefined;
+ namespace?: string | undefined;
+ }>;
+ get: (key: keyof NiConfig) => string | number | boolean | [string, string] | undefined;
+ set: (key: keyof NiConfig, value: any) => void;
+};
diff --git a/types/components/index.d.ts b/types/components/index.d.ts
index f016a60..08d2b8d 100644
--- a/types/components/index.d.ts
+++ b/types/components/index.d.ts
@@ -1,6 +1,4 @@
-import NiButton from './button';
-export { NiButton, };
-declare const _default: {
- NiButton: import("vue").DefineComponent<{}, {}, any>;
-};
-export default _default;
+export { NiButton } from './button';
+export { NiLogo } from './logo';
+export { NiConfigProvider, useNiConfig, setNiConfig } from './config';
+export { useNiMessage } from './message';
diff --git a/types/components/logo/index.d.ts b/types/components/logo/index.d.ts
new file mode 100644
index 0000000..8d1640f
--- /dev/null
+++ b/types/components/logo/index.d.ts
@@ -0,0 +1 @@
+export { default as NiLogo } from './Logo.vue';
diff --git a/types/components/logo/types.d.ts b/types/components/logo/types.d.ts
new file mode 100644
index 0000000..a9aa6b8
--- /dev/null
+++ b/types/components/logo/types.d.ts
@@ -0,0 +1,21 @@
+import { ExtractPropTypes, PropType } from 'vue';
+export declare const logoProps: {
+ readonly logoName: {
+ readonly type: PropType;
+ };
+ readonly type: {
+ readonly type: PropType<"default" | "primary">;
+ readonly default: "default";
+ readonly validator: (value: string) => boolean;
+ };
+ readonly size: {
+ readonly type: PropType<"small" | "large" | "medium">;
+ readonly default: "medium";
+ readonly validator: (value: string) => boolean;
+ };
+ readonly disabled: {
+ readonly type: BooleanConstructor;
+ readonly default: false;
+ };
+};
+export type LogoProps = ExtractPropTypes;
diff --git a/types/components/message/index.d.ts b/types/components/message/index.d.ts
new file mode 100644
index 0000000..6f7dd43
--- /dev/null
+++ b/types/components/message/index.d.ts
@@ -0,0 +1,10 @@
+import type { MessageOptions, MessageInstance } from "./type";
+export declare const useNiMessage: () => {
+ message: import("vue").Reactive;
+ show: (options: MessageOptions) => void;
+ info: (content: string, option: MessageOptions) => void;
+ success: (content: string, option: MessageOptions) => void;
+ warning: (content: string, option: MessageOptions) => void;
+ error: (content: string, option: MessageOptions) => void;
+};
+export default useNiMessage;
diff --git a/types/components/message/type.d.ts b/types/components/message/type.d.ts
new file mode 100644
index 0000000..1285c98
--- /dev/null
+++ b/types/components/message/type.d.ts
@@ -0,0 +1,13 @@
+///
+export interface MessageOptions {
+ content: string;
+ type?: 'info' | 'success' | 'warning' | 'error';
+ duration?: number;
+}
+export interface MessageInstance extends MessageOptions {
+ messageId: number;
+ timer: NodeJS.Timeout | null;
+ pause: () => void;
+ resume: () => void;
+ destroy: () => void;
+}
diff --git a/types/index.d.ts b/types/index.d.ts
index ff7e6e8..ec2a3bb 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -1,9 +1,11 @@
import { App } from 'vue';
+import * as components from './components';
export * from './components';
export declare const version = "0.0.1";
export declare const install: (app: App) => void;
declare const _default: {
version: string;
install: (app: App) => void;
+ setNiConfig: typeof components.setNiConfig;
};
export default _default;