From b058ccb4fc62b86f35c500e9f5c1135bd1997da9 Mon Sep 17 00:00:00 2001 From: Olivier Tassinari Date: Wed, 8 Jan 2020 11:30:02 +0100 Subject: [PATCH] reduce hook usage in production --- packages/material-ui/src/utils/useControlled.js | 7 ++++--- packages/material-ui/src/utils/useControlled.test.js | 10 ++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/material-ui/src/utils/useControlled.js b/packages/material-ui/src/utils/useControlled.js index c76fb5a5d9ed47..b1345a3567110e 100644 --- a/packages/material-ui/src/utils/useControlled.js +++ b/packages/material-ui/src/utils/useControlled.js @@ -3,9 +3,8 @@ import React from 'react'; const useControlled = ({ controlled, default: defaultProp, name }) => { const { current: isControlled } = React.useRef(controlled !== undefined); - const { current: defaultValue } = React.useRef(defaultProp); const [valueState, setValue] = React.useState(() => { - return !isControlled && defaultValue !== undefined ? defaultValue : null; + return !isControlled && defaultProp !== undefined ? defaultProp : null; }); const value = isControlled ? controlled : valueState; @@ -24,7 +23,9 @@ const useControlled = ({ controlled, default: defaultProp, name }) => { ].join('\n'), ); } - }, [controlled, isControlled, name]); + }, [controlled]); + + const { current: defaultValue } = React.useRef(defaultProp); React.useEffect(() => { if (defaultValue !== defaultProp) { diff --git a/packages/material-ui/src/utils/useControlled.test.js b/packages/material-ui/src/utils/useControlled.test.js index 6cb000749961b2..aae06fc657ea16 100644 --- a/packages/material-ui/src/utils/useControlled.test.js +++ b/packages/material-ui/src/utils/useControlled.test.js @@ -64,6 +64,16 @@ describe('useControlled', () => { ); }); + it('warns when switching from controlled to uncontrolled', () => { + const { setProps } = render({() => null}); + expect(consoleErrorMock.callCount()).to.equal(0); + setProps({ value: undefined }); + expect(consoleErrorMock.callCount()).to.equal(1); + expect(consoleErrorMock.args()[0][0]).to.contains( + 'A component is changing a controlled TestComponent to be uncontrolled.', + ); + }); + it('warns when changing the defaultValue prop after initial rendering', () => { const { setProps } = render({() => null}); expect(consoleErrorMock.callCount()).to.equal(0);