From d30aa9b100165736cdb330a0fa09182de2bde002 Mon Sep 17 00:00:00 2001 From: liuyijun <3476078473@qq.com> Date: Wed, 23 Jun 2021 21:21:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=90=E4=BA=A4overlay=E9=81=AE?= =?UTF-8?q?=E7=BD=A9=E5=B1=82=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config.json | 10 +++++ src/packages/avatar/demo.tsx | 52 +++++++++++++-------- src/packages/avatar/doc.md | 40 ++++++++--------- src/packages/button/button.tsx | 2 - src/packages/cell/cell.tsx | 6 ++- src/packages/overlay/demo.scss | 16 +++++++ src/packages/overlay/demo.tsx | 48 ++++++++++++++++++++ src/packages/overlay/doc.md | 49 ++++++++++++++++++++ src/packages/overlay/index.ts | 2 + src/packages/overlay/overlay.scss | 47 +++++++++++++++++++ src/packages/overlay/overlay.tsx | 75 +++++++++++++++++++++++++++++++ 11 files changed, 304 insertions(+), 43 deletions(-) create mode 100644 src/packages/overlay/demo.scss create mode 100644 src/packages/overlay/demo.tsx create mode 100644 src/packages/overlay/doc.md create mode 100644 src/packages/overlay/index.ts create mode 100644 src/packages/overlay/overlay.scss create mode 100644 src/packages/overlay/overlay.tsx diff --git a/src/config.json b/src/config.json index b2b8315..01ba3d0 100644 --- a/src/config.json +++ b/src/config.json @@ -151,6 +151,16 @@ "sort": 1, "show": false, "author": "songsong" + }, + { + "version": "1.0.0", + "name": "Overlay", + "type": "component", + "cName": "遮罩层", + "desc": "创建一个遮罩层,通常用于阻止用户进行其他操作", + "sort": 5, + "show": true, + "author": "junjun" } ] }, diff --git a/src/packages/avatar/demo.tsx b/src/packages/avatar/demo.tsx index fd2b223..8157511 100644 --- a/src/packages/avatar/demo.tsx +++ b/src/packages/avatar/demo.tsx @@ -1,7 +1,11 @@ import React from 'react' import { Avatar } from './avatar' +import Cell from '@/packages/cell' const AvatarDemo = () => { + const AvatarStyle = { + alignItems: 'flex-end', + } const handleClick = () => { console.log('触发点击头像') } @@ -9,29 +13,41 @@ const AvatarDemo = () => { <>

默认用法 (内置"small","normal","large"三种尺寸规格)

- - - + + + + +

修改形状

- - + + + +

修改背景色

- + + +

修改背景图片

- + + +

可以修改头像的内容

- N + + N +

点击头像触发事件

- + + +
) diff --git a/src/packages/avatar/doc.md b/src/packages/avatar/doc.md index 8bb9e06..618346d 100644 --- a/src/packages/avatar/doc.md +++ b/src/packages/avatar/doc.md @@ -6,11 +6,7 @@ ### 安装 ``` javascript -import { createApp } from 'vue'; import { Avatar } from '@nutui/nutui'; - -const app = createApp(); -app.use(Avatar); ``` ## 代码示例 @@ -19,38 +15,38 @@ app.use(Avatar); 内置 smal / normal / large 三种尺寸规格 -``` html - - - +``` tsx + + + ``` ### 修改形状类型 -``` html - - +``` tsx + + ``` ### 修改背景色 -``` html - +``` tsx + ``` ### 修改背景icon -``` html - +``` tsx + ``` ### 设置头像的文本内容 -``` html -N +``` tsx +N ``` @@ -58,7 +54,7 @@ app.use(Avatar); | 字段 | 说明 | 类型 | 默认值 | |----------|--------------------------------------------------------------------------|--------|--------| -| bg-color | 设置头像背景色 | String | #eee | +| bgColor | 设置头像背景色 | String | #eee | | size | 设置头像的大小,提供三种:large/normal/small,支持直接输入数字 | String | normal | | shape | 设置头像的形状,默认是圆形,可以设置为square方形 | String | round | | src | 设置头像的背景图片 | String | '' | @@ -68,4 +64,4 @@ app.use(Avatar); | 字段 | 说明 | 类型 | 回调参数 | |----------|----------------------|----------|----------| -| on-error | 加载图片失败触发事件 | Function | event | \ No newline at end of file +| onClick | 点击图片触发事件 | Function | event | \ No newline at end of file diff --git a/src/packages/button/button.tsx b/src/packages/button/button.tsx index d164695..9b95a75 100644 --- a/src/packages/button/button.tsx +++ b/src/packages/button/button.tsx @@ -86,7 +86,6 @@ export const Button: FunctionComponent> = (props) => { ${disabled ? `${prefixCls}--disabled` : ''} ${loading ? `${prefixCls}--loading` : ''}` } - const handleClick = (e: any) => { if (!loading && !disabled && onClick) { onClick(e) @@ -94,7 +93,6 @@ export const Button: FunctionComponent> = (props) => { } const getStyle = () => { const style: CSSProperties = {} - console.log(plain) if (color) { if (plain) { style.color = color diff --git a/src/packages/cell/cell.tsx b/src/packages/cell/cell.tsx index ff800a8..0ec0ce1 100644 --- a/src/packages/cell/cell.tsx +++ b/src/packages/cell/cell.tsx @@ -32,7 +32,9 @@ const defaultProps = { extra: '', click: (event: React.MouseEvent) => {}, } as CellProps -export const Cell: FunctionComponent> = (props) => { +export const Cell: FunctionComponent & React.HTMLAttributes> = ( + props +) => { const { children, click, @@ -47,6 +49,7 @@ export const Cell: FunctionComponent> = (props) => { title, subTitle, extra, + ...rest } = { ...defaultProps, ...props, @@ -69,6 +72,7 @@ export const Cell: FunctionComponent> = (props) => {
handleClick(event)} + {...rest} > {children ? ( children diff --git a/src/packages/overlay/demo.scss b/src/packages/overlay/demo.scss new file mode 100644 index 0000000..e5e8fd4 --- /dev/null +++ b/src/packages/overlay/demo.scss @@ -0,0 +1,16 @@ +.wrapper { + display: flex; + height: 100%; + align-items: center; + justify-content: center; + .content { + display: flex; + width: 150px; + height: 150px; + background: #fff; + border-radius: 8px; + align-items: center; + justify-content: center; + color: red; + } +} diff --git a/src/packages/overlay/demo.tsx b/src/packages/overlay/demo.tsx new file mode 100644 index 0000000..55c7408 --- /dev/null +++ b/src/packages/overlay/demo.tsx @@ -0,0 +1,48 @@ +import React, { useState } from 'react' +import { Overlay } from './overlay' +import Cell from '@/packages/cell' +import Button from '@/packages/button' +import './demo.scss' + +const OverlayDemo = () => { + const [visible, setVisible] = useState(false) + const [visible2, setVisible2] = useState(false) + const handleToggleShow = () => { + setVisible(true) + } + const handleToggleShow2 = () => { + setVisible2(true) + } + const onClose = () => { + setVisible(false) + } + const onClose2 = () => { + setVisible2(false) + } + return ( + <> +
+

基础用法

+ + + + +

嵌套内容

+ + + +
+
这里是正文
+
+
+
+
+ + ) +} + +export default OverlayDemo diff --git a/src/packages/overlay/doc.md b/src/packages/overlay/doc.md new file mode 100644 index 0000000..cf7712f --- /dev/null +++ b/src/packages/overlay/doc.md @@ -0,0 +1,49 @@ +# Overlay 组件 + +### 介绍 + +创建一个遮罩层,通常用于阻止用户进行其他操作 + +### 安装 + + +``` javascript +import { OverLay } from '@nutui/nutui'; +``` + +## 代码演示 + +### 基础用法 + +```tsx + +``` + +### 嵌套内容 + +```tsx + +
+
这里是正文
+
+
+``` + +## API + +### Props + +| 参数 | 说明 | 类型 | 默认值 | +| ---------------------- | ---------------- | -------------- | ------ | +| visible | 当前组件是否显示 | Boolean | `false` | +| zIndex | 遮罩层级 | Number | 2000 | +| duration | 动画时长,单位秒 | Number | 0.3 | +| overlayClass | 自定义遮罩类名 | String | - | +| overlayStyle | 自定义遮罩样式 | CSSProperties | - | +| closeOnClickOverlay | 是否点击遮罩关闭 | Boolean | `true` | + +### Events + +| 事件名 | 说明 | 回调参数 | +| ------ | ---------- | ------------ | +| onClick | 点击时触发 | event: Event | diff --git a/src/packages/overlay/index.ts b/src/packages/overlay/index.ts new file mode 100644 index 0000000..7d7ebdf --- /dev/null +++ b/src/packages/overlay/index.ts @@ -0,0 +1,2 @@ +import { Overlay } from './overlay' +export default Overlay diff --git a/src/packages/overlay/overlay.scss b/src/packages/overlay/overlay.scss new file mode 100644 index 0000000..c4b2843 --- /dev/null +++ b/src/packages/overlay/overlay.scss @@ -0,0 +1,47 @@ +.nut-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: $overlay-bg-color; +} +.overlay-fade-enter-active { + animation: nut-fade-in; +} +.overlay-fade-leave-active { + animation: nut-fade-out; +} +.first-render { + display: none; +} +.hidden-render { + display: none; +} +@keyframes nut-fade-in { + 0% { + opacity: 0; + } + + 1% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes nut-fade-out { + 0% { + opacity: 1; + } + + 1% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} diff --git a/src/packages/overlay/overlay.tsx b/src/packages/overlay/overlay.tsx new file mode 100644 index 0000000..6f6ceeb --- /dev/null +++ b/src/packages/overlay/overlay.tsx @@ -0,0 +1,75 @@ +import React, { FunctionComponent, MouseEventHandler, useEffect, useRef, useState } from 'react' +import bem from '@/utils/bem' +import classNames from 'classnames' +import './overlay.scss' + +export interface OverlayProps { + zIndex: number + duration: number + overlayClass: string + overlayStyle: React.CSSProperties + closeOnClickOverlay: boolean + visible: boolean +} +const defaultProps = { + zIndex: 2000, + duration: 0.3, + overlayClass: '', + closeOnClickOverlay: true, + visible: false, +} as OverlayProps +export const Overlay: FunctionComponent< + Partial & React.HTMLAttributes +> = (props) => { + const [show, setShow] = useState(false) + const renderRef = useRef(true) + const intervalRef = useRef(0) + const { children, zIndex, duration, overlayClass, closeOnClickOverlay, visible, ...rest } = { + ...defaultProps, + ...props, + } + useEffect(() => { + setShow(false) + }, [visible]) + useEffect(() => { + return () => { + clearTimeout(intervalRef.current) + } + }, []) + const b = bem('overlay') + const classes = classNames( + { + [overlayClass]: true, + 'overlay-fade-leave-active': !renderRef.current && !visible, + 'overlay-fade-enter-active': visible, + 'first-render': renderRef.current && !visible, + 'hidden-render': show, + }, + b('') + ) + const styles = { + zIndex: zIndex, + animationDuration: `${props.duration}s`, + ...props.overlayStyle, + } + const handleClick: MouseEventHandler = (e) => { + renderRef.current = false + let id = setTimeout(() => { + setShow(true) + }, duration * 1000 * 0.8) + intervalRef.current = id + if (props.onClick) { + props.onClick(e) + } + } + return ( + +
+ {children} +
+
+ ) +} + +Overlay.defaultProps = defaultProps +Overlay.displayName = 'NutOverlay' -- GitLab