mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
Add more info to invalid hook call error message (#15139)
* Add more info to invalid hook call error message * Update other renderers + change call to action * Update related tests for new hooks error message * Fix lint errors
This commit is contained in:
committed by
Dan Abramov
parent
a0a2e846ce
commit
fb572afc14
@@ -239,7 +239,12 @@ describe('ReactHooksInspection', () => {
|
||||
expect(() => {
|
||||
ReactDebugTools.inspectHooks(Foo, {}, FakeDispatcherRef);
|
||||
}).toThrow(
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
|
||||
expect(getterCalls).toBe(1);
|
||||
|
||||
+6
-1
@@ -419,7 +419,12 @@ describe('ReactHooksInspectionIntegration', () => {
|
||||
expect(() => {
|
||||
ReactDebugTools.inspectHooksOfFiber(childFiber, FakeDispatcherRef);
|
||||
}).toThrow(
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
|
||||
expect(getterCalls).toBe(1);
|
||||
|
||||
@@ -144,7 +144,12 @@ describe('ReactDOMServerHooks', () => {
|
||||
|
||||
return render(<Counter />);
|
||||
},
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
|
||||
itRenders('multiple times when an updater is called', async render => {
|
||||
@@ -626,7 +631,12 @@ describe('ReactDOMServerHooks', () => {
|
||||
|
||||
return render(<Counter />);
|
||||
},
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -57,8 +57,12 @@ let currentHookNameInDev: ?string;
|
||||
function resolveCurrentlyRenderingComponent(): Object {
|
||||
invariant(
|
||||
currentlyRenderingComponent !== null,
|
||||
'Hooks can only be called inside the body of a function component. ' +
|
||||
'(https://fb.me/react-invalid-hook-call)',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
if (__DEV__) {
|
||||
warning(
|
||||
|
||||
+6
-2
@@ -262,8 +262,12 @@ function warnOnHookMismatchInDev(currentHookName: HookType) {
|
||||
function throwInvalidHookError() {
|
||||
invariant(
|
||||
false,
|
||||
'Hooks can only be called inside the body of a function component. ' +
|
||||
'(https://fb.me/react-invalid-hook-call)',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,12 @@ describe('ReactHooks', () => {
|
||||
expect(() => {
|
||||
ReactTestRenderer.create(<Example />);
|
||||
}).toThrow(
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen' +
|
||||
' for one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -805,15 +810,30 @@ describe('ReactHooks', () => {
|
||||
const root = ReactTestRenderer.create(<MemoApp />);
|
||||
// trying to render again should trigger comparison and throw
|
||||
expect(() => root.update(<MemoApp />)).toThrow(
|
||||
'Hooks can only be called inside the body of a function component',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
// the next round, it does a fresh mount, so should render
|
||||
expect(() => root.update(<MemoApp />)).not.toThrow(
|
||||
'Hooks can only be called inside the body of a function component',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
// and then again, fail
|
||||
expect(() => root.update(<MemoApp />)).toThrow(
|
||||
'Hooks can only be called inside the body of a function component',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
+18
-3
@@ -108,7 +108,12 @@ describe('ReactHooksWithNoopRenderer', () => {
|
||||
ReactNoop.render(<BadCounter />);
|
||||
|
||||
expect(() => ReactNoop.flush()).toThrow(
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
|
||||
// Confirm that a subsequent hook works properly.
|
||||
@@ -131,7 +136,12 @@ describe('ReactHooksWithNoopRenderer', () => {
|
||||
}
|
||||
ReactNoop.render(<Counter />);
|
||||
expect(() => ReactNoop.flush()).toThrow(
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
|
||||
// Confirm that a subsequent hook works properly.
|
||||
@@ -145,7 +155,12 @@ describe('ReactHooksWithNoopRenderer', () => {
|
||||
|
||||
it('throws when called outside the render phase', () => {
|
||||
expect(() => useState(0)).toThrow(
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -1514,7 +1514,12 @@ describe('ReactNewContext', () => {
|
||||
}
|
||||
ReactNoop.render(<Foo />);
|
||||
expect(ReactNoop.flush).toThrow(
|
||||
'Hooks can only be called inside the body of a function component.',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen' +
|
||||
' for one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -218,8 +218,12 @@ class ReactShallowRenderer {
|
||||
_validateCurrentlyRenderingComponent() {
|
||||
invariant(
|
||||
this._rendering && !this._instance,
|
||||
'Hooks can only be called inside the body of a function component. ' +
|
||||
'(https://fb.me/react-invalid-hook-call)',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,8 +17,12 @@ function resolveDispatcher() {
|
||||
const dispatcher = ReactCurrentDispatcher.current;
|
||||
invariant(
|
||||
dispatcher !== null,
|
||||
'Hooks can only be called inside the body of a function component. ' +
|
||||
'(https://fb.me/react-invalid-hook-call)',
|
||||
'Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' +
|
||||
' one of the following reasons:\n' +
|
||||
'1. You might have mismatching versions of React and the renderer (such as React DOM)\n' +
|
||||
'2. You might be breaking the Rules of Hooks\n' +
|
||||
'3. You might have more than one copy of React in the same app\n' +
|
||||
'See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.',
|
||||
);
|
||||
return dispatcher;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user