UNPKG

antd-mobile

Version:

基于 React 的移动设计规范实现

149 lines (128 loc) 5.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _rcDialog = require('rc-dialog'); var _rcDialog2 = _interopRequireDefault(_rcDialog); var _objectAssign = require('object-assign'); var _objectAssign2 = _interopRequireDefault(_objectAssign); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } /* eslint no-console:0 */ /* tslint:disable:no-unused-variable */ function create(instanceId, config, content) { var afterClose = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function (_x) {}; var props = (0, _objectAssign2['default'])({}, { prefixCls: 'am-popup', animationType: 'slide-down' }, config); var prefixCls = props.prefixCls, transitionName = props.transitionName, animationType = props.animationType, maskTransitionName = props.maskTransitionName, _props$maskClosable = props.maskClosable, maskClosable = _props$maskClosable === undefined ? true : _props$maskClosable, onMaskClose = props.onMaskClose, className = props.className; var div = document.createElement('div'); document.body.appendChild(div); function close() { if (div) { _reactDom2['default'].unmountComponentAtNode(div); div.parentNode.removeChild(div); div = null; } afterClose(instanceId); } var transName = 'am-slide-down'; if (animationType === 'slide-up') { transName = 'am-slide-up'; } // 在 iPhone 上拖动 mask 蒙层、会触发最顶部或最底部的、页面回弹后的留白,解决办法是,禁掉 mask 蒙层的 onTouchStart 事件。 // 但由于以下原因: // Popup 组件底层依赖 [rc-dialog](https://github.com/react-component/dialog) // 而 rc-dialog 点击 mask 蒙层关闭弹出框的事件是绑定在 classname 为 rc-dialog-wrap 的 dom 节点上, // 此节点是弹出层中主要内容的“父节点”,而非正常的“兄弟节点”。相关 issue https://github.com/react-component/dialog/issues/40 // 所以、相对于 antd-mobile@0.9.8 以及之前的版本的变化是: // 去掉 am-popup-wrap 设置的 `position: fixed; top: 0; bottom: 0; ...` 样式,并给 am-popup 设置 z-index . // 另外不使用 rc-dialog 提供的 maskClosable 功能,而改为在这里实现 var maskProps = { onClick: function onClick(e) { e.preventDefault(); if (maskClosable) { if (onMaskClose && typeof onMaskClose === 'function') { var res = onMaskClose(); if (res && res.then) { res.then(function () { close(); }); } else { close(); } } else { close(); } } } }; var cls = className ? prefixCls + '-' + animationType + ' ' + className : prefixCls + '-' + animationType; _reactDom2['default'].render(_react2['default'].createElement( _rcDialog2['default'], (0, _extends3['default'])({}, props, { className: cls, visible: true, title: '', footer: '', transitionName: transitionName || transName, maskTransitionName: maskTransitionName || 'am-fade', maskProps: (0, _objectAssign2['default'])({}, props.maskProps, maskProps) }), content ), div); return { instanceId: instanceId, close: close }; } /* tslint:enable:no-unused-variable */ var ins = { defaultInstance: null, instances: [] }; var instanceId = 1; var Popup = function Popup() { (0, _classCallCheck3['default'])(this, Popup); }; exports['default'] = Popup; Popup.newInstance = function () { var j = void 0; return { show: function show(content, config) { j = create(instanceId++, config, content, function (iId) { for (var i = 0; i < ins.instances.length; i++) { if (ins.instances[i].instanceId === iId) { ins.instances.splice(i, 1); return; } } }); ins.instances.push(j); }, hide: function hide() { j.close(); } }; }; Popup.show = function (content, config) { Popup.hide(); ins.defaultInstance = create('0', config, content, function (iId) { if (iId === '0') { ins.defaultInstance = null; } }); }; Popup.hide = function () { if (ins.defaultInstance) { ins.defaultInstance.close(); } }; module.exports = exports['default'];