zent
Version:
一套前端设计语言和基于React的实现
228 lines (176 loc) • 6.21 kB
JavaScript
;
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;
}