isReactClass -> .prototype.isReactComponent
Put the flag on the prototype instead to help certain limited forms of class extensions that doesn't properly transfer static properties. Fixes #4836
Sebastian Markbage committed
Sep 30, 2015 at 18:28 UTC
83644185f4388834c0c482c7522a5f2f476d84a2
5 files changed
+33
-4
src/isomorphic/classic/class/ReactClass.js
-1
@@ -847,7 +847,6 @@ var ReactClass = {
847
};
848
Constructor.prototype = new ReactClassComponent();
849
Constructor.prototype.constructor = Constructor;
850
- Constructor.isReactClass = {};
850
851
injectedMixins.forEach(
852
mixSpecIntoComponent.bind(null, Constructor)
src/isomorphic/modern/class/ReactComponent.js
+1
-1
@@ -29,7 +29,7 @@ function ReactComponent(props, context, updater) {
29
this.updater = updater || ReactNoopUpdateQueue;
30
}
31
32
-ReactComponent.isReactClass = {};
32
+ReactComponent.prototype.isReactComponent = {};
33
34
/**
35
* Sets a subset of the state. Always use this to mutate
src/renderers/dom/client/ReactMount.js
+1
-1
@@ -412,7 +412,7 @@ function findFirstReactDOMImpl(node) {
412
* here.
413
*/
414
var TopLevelWrapper = function() {};
415
-TopLevelWrapper.isReactClass = {};
415
+TopLevelWrapper.prototype.isReactComponent = {};
416
if (__DEV__) {
417
TopLevelWrapper.displayName = 'TopLevelWrapper';
418
}
src/renderers/shared/reconciler/ReactCompositeComponent.js
+1
-1
@@ -176,7 +176,7 @@ var ReactCompositeComponentMixin = {
176
// We support ES6 inheriting from React.Component, the module pattern,
177
// and stateless components, but not ES6 classes that don't extend
178
warning(
179
- Component.isReactClass ||
179
+ (Component.prototype && Component.prototype.isReactComponent) ||
180
!canInstantiate ||
181
!(inst instanceof Component),
182
'%s(...): React component classes must extend React.Component.',
src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js
+30
@@ -1211,5 +1211,35 @@ describe('ReactCompositeComponent', function() {
1211
expect(console.error.calls.length).toBe(0);
1212
});
1213
1214
+ it('should warn when a class does not extend React.Component', function() {
1215
+
1216
+ var container = document.createElement('div');
1217
+
1218
+ class Foo {
1219
+ render() {
1220
+ return <span />;
1221
+ }
1222
+ }
1223
+
1224
+ function Bar() { }
1225
+ Bar.prototype = Object.create(React.Component.prototype);
1226
+ Bar.prototype.render = function() {
1227
+ return <span />;
1228
+ };
1229
+
1230
+ expect(console.error.calls.length).toBe(0);
1231
+
1232
+ ReactDOM.render(<Bar />, container);
1233
+
1234
+ expect(console.error.calls.length).toBe(0);
1235
+
1236
+ ReactDOM.render(<Foo />, container);
1237
+
1238
+ expect(console.error.calls.length).toBe(1);
1239
+ expect(console.error.argsForCall[0][0]).toContain(
1240
+ 'React component classes must extend React.Component'
1241
+ );
1242
+
1243
+ });
1244
1245
});