UNPKG

zent

Version:

一套前端设计语言和基于React的实现

228 lines (176 loc) 6.21 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _isBrowser = require('../utils/isBrowser'); var _isBrowser2 = _interopRequireDefault(_isBrowser); var _defer = require('lodash/defer'); var _defer2 = _interopRequireDefault(_defer); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _Loading = require('./Loading'); var _Loading2 = _interopRequireDefault(_Loading); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } // Global loading instance var loadingInstance = void 0; var Instance = function (_ref) { (0, _inherits3['default'])(Instance, _ref); function Instance() { (0, _classCallCheck3['default'])(this, Instance); return (0, _possibleConstructorReturn3['default'])(this, (Instance.__proto__ || Object.getPrototypeOf(Instance)).apply(this, arguments)); } (0, _createClass3['default'])(Instance, [{ key: 'componentDidMount', value: function componentDidMount() { this.renderLoading(); } // 因为需要确保内部元素已经 render 完毕,所以使用 did,但是因此带来额外的对 show 字段的判断逻辑 }, { key: 'componentDidUpdate', value: function componentDidUpdate() { this.renderLoading(); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { if (this.instance) { var loadingContainer = this.instance.container; _reactDom2['default'].unmountComponentAtNode(this.instance.container); loadingContainer.parentNode.removeChild(loadingContainer); } } // 通过以下函数与组件通信 }, { key: 'renderLoading', value: function renderLoading(target) { // static 方式,loading 将存在于文档流中 if (!isFloat(this.props)) { return; } if (!this.instance) { if (!target) { target = _reactDom2['default'].findDOMNode(this); } this.instance = newInstance((0, _extends3['default'])({}, this.props, { target: target })); } if (this.instance) { this.instance.show(this.props); } } }, { key: 'render', value: function render() { var float = isFloat(this.props); if (!isFloat(this.props)) { return _react2['default'].createElement( _Loading2['default'], (0, _extends3['default'])({}, this.props, { float: float }), this.props.children ); } // Return null to make React happy if Loading has no children return this.props.children || null; } }]); return Instance; }(_react.PureComponent || _react.Component); // ReactDOM.render returns null when called inside lifecycle methods // Just a workaround // These methods should be considered deprecated, don't use them. Instance.propTypes = { prefix: _propTypes2['default'].string, className: _propTypes2['default'].string, float: _propTypes2['default'].bool, show: _propTypes2['default'].bool, zIndex: _propTypes2['default'].number, containerClass: _propTypes2['default'].string }; Instance.defaultProps = { prefix: 'zent', className: '', // FIXME: use defaultProps when we drop support for static // float: false, show: false, height: 160, zIndex: 9998, containerClass: '' }; exports['default'] = Instance; Instance.on = function (options) { return (0, _defer2['default'])(on, options); }; Instance.off = function (options) { return (0, _defer2['default'])(off, options); }; Instance.newInstance = function (props) { return (0, _defer2['default'])(newInstance, props); }; function on() { var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$prefix = _ref2.prefix, prefix = _ref2$prefix === undefined ? 'zent' : _ref2$prefix, _ref2$className = _ref2.className, className = _ref2$className === undefined ? '' : _ref2$className, _ref2$containerClass = _ref2.containerClass, containerClass = _ref2$containerClass === undefined ? '' : _ref2$containerClass, _ref2$zIndex = _ref2.zIndex, zIndex = _ref2$zIndex === undefined ? 9998 : _ref2$zIndex; if (!_isBrowser2['default']) return; if (!loadingInstance) { loadingInstance = newInstance({ show: true, prefix: prefix, className: className, containerClass: containerClass, zIndex: zIndex, float: true }); return; } loadingInstance.show({ show: true }); } function off() { if (!_isBrowser2['default']) return; if (!loadingInstance) return; loadingInstance.show({ show: false }); } function newInstance(props) { if (!_isBrowser2['default']) return; var div = document.createElement('div'); div.className = props.prefix + '-loading-container ' + props.containerClass; document.body.appendChild(div); var loading = _reactDom2['default'].render(_react2['default'].createElement(_Loading2['default'], props), div); return { show: loading.show, container: div }; } // FIXME: remove support for props.static function isFloat(props) { var hasStatic = props.hasOwnProperty('static'); var hasFloat = props.hasOwnProperty('float'); if (hasFloat) { return props.float; } return hasStatic ? !props['static'] : false; }