zarm-web
Version:
基于 React 的桌面端UI库
72 lines (60 loc) • 2.67 kB
JavaScript
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
/* eslint-disable */
import React from 'react';
import PropTypes from 'prop-types';
import Events from './events';
export default class ClickOutside extends React.Component {
constructor(props) {
super(props);
this.isTouch = void 0;
this.container = void 0;
this.getContainer = node => {
this.container = node;
};
this.handle = event => {
if (event.type === 'touchend') {
this.isTouch = true;
}
if (event.type === 'click' && this.isTouch) return;
const {
onClickOutside
} = this.props;
const el = this.container;
if (el && !el.contains(event.target)) onClickOutside(event);
};
this.isTouch = false;
}
componentDidMount() {
if (!this.props.disabled) {
Events.on(document, 'click', this.handle);
Events.on(document, 'touchend', this.handle);
}
}
componentWillUnmount() {
if (!this.props.disabled) {
Events.off(document, 'click', this.handle);
Events.off(document, 'touchend', this.handle);
}
}
render() {
const _this$props = this.props,
{
onClickOutside,
disabled,
children
} = _this$props,
rest = _objectWithoutProperties(_this$props, ["onClickOutside", "disabled", "children"]);
return React.createElement("div", _extends({
ref: this.getContainer
}, rest), children);
}
}
ClickOutside.propTypes = {
onClickOutside: PropTypes.func.isRequired,
disabled: PropTypes.bool
};
ClickOutside.defaultProps = {
disabled: false
};