Fix: Tab click events firing multiple times due to missing useCallback dependency
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 72/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- react, typescript
- Bereich
- frontend
Rechercherichtung
Beginne mit der Untersuchung von Tabs.js und konzentriere dich auf die in der Issue beschriebene Funktion onInternalTabClick und die Memoization von tabKeys. Reproduziere das Verhalten mit dynamisch wechselnden Tab-Inhalten und häufigen erneuten Renderings und überprüfe anschließend, dass jeder Tab-Klick onChange genau einmal aufruft.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Problem Description
When using rc-tabs, tab click events can fire multiple times unexpectedly, especially when the component re-renders frequently. This happens because the onInternalTabClick function is recreated on every render without proper memoization.
Root Cause
The issue is in the Tabs.js file where onInternalTabClick function is defined as a regular function instead of using React.useCallback. This causes the function to be recreated on every render, which can lead to:
- Unnecessary re-renders of child components
- Multiple event handlers being attached
- Click events firing multiple times
Solution
The fix involves two main changes:
- Memoize tab keys: Use
React.useMemoto memoize the tab keys array to prevent unnecessary re-computations - Memoize click handler: Wrap
onInternalTabClickwithReact.useCallbackto prevent function recreation on every render
Code Changes
// Before
var tabKeys = React.useMemo(function () {
return tabs.map(function (tab) {
return tab.key;
});
}, [tabs]);
// After
var tabKeys = React.useMemo(function () {
return tabs.map(function (tab) {
return tab.key;
});
}, [tabs]);
// Before
function onInternalTabClick(key, e) {
onTabClick === null || onTabClick === void 0 || onTabClick(key, e);
var isActiveChanged = key !== mergedActiveKey;
setMergedActiveKey(key);
if (isActiveChanged) {
onChange === null || onChange === void 0 || onChange(key);
}
}
// After
var onInternalTabClick = React.useCallback(function (key, e) {
onTabClick === null || onTabClick === void 0 || onTabClick(key, e);
var isActiveChanged = key !== mergedActiveKey;
setMergedActiveKey(key);
if (isActiveChanged) {
onChange === null || onChange === void 0 || onChange(key);
}
}, [onTabClick, mergedActiveKey, onChange]);
Reproduction Steps
- Create a Tabs component with dynamic content
- Add console.log in the onChange handler
- Click on a tab multiple times
- Observe that the onChange handler fires multiple times for a single click
Expected Behavior
Each tab click should trigger the onChange handler exactly once, regardless of component re-renders.
Environment
- rc-tabs version: [affected versions]
- React version: [tested versions]
- Browser: All browsers
Impact
This issue affects applications that:
- Have frequent re-renders
- Use dynamic tab content
- Rely on accurate click event handling
- Need to prevent duplicate API calls or state updates
The fix improves performance and prevents unexpected behavior in applications using rc-tabs.
- Vorherrschende Sprache
- TypeScript
- Sterne
- 573
- Forks
- 245
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus react-component/tabs
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
react-component/tabs#809 · 1 Kommentar ·
-
Editable tabs: add and remove buttons owned by role=tablist keep aria-required-children firingEvtl. wieder frei @A-RYAN-1 hat das vor 17 Tagen übernommen, und es ist kein Pull Request offen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 65/100
react-component/tabs#1025 · 5 Kommentare ·
-
[Accessibility] tabBarExtraContent is owned by role="tablist"Evtl. wieder frei Ein Pull Request dazu wurde ohne Merge geschlossen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 64/100
react-component/tabs#1013 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 48/100
react-component/tabs#777 · 1 Reaktion ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 25/100
react-component/tabs#726 ·
Alle Issues in react-component/tabs
Ähnliche Issues
-
check:passed streams:remove
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 67/100
Maintainer antworten meist innerhalb von 1 Tag
-
bug priority-p1
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
-
beginner blocked
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
hiero-ledger/hiero-sdk-js#4670 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Exploratory] Expense - 2 selected drop-down is shown twice when selecting hold from more option.OffenMonthly Not a priority
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
Expensify/App#106080 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag