react-rails-ujs
Version:
mounting components built with webpack (compatible with react-rails)
52 lines (41 loc) • 1.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.mountComponents = mountComponents;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var defaultConfig = {
'NAME_ATTR': 'data-react-class',
'PROPS_ATTR': 'data-react-props',
render: function render(component, props) {
return _react2.default.createElement(component, props);
},
strict: true
};
function mountComponents(components) {
var configOverrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var config = Object.assign({}, defaultConfig, configOverrides);
var nodes = window.document.querySelectorAll('[' + config.NAME_ATTR + ']');
for (var i = 0; i < nodes.length; ++i) {
var node = nodes[i];
var componentName = node.getAttribute(config.NAME_ATTR);
var component = components[componentName];
var propsJson = node.getAttribute(config.PROPS_ATTR);
var props = propsJson && JSON.parse(propsJson);
if (typeof component === "undefined") {
var message = "Cannot find component: '" + componentName + "'";
if (console && console.log) {
console.log('%c[react-rails-ujs] %c' + message + ' for element', "font-weight: bold", "", node);
}
if (config.strict) {
throw new Error('[react-rails-ujs] ' + message);
}
} else {
_reactDom2.default.render(config.render(component, props), node);
}
}
}