mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
107 lines
2.9 KiB
JavaScript
107 lines
2.9 KiB
JavaScript
/**
|
|
* Copyright 2014, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @providesModule ReactNativeComponent
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var ReactClass = require('ReactClass');
|
|
var ReactElement = require('ReactElement');
|
|
|
|
var assign = require('Object.assign');
|
|
var invariant = require('invariant');
|
|
|
|
var genericComponentClass = null;
|
|
// This registry keeps track of wrapper classes around native tags
|
|
var tagToComponentClass = {};
|
|
var textComponentClass = null;
|
|
|
|
var ReactNativeComponentInjection = {
|
|
// This accepts a class that receives the tag string. This is a catch all
|
|
// that can render any kind of tag.
|
|
injectGenericComponentClass: function(componentClass) {
|
|
genericComponentClass = componentClass;
|
|
},
|
|
// This accepts a text component class that takes the text string to be
|
|
// rendered as props.
|
|
injectTextComponentClass: function(componentClass) {
|
|
textComponentClass = componentClass;
|
|
},
|
|
// This accepts a keyed object with classes as values. Each key represents a
|
|
// tag. That particular tag will use this class instead of the generic one.
|
|
injectComponentClasses: function(componentClasses) {
|
|
assign(tagToComponentClass, componentClasses);
|
|
}
|
|
};
|
|
|
|
function autoGenerateWrapperClass(type) {
|
|
return ReactClass.createClass({
|
|
tagName: type.toUpperCase(),
|
|
render: function() {
|
|
return new ReactElement(
|
|
type,
|
|
null,
|
|
null,
|
|
null,
|
|
null,
|
|
this.props
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Create an internal class for a specific tag.
|
|
*
|
|
* @param {string} tag The tag for which to create an internal instance.
|
|
* @param {any} props The props passed to the instance constructor.
|
|
* @return {ReactComponent} component The injected empty component.
|
|
*/
|
|
function createInstanceForTag(tag, props, parentType) {
|
|
var componentClass = tagToComponentClass[tag];
|
|
if (componentClass == null) {
|
|
tagToComponentClass[tag] = componentClass = autoGenerateWrapperClass(tag);
|
|
}
|
|
if (parentType === tag) {
|
|
// Avoid recursion
|
|
invariant(
|
|
genericComponentClass,
|
|
'There is no registered component for the tag %s',
|
|
tag
|
|
);
|
|
return new genericComponentClass(tag, props);
|
|
}
|
|
return new componentClass(props);
|
|
}
|
|
|
|
/**
|
|
* @param {ReactText} text
|
|
* @return {ReactComponent}
|
|
*/
|
|
function createInstanceForText(text) {
|
|
return new textComponentClass(text);
|
|
}
|
|
|
|
/**
|
|
* @param {ReactComponent} component
|
|
* @return {boolean}
|
|
*/
|
|
function isTextComponent(component) {
|
|
return component instanceof textComponentClass;
|
|
}
|
|
|
|
var ReactNativeComponent = {
|
|
createInstanceForTag: createInstanceForTag,
|
|
createInstanceForText: createInstanceForText,
|
|
isTextComponent: isTextComponent,
|
|
injection: ReactNativeComponentInjection
|
|
};
|
|
|
|
module.exports = ReactNativeComponent;
|