diff --git a/packages/server-side-render/src/server-side-render.js b/packages/server-side-render/src/server-side-render.js index deb7d025b647e8..d22b944e2bc610 100644 --- a/packages/server-side-render/src/server-side-render.js +++ b/packages/server-side-render/src/server-side-render.js @@ -7,7 +7,13 @@ import { isEqual } from 'lodash'; * WordPress dependencies */ import { useDebounce, usePrevious } from '@wordpress/compose'; -import { RawHTML, useEffect, useRef, useState } from '@wordpress/element'; +import { + RawHTML, + useEffect, + useRef, + useState, + useCallback, +} from '@wordpress/element'; import { __, sprintf } from '@wordpress/i18n'; import apiFetch from '@wordpress/api-fetch'; import { addQueryArgs } from '@wordpress/url'; @@ -79,9 +85,13 @@ export default function ServerSideRender( props ) { const fetchRequestRef = useRef(); const [ response, setResponse ] = useState( null ); const prevProps = usePrevious( props ); + const preAttributes = usePrevious( attributes ); + const prevUrlQueryArgs = usePrevious( urlQueryArgs ); const [ isLoading, setIsLoading ] = useState( false ); + const isAttributesChanged = isEqual( attributes, preAttributes ); + const isUrlQueryArgsChanged = isEqual( urlQueryArgs, prevUrlQueryArgs ); - function fetchData() { + const fetchData = useCallback( () => { if ( ! isMountedRef.current ) { return; } @@ -140,7 +150,7 @@ export default function ServerSideRender( props ) { } ) ); return fetchRequest; - } + }, [ httpMethod, isAttributesChanged, isUrlQueryArgsChanged ] ); const debouncedFetchData = useDebounce( fetchData, 500 );