diff --git a/dash/dash-renderer/src/checkPropTypes.js b/dash/dash-renderer/src/checkPropTypes.js
index a10da154db..f41bbf1556 100644
--- a/dash/dash-renderer/src/checkPropTypes.js
+++ b/dash/dash-renderer/src/checkPropTypes.js
@@ -20,69 +20,24 @@ export default function checkPropTypes(
     typeSpecs,
     values,
     location,
-    componentName,
-    getStack = null
+    componentName
 ) {
-    const errors = [];
-    for (const typeSpecName in typeSpecs) {
-        if (typeSpecs.hasOwnProperty(typeSpecName)) {
-            let error;
-            // Prop type validation may throw. In case they do, we don't want to
-            // fail the render phase where it didn't fail before. So we log it.
-            // After these have been cleaned up, we'll let them throw.
-            try {
-                // This is intentionally an invariant that gets caught. It's the same
-                // behavior as without this statement except with a better message.
-                if (typeof typeSpecs[typeSpecName] !== 'function') {
-                    error = Error(
-                        (componentName || 'React class') +
-                            ': ' +
-                            location +
-                            ' type `' +
-                            typeSpecName +
-                            '` is invalid; ' +
-                            'it must be a function, usually from the `prop-types` package, but received `' +
-                            typeof typeSpecs[typeSpecName] +
-                            '`.'
-                    );
-                    error.name = 'Invariant Violation';
-                } else {
-                    error = typeSpecs[typeSpecName](
-                        values,
-                        typeSpecName,
-                        componentName,
-                        location,
-                        null,
-                        ReactPropTypesSecret
-                    );
-                }
-            } catch (ex) {
-                error = ex;
-            }
-            if (error && !(error instanceof Error)) {
-                errors.push(
-                    (componentName || 'React class') +
-                        ': type specification of ' +
-                        location +
-                        ' `' +
-                        typeSpecName +
-                        '` is invalid; the type checker ' +
-                        'function must return `null` or an `Error` but returned a ' +
-                        typeof error +
-                        '. ' +
-                        'You may have forgotten to pass an argument to the type checker ' +
-                        'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
-                        'shape all require an argument).'
-                );
-            }
-            if (error instanceof Error) {
-                var stack = (getStack && getStack()) || '';
-
-                errors.push(
-                    'Failed ' + location + ' type: ' + error.message + stack
+    return Object.keys(values)
+        .reduce((acc, propName) => {
+            if (typeSpecs && typeSpecs[propName] !== undefined) {
+                const error = typeSpecs[propName](
+                    values,
+                    propName,
+                    componentName,
+                    location,
+                    null,
+                    ReactPropTypesSecret
                 );
+                if (error) {
+                    acc.push(error);
+                }
             }
-        }
-    }
-    return errors.join('\n\n');
+            return acc;
+        }, [])
+        .join('\n\n');
 }
diff --git a/dash/dash-renderer/src/wrapper/CheckedComponent.tsx b/dash/dash-renderer/src/wrapper/CheckedComponent.tsx
index 725facaa19..0d77edf484 100644
--- a/dash/dash-renderer/src/wrapper/CheckedComponent.tsx
+++ b/dash/dash-renderer/src/wrapper/CheckedComponent.tsx
@@ -1,3 +1,4 @@
+import {useEffect, useState, memo} from 'react';
 import checkPropTypes from '../checkPropTypes';
 import {propTypeErrorHandler} from '../exceptions';
 import {validateComponent} from './wrapping';
@@ -9,20 +10,28 @@ type CheckedComponentProps = {
     props?: any;
 };
 
-export default function CheckedComponent(p: CheckedComponentProps) {
+function CheckedComponent(p: CheckedComponentProps) {
     const {element, props, children, component} = p;
+    const [error, setError] = useState('');
 
-    validateComponent(component);
+    useEffect(() => {
+        validateComponent(component);
+        const errorMessage = checkPropTypes(
+            element.propTypes,
+            props,
+            'component prop',
+            element
+        );
+        if (errorMessage) {
+            setError(errorMessage);
+        }
+    }, [component, props]);
 
-    const errorMessage = checkPropTypes(
-        element.propTypes,
-        props,
-        'component prop',
-        element
-    );
-    if (errorMessage) {
-        propTypeErrorHandler(errorMessage, props, component.type);
+    if (error) {
+        propTypeErrorHandler(error, props, component.type);
     }
 
     return children;
 }
+
+export default memo(CheckedComponent);
diff --git a/dash/dash-renderer/src/wrapper/DashWrapper.tsx b/dash/dash-renderer/src/wrapper/DashWrapper.tsx
index 86c34cc7c6..f356a03466 100644
--- a/dash/dash-renderer/src/wrapper/DashWrapper.tsx
+++ b/dash/dash-renderer/src/wrapper/DashWrapper.tsx
@@ -369,45 +369,36 @@ function DashWrapper({
         return props;
     }, [componentProps]);
 
-    const hydrated = useMemo(() => {
-        let hydratedChildren: any;
-        if (componentProps.children !== undefined) {
-            hydratedChildren = wrapChildrenProp(componentProps.children, [
-                'children'
-            ]);
-        }
-        if (config.props_check) {
-            return (
-                <CheckedComponent
-                    element={element}
-                    props={hydratedProps}
-                    component={component}
-                >
-                    {createElement(
-                        element,
-                        hydratedProps,
-                        extraProps,
-                        hydratedChildren
-                    )}
-                </CheckedComponent>
-            );
-        }
-
-        return createElement(
-            element,
-            hydratedProps,
-            extraProps,
-            hydratedChildren
+    let hydratedChildren: any;
+    let hydrated: any;
+    if (componentProps.children !== undefined) {
+        hydratedChildren = wrapChildrenProp(componentProps.children, [
+            'children'
+        ]);
+    }
+    if (config.props_check) {
+        hydrated = (
+            <CheckedComponent
+                element={element}
+                props={hydratedProps}
+                component={component}
+            >
+                {createElement(
+                    element,
+                    hydratedProps,
+                    extraProps,
+                    hydratedChildren
+                )}
+            </CheckedComponent>
         );
-    }, [
+    }
+
+    hydrated = createElement(
         element,
-        component,
         hydratedProps,
         extraProps,
-        wrapChildrenProp,
-        componentProps,
-        config.props_check
-    ]);
+        hydratedChildren
+    );
 
     return (
         <ComponentErrorBoundary
