diff --git a/src/config.json b/src/config.json index b2b831591e1852d339a4c97344027a61045d143b..01ba3d0a38a27618129f7cc21293f979ed369821 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 fd2b2233defb95b33a60cb708f7aaf5447e49632..8157511ea44ccbdb790f79df9ba4ee59f01dedca 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 8bb9e0667f693aa0b7e9ff9340778dccbd4d8d95..618346d2fd0b93839c4969c86b3ee7931ebe78ec 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 d1646953544699685d7077378d75af45a3703c69..9b95a75dfa6e301ef7e3fb2a0db0795d834ef76a 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 ff800a8a0fdc0c4118d214cd16004224afbcf32a..0ec0ce1c8b81bdc62bf436db082554aaa84ff476 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 0000000000000000000000000000000000000000..e5e8fd4c887eb249e18e681aed4ca796d671b935 --- /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 0000000000000000000000000000000000000000..55c7408aa8bcf7497c24bb87611c1064ee65f920 --- /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 0000000000000000000000000000000000000000..cf7712fd682247b7a98369bbc9c4a50ca122d0f3 --- /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 0000000000000000000000000000000000000000..7d7ebdfb1b0de3a764defd0a38497d711e150674 --- /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 0000000000000000000000000000000000000000..c4b2843b85f1fa841e1b52443759001082bbc77f --- /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 0000000000000000000000000000000000000000..6f6ceeb6f23b43708cd6a809b4fa4ec3813930ec --- /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'