react-pizza
Version:
The utility for create (p)react component habitat.
207 lines (176 loc) • 5.87 kB
JavaScript
var _react = require('react');
var React = _interopRequireWildcard(_react);
var _reactDom = require('react-dom');
var _util = require('@rcp/util.iscompclass');
var _util2 = _interopRequireDefault(_util);
var _createref = require('createref');
var _createref2 = _interopRequireDefault(_createref);
var _lodash = require('lodash.get');
var _lodash2 = _interopRequireDefault(_lodash);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var toArray = require('./toArray'); /**
* @file habitat
* @author imcuttle <moyuyc95@gmail.com>
* @date 2018/11/7
*
*/
var querySelectorAll = require('./querySelectorAll');
/**
* @public
* @param dom {HTMLElement}
* @return {VDomResult}
*/
function VDom(dom) {
var _data = {};
return {
get dom() {
return dom;
},
data: function data(key, value) {
var _Object$assign;
Object.assign(_data, (_Object$assign = {}, _Object$assign[key] = value, _Object$assign));
},
get: function get(key) {
return !key ? _data : _data[key];
},
isEqual: function isEqual(dom) {
return dom === this || dom === this.dom;
}
};
}
/**
* @typedef Renderer
* @public
* @param {HTMLElement | HTMLElement[] | NodeList | string} selector
* @param {any} props
* @return {Controller}
*/
/**
* Modify a component to be controllable
* @public
* @param {React.ComponentType} Component
* @return {Renderer}
*/
module.exports = function (Component) {
function pizzaRender(selector) {
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var domList = querySelectorAll(selector);
var vDomList = [];
function renderToDom(dom, restProps) {
var assignedProps = Object.assign({}, props, restProps);
var ref = typeof React.createRef === 'function' ? React.createRef() : (0, _createref2.default)();
if ((0, _util2.default)(Component)) {
assignedProps.ref = ref;
}
var node = React.createElement(
Component,
assignedProps,
assignedProps.children
);
// dom.data
(0, _reactDom.render)(node, dom);
return { node: node, ref: ref };
}
domList.forEach(function (dom) {
var _renderToDom = renderToDom(dom),
node = _renderToDom.node,
ref = _renderToDom.ref;
var vDom = VDom(dom);
vDom.data('node', node);
vDom.data('ref', ref);
vDomList.push(vDom);
});
return {
get origin() {
return Component;
},
/**
* @param dom
* @return {number}
*/
indexOf: function indexOf(dom) {
return vDomList.findIndex(function (vdom) {
return vdom.isEqual(dom);
});
},
get: function get(indexOrDom) {
if (typeof indexOrDom === 'undefined') {
return vDomList;
}
var index = typeof indexOrDom === 'number' ? indexOrDom : this.indexOf(indexOrDom);
if (index >= 0) {
return vDomList[index];
}
},
setProps: function setProps(props, indexOrDom) {
toArray(this.get(indexOrDom)).forEach(function (vdom) {
if (vdom.dom) {
var _renderToDom2 = renderToDom(vdom.dom, props),
node = _renderToDom2.node,
ref = _renderToDom2.ref;
vdom.data('node', node);
vdom.data('ref', ref);
}
});
},
remove: function remove(indexOrDom) {
if (typeof indexOrDom === 'undefined') {
var i = 0;
var len = vDomList.length;
while (i < len) {
this.remove(0);
i++;
}
return;
}
var index = typeof indexOrDom === 'number' ? indexOrDom : this.indexOf(indexOrDom);
if (index >= 0) {
var vdom = vDomList[index];
vDomList.splice(index, 1);
if (vdom && vdom.dom) {
(0, _reactDom.unmountComponentAtNode)(vdom.dom);
// vdom.dom.innerHTML = ''
}
}
},
ref: function ref(indexOrDom) {
var _this = this;
var vdomList = this.get(indexOrDom);
if (Array.isArray(vdomList)) {
return vdomList.map(function (vdom) {
return _this.ref(vdom);
});
}
var vdom = vdomList;
return vdom && vdom.get('ref');
},
call: function call(methodName, argvs, indexOrDom) {
var _this2 = this;
if (!Array.isArray(argvs)) {
indexOrDom = argvs;
argvs = [];
}
var vdomList = this.get(indexOrDom);
if (Array.isArray(vdomList)) {
return vdomList.map(function (vdom) {
return _this2.call(methodName, argvs, vdom);
});
}
var vdom = vdomList;
if (vdom && vdom.get('ref') && vdom.get('ref').current) {
var method = (0, _lodash2.default)(vdom.get('ref').current, methodName);
var refName = methodName.replace(/\..+?$/, '');
var parent = methodName === refName ? vdom.get('ref').current : (0, _lodash2.default)(vdom.get('ref').current, refName);
if (typeof method === 'function') {
return method.apply(parent, argvs);
}
return method;
}
}
};
}
pizzaRender.origin = Component;
return pizzaRender;
};
;