packages-hook/react-hook-mouse-hover/stories/demo-default/index.tsx (82 lines of code) (raw):
import React, {
useState,
useCallback
} from 'react';
import styled from 'styled-components';
import {
H1,
H2,
P,
Alert
} from '@alicloud/demo-rc-elements';
import pkgInfo from '../../package.json';
import useMouseHover from '../../src';
const ScSpan = styled.span`
display: inline-block;
margin: 1px 2px;
width: 120px;
height: 32px;
line-height: 32px;
font-size: 14px;
text-align: center;
color: #fff;
`;
const ScActiveButton = styled.button`
border: 0;
width: 32px;
height: 32px;
color: #fff;
transition: all ease-in-out 300ms;
`;
export default function DemoDefault(): JSX.Element {
const [stateInProtected, setStateInProtected] = useState(false);
const [stateInUnprotected, setStateInUnprotected] = useState(false);
const [statePlaying, setStatePlaying] = useState(false);
const handleMouseEnterProtected = useCallback(() => setStateInProtected(true), [setStateInProtected]);
const handleMouseLeaveProtected = useCallback(() => setStateInProtected(false), [setStateInProtected]);
const handleMouseEnterUnprotected = useCallback(() => setStateInUnprotected(true), [setStateInUnprotected]);
const handleMouseLeaveUnprotected = useCallback(() => setStateInUnprotected(false), [setStateInUnprotected]);
const handlePlaying = useCallback(() => setStatePlaying(true), [setStatePlaying]);
const handleClickPlaying = useCallback(() => {
setStatePlaying(!statePlaying);
}, [statePlaying, setStatePlaying]);
const [onMouseEnter, onMouseLeave] = useMouseHover({
onEnter: handleMouseEnterProtected,
onLeave: handleMouseLeaveProtected
});
const [onMouseEnterPlay, onMouseLeavePlay, onActiveChange] = useMouseHover({
active: statePlaying,
onEnter: handlePlaying,
onActiveChange: handleClickPlaying
});
return <>
<H1>{pkgInfo.name}@{pkgInfo.version}</H1>
<Alert type="warning">注意:在 CodeSandbox 下,修改代码,热部署后,hover 会有问题,需要刷新(本地的 Storybook 下没有这个问题)。</Alert>
<H2>不需要 click</H2>
<P>无延时保护的 MouseEnter/Leave,鼠标快速经过会频闪;有延时保护的则不会,可以避免不必要的接口请求和界面变化</P>
<ScSpan {...{
style: {
background: stateInUnprotected ? '#0c0' : '#f60'
},
onMouseEnter: handleMouseEnterUnprotected,
onMouseLeave: handleMouseLeaveUnprotected
}}>延时保护:无</ScSpan>
<ScSpan {...{
style: {
background: stateInProtected ? '#0c0' : '#00c'
},
onMouseEnter,
onMouseLeave
}}>延时保护:有</ScSpan>
<H2>配合 active,鼠标移入后延时触发 active(能够被 click 抢先)</H2>
<P>当前状态:<kbd>{statePlaying ? '播放中' : '暂停'}</kbd>,移入短暂停留将暂停播放,点击切换状态</P>
<ScActiveButton {...{
style: {
background: statePlaying ? '#90f' : '#fc0'
},
onMouseEnter: onMouseEnterPlay,
onMouseLeave: onMouseLeavePlay,
onClick: onActiveChange
}}>{statePlaying ? '⏸' : '▶'}</ScActiveButton>
</>;
}