Skip to content

Commit 979fb04

Browse files
authored
Header toolbar: useCallback to avoid unnecessary rerenders (#32406)
1 parent 6da0390 commit 979fb04

File tree

2 files changed

+42
-29
lines changed
  • packages
    • edit-post/src/components/header/header-toolbar
    • edit-site/src/components/header

2 files changed

+42
-29
lines changed

packages/edit-post/src/components/header/header-toolbar/index.js

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
} from '@wordpress/editor';
1818
import { Button, ToolbarItem } from '@wordpress/components';
1919
import { listView, plus } from '@wordpress/icons';
20-
import { useRef } from '@wordpress/element';
20+
import { useRef, useCallback } from '@wordpress/element';
2121
import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';
2222

2323
/**
@@ -26,6 +26,10 @@ import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';
2626
import TemplateTitle from '../template-title';
2727
import { store as editPostStore } from '../../../store';
2828

29+
const preventDefault = ( event ) => {
30+
event.preventDefault();
31+
};
32+
2933
function HeaderToolbar() {
3034
const inserterButton = useRef();
3135
const { setIsInserterOpened, setIsListViewOpened } = useDispatch(
@@ -73,6 +77,10 @@ function HeaderToolbar() {
7377
/* translators: accessibility text for the editor toolbar */
7478
const toolbarAriaLabel = __( 'Document tools' );
7579

80+
const toggleListView = useCallback(
81+
() => setIsListViewOpened( ! isListViewOpen ),
82+
[ setIsListViewOpened, isListViewOpen ]
83+
);
7684
const overflowItems = (
7785
<>
7886
<ToolbarItem
@@ -90,13 +98,20 @@ function HeaderToolbar() {
9098
isPressed={ isListViewOpen }
9199
/* translators: button label text should, if possible, be under 16 characters. */
92100
label={ __( 'List View' ) }
93-
onClick={ () => setIsListViewOpened( ! isListViewOpen ) }
101+
onClick={ toggleListView }
94102
shortcut={ listViewShortcut }
95103
showTooltip={ ! showIconLabels }
96104
/>
97105
</>
98106
);
99-
107+
const openInserter = useCallback( () => {
108+
if ( isInserterOpened ) {
109+
// Focusing the inserter button closes the inserter popover
110+
inserterButton.current.focus();
111+
} else {
112+
setIsInserterOpened( true );
113+
}
114+
}, [ isInserterOpened, setIsInserterOpened ] );
100115
return (
101116
<NavigableToolbar
102117
className="edit-post-header-toolbar"
@@ -109,17 +124,8 @@ function HeaderToolbar() {
109124
className="edit-post-header-toolbar__inserter-toggle"
110125
variant="primary"
111126
isPressed={ isInserterOpened }
112-
onMouseDown={ ( event ) => {
113-
event.preventDefault();
114-
} }
115-
onClick={ () => {
116-
if ( isInserterOpened ) {
117-
// Focusing the inserter button closes the inserter popover
118-
inserterButton.current.focus();
119-
} else {
120-
setIsInserterOpened( true );
121-
}
122-
} }
127+
onMouseDown={ preventDefault }
128+
onClick={ openInserter }
123129
disabled={ ! isInserterEnabled }
124130
icon={ plus }
125131
/* translators: button label text should, if possible, be under 16

packages/edit-site/src/components/header/index.js

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* WordPress dependencies
33
*/
4-
import { useRef } from '@wordpress/element';
4+
import { useCallback, useRef } from '@wordpress/element';
55
import { useViewportMatch } from '@wordpress/compose';
66
import {
77
ToolSelector,
@@ -27,6 +27,10 @@ import DocumentActions from './document-actions';
2727
import TemplateDetails from '../template-details';
2828
import { store as editSiteStore } from '../../store';
2929

30+
const preventDefault = ( event ) => {
31+
event.preventDefault();
32+
};
33+
3034
export default function Header( {
3135
openEntitiesSavedStates,
3236
isEntitiesSavedStatesOpen,
@@ -86,6 +90,20 @@ export default function Header( {
8690

8791
const isLargeViewport = useViewportMatch( 'medium' );
8892

93+
const openInserter = useCallback( () => {
94+
if ( isInserterOpen ) {
95+
// Focusing the inserter button closes the inserter popover
96+
inserterButton.current.focus();
97+
} else {
98+
setIsInserterOpened( true );
99+
}
100+
}, [ isInserterOpen, setIsInserterOpened ] );
101+
102+
const toggleListView = useCallback(
103+
() => setIsListViewOpened( ! isListViewOpen ),
104+
[ setIsListViewOpened, isListViewOpen ]
105+
);
106+
89107
return (
90108
<div className="edit-site-header">
91109
<div className="edit-site-header_start">
@@ -95,17 +113,8 @@ export default function Header( {
95113
variant="primary"
96114
isPressed={ isInserterOpen }
97115
className="edit-site-header-toolbar__inserter-toggle"
98-
onMouseDown={ ( event ) => {
99-
event.preventDefault();
100-
} }
101-
onClick={ () => {
102-
if ( isInserterOpen ) {
103-
// Focusing the inserter button closes the inserter popover
104-
inserterButton.current.focus();
105-
} else {
106-
setIsInserterOpened( true );
107-
}
108-
} }
116+
onMouseDown={ preventDefault }
117+
onClick={ openInserter }
109118
icon={ plus }
110119
label={ _x(
111120
'Toggle block inserter',
@@ -123,9 +132,7 @@ export default function Header( {
123132
isPressed={ isListViewOpen }
124133
/* translators: button label text should, if possible, be under 16 characters. */
125134
label={ __( 'List View' ) }
126-
onClick={ () =>
127-
setIsListViewOpened( ! isListViewOpen )
128-
}
135+
onClick={ toggleListView }
129136
shortcut={ listViewShortcut }
130137
/>
131138
</>

0 commit comments

Comments
 (0)