因此,对于我的用例,我需要监控用户何时离开应用程序,并在此基础上发出警告并更改应用程序的内容,这样用户就无法作弊。话虽这么说,这就是我能够基于@TheZanke Approach 解决它的方法
包装您需要具有此功能的组件并传递道具,并且应该可以完美运行。维护这对我的情况来说更容易,所以我使用它
import PropTypes from "prop-types"
import React, { useState, useEffect } from 'react'
export default function OutsideAlerter({ children, fallback, initialIsVisible, isVisible, onSetIsVisible }) {
const [isComponentVisible, setIsComponentVisible] = useState(initialIsVisible);
const handleClickOutside = event => {
if (!event?.currentTarget?.contains(event?.relatedTarget)) {
onSetIsVisible(false)
}
};
const handleClickInside = event => {};
useEffect(() => {
setIsComponentVisible(isVisible === undefined ? initialIsVisible : isVisible);
}, [isVisible])
return (
<div
style={{
width: '100%',
height: '100%',
display: 'flex',
flexDirection: 'column',
}}
tabIndex="0"
onBlur={handleClickOutside}
onClick={handleClickInside}
>
{isComponentVisible ? children : fallback}
</div>
)
}
OutsideAlerter.propTypes = {
children: PropTypes.element,
fallback: PropTypes.element,
initialIsVisible: PropTypes.bool.isRequired,
isVisible: PropTypes.bool,
onSetIsVisible: PropTypes.func
}
这是通过的后备组件
<OutsideAlerter
fallback={
<div style={{
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
color: '#fff',
alignItems: 'center',
height: '100vh',
}}>
<div>You have clicked outside of the application</div>
<button
name='exam'
onClick={(e) => handleVisible(e, true)}
>IsVisible</button>
</div>
}
initialIsVisible={true}
isVisible={isVisible?.exam}
onSetIsVisible={(e) => handleVisible({ target: { name: 'exam' } }, e)}
>
<BaseRoutes />
</OutsideAlerter>
const handleVisible = (e, bool) => {
setIsVisible({ ...isVisible, [e.target.name]: bool })
}