BemÀstra React refs för att direkt manipulera DOM, hantera fokus, integrera tredjepartsbibliotek och optimera grÀnssnittets prestanda. En komplett guide för modern React-utveckling.
Mönster för React Refs: Tekniker för DOM-manipulering i dynamiska grÀnssnitt
React, ett kraftfullt JavaScript-bibliotek för att bygga anvÀndargrÀnssnitt, uppmuntrar ofta till ett deklarativt tillvÀgagÄngssÀtt vid UI-utveckling. Ibland blir det dock nödvÀndigt att direkt manipulera Document Object Model (DOM). Det Àr hÀr React refs kommer in i bilden. Refs ger ett sÀtt att komma Ät DOM-noder eller React-element som skapats i render-metoden. Denna omfattande guide utforskar olika mönster och tekniker för React refs för att effektivt manipulera DOM, hantera fokus, integrera med tredjepartsbibliotek och optimera grÀnssnittets prestanda. Vi kommer att gÄ igenom praktiska exempel och bÀsta praxis som Àr lÀmpliga för en global publik av React-utvecklare.
FörstÄ React Refs
I grunden Àr en ref ett vanligt JavaScript-objekt med en current
-egenskap. Denna egenskap Àr muterbar, vilket gör att du kan lagra vilket vÀrde som helst, inklusive en DOM-nod eller en instans av en React-komponent. React erbjuder tvÄ primÀra sÀtt att skapa refs: React.createRef()
(klasskomponenter) och useRef()
-hooken (funktionella komponenter).
React.createRef() (Klasskomponenter)
React.createRef()
skapar ett ref-objekt som tilldelas en egenskap pÄ en klasskomponents instans. Denna ref kvarstÄr under hela komponentens livscykel.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
componentDidMount() {
// Kom Ät DOM-noden efter att komponenten har monterats
console.log(this.myRef.current); // DOM-nod eller null
}
render() {
return Hello, world!;
}
}
useRef() (Funktionella komponenter)
useRef()
-hooken skapar ett muterbart ref-objekt vars .current
-egenskap initieras med det medskickade argumentet (initialValue
). Det returnerade ref-objektet kvarstÄr under hela komponentens livstid.
import React, { useRef, useEffect } from 'react';
function MyFunctionalComponent() {
const myRef = useRef(null);
useEffect(() => {
// Kom Ät DOM-noden efter att komponenten har monterats
console.log(myRef.current); // DOM-nod eller null
}, []); // Tom beroendearray sÀkerstÀller att detta körs endast en gÄng vid montering
return Hello, world!;
}
Vanliga anvÀndningsomrÄden för React Refs
Refs Àr otroligt mÄngsidiga och kan anvÀndas i en mÀngd olika scenarier inom React-utveckling.
1. Komma Ät och manipulera DOM-noder
Det vanligaste anvÀndningsomrÄdet för refs Àr att direkt komma Ät och manipulera DOM-noder. Detta Àr anvÀndbart för uppgifter som att fokusera pÄ ett inmatningsfÀlt, skrolla till ett element eller mÀta dess dimensioner.
import React, { useRef, useEffect } from 'react';
function FocusInput() {
const inputRef = useRef(null);
useEffect(() => {
// Fokusera pÄ inmatningsfÀltet efter att komponenten har monterats
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return ;
}
Exempel: FörestÀll dig att du bygger ett flerstegsformulÀr. NÀr en anvÀndare fyller i ett fÀlt kanske du vill fokusera automatiskt pÄ nÀsta inmatningsfÀlt. Refs gör detta sömlöst.
2. Hantera fokus, textmarkering och mediauppspelning
Refs Àr avgörande för finkornig kontroll över fokus, textmarkering inom element och hantering av mediauppspelning (t.ex. video eller ljud).
import React, { useRef, useEffect } from 'react';
function VideoPlayer() {
const videoRef = useRef(null);
const playVideo = () => {
if (videoRef.current) {
videoRef.current.play();
}
};
const pauseVideo = () => {
if (videoRef.current) {
videoRef.current.pause();
}
};
return (
);
}
TillgÀnglighetsaspekt: NÀr du anvÀnder refs för att hantera fokus, sÀkerstÀll korrekt fokushantering för att upprÀtthÄlla tillgÀngligheten för anvÀndare som förlitar sig pÄ tangentbordsnavigering eller hjÀlpmedelsteknik. Till exempel, efter att en modal öppnats, sÀtt omedelbart fokus pÄ det första fokuserbara elementet inuti modalen.
3. Integrera med tredjepartsbibliotek
MÄnga tredjepartsbibliotek för JavaScript manipulerar DOM direkt. Refs utgör en brygga mellan Reacts deklarativa modell och dessa imperativa bibliotek.
import React, { useRef, useEffect } from 'react';
import Chart from 'chart.js/auto'; // Exempel: AnvÀnder Chart.js
function ChartComponent() {
const chartRef = useRef(null);
useEffect(() => {
if (chartRef.current) {
const ctx = chartRef.current.getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Röd', 'BlÄ', 'Gul', 'Grön', 'Lila', 'Orange'],
datasets: [{
label: '# av röster',
data: [12, 19, 3, 5, 2, 3],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
}
}, []);
return ;
}
Internationaliseringsnotering: NÀr du integrerar tredjepartsbibliotek som hanterar datum, siffror eller valutor, se till att de Àr korrekt konfigurerade för att stödja anvÀndarens locale. MÄnga bibliotek erbjuder alternativ för att specificera önskad locale. Till exempel bör bibliotek för datumformatering initieras med anvÀndarens sprÄk och region för att visa datum i rÀtt format (t.ex. MM/DD/à à à à vs. DD/MM/à à à à ).
4. Utlösa imperativa animationer
Ăven om React-bibliotek som Framer Motion och React Transition Group Ă€r att föredra för de flesta animationsbehov, kan refs anvĂ€ndas för imperativa animationer nĂ€r mer finkornig kontroll Ă€r nödvĂ€ndig.
import React, { useRef, useEffect } from 'react';
function FadeIn() {
const elementRef = useRef(null);
useEffect(() => {
const element = elementRef.current;
if (element) {
element.style.opacity = 0; // Initialt dold
let opacity = 0;
const intervalId = setInterval(() => {
opacity += 0.05;
element.style.opacity = opacity;
if (opacity >= 1) {
clearInterval(intervalId);
}
}, 20); // Justera intervall för hastighet
return () => clearInterval(intervalId); // StÀda upp vid avmontering
}
}, []);
return Fade In!;
}
5. MĂ€ta elementdimensioner
Refs gör det möjligt för dig att noggrant mÀta dimensionerna (bredd, höjd) pÄ element i DOM. Detta Àr anvÀndbart för responsiva layouter, dynamisk positionering och för att skapa anpassade visuella effekter.
import React, { useRef, useEffect, useState } from 'react';
function MeasureElement() {
const elementRef = useRef(null);
const [dimensions, setDimensions] = useState({ width: 0, height: 0 });
useEffect(() => {
const element = elementRef.current;
if (element) {
const width = element.offsetWidth;
const height = element.offsetHeight;
setDimensions({ width, height });
}
}, []);
return (
MĂ€t detta element
Bredd: {dimensions.width}px
Höjd: {dimensions.height}px
);
}
Avancerade Ref-mönster
Utöver den grundlÀggande anvÀndningen av createRef
och useRef
finns det flera avancerade mönster som utnyttjar refs för mer komplexa scenarier.
1. Callback Refs
Callback refs erbjuder ett mer flexibelt sÀtt att komma Ät DOM-noder. IstÀllet för att tilldela ett ref-objekt, tilldelar du en funktion till ref
-attributet. React kommer att anropa denna funktion med DOM-noden nÀr komponenten monteras och med null
nÀr den avmonteras.
import React, { useState } from 'react';
function CallbackRefExample() {
const [element, setElement] = useState(null);
const setRef = (node) => {
setElement(node);
};
return (
Detta elements ref hanteras av en callback.
{element && Element: {element.tagName}
}
);
}
Callback refs Àr sÀrskilt anvÀndbara nÀr du behöver utföra ytterligare ÄtgÀrder nÀr en ref sÀtts eller rensas.
2. Vidarebefordra Refs (forwardRef)
React.forwardRef
Àr en teknik som lÄter en komponent ta emot en ref som skickas frÄn dess förÀldrakomponent. Detta Àr anvÀndbart nÀr du vill exponera en DOM-nod frÄn en barnkomponent till dess förÀlder.
import React, { forwardRef } from 'react';
const MyInput = forwardRef((props, ref) => {
return ;
});
function ParentComponent() {
const inputRef = React.useRef(null);
const focusInput = () => {
if (inputRef.current) {
inputRef.current.focus();
}
};
return (
);
}
I det hÀr exemplet vidarebefordrar MyInput
ref:en till det underliggande input-elementet, vilket gör att ParentComponent
direkt kan komma Ät och manipulera inmatningsfÀltet.
3. Exponera komponentmetoder med Refs
Refs kan ocksÄ anvÀndas för att exponera metoder frÄn en barnkomponent till dess förÀlder. Detta Àr anvÀndbart för att skapa ÄteranvÀndbara komponenter med imperativa API:er.
import React, { useRef, useImperativeHandle, forwardRef } from 'react';
const FancyInput = forwardRef((props, ref) => {
const inputRef = useRef(null);
useImperativeHandle(ref, () => ({
focus: () => {
inputRef.current.focus();
},
getValue: () => {
return inputRef.current.value;
}
}));
return ;
});
function ParentComponent() {
const fancyInputRef = useRef(null);
const handleFocus = () => {
fancyInputRef.current.focus();
};
const handleGetValue = () => {
alert(fancyInputRef.current.getValue());
};
return (
);
}
useImperativeHandle
-hooken lÄter dig anpassa det instansvÀrde som exponeras för förÀldrakomponenter nÀr du anvÀnder forwardRef
. Detta möjliggör kontrollerad Ätkomst till barnets metoder.
BÀsta praxis för att anvÀnda React Refs
Ăven om refs erbjuder kraftfulla möjligheter Ă€r det avgörande att anvĂ€nda dem omdömesgillt och följa bĂ€sta praxis.
- Undvik överdriven DOM-manipulering: Reacts deklarativa tillvÀgagÄngssÀtt Àr generellt mer effektivt. AnvÀnd endast refs nÀr det Àr nödvÀndigt för uppgifter som inte enkelt kan uppnÄs genom Reacts state-hantering.
- AnvĂ€nd Refs sparsamt: ĂveranvĂ€ndning av refs kan leda till kod som Ă€r svĂ„rare att underhĂ„lla och resonera kring.
- Var medveten om komponentens livscykel: Se till att du endast kommer Ät
.current
-egenskapen för en ref efter att komponenten har monterats (t.ex. icomponentDidMount
elleruseEffect
). Att komma Ät den innan kan resultera inull
-vÀrden. - StÀda upp Refs: NÀr du anvÀnder callback refs, se till att du sÀtter ref:en till
null
nĂ€r komponenten avmonteras för att förhindra minneslĂ€ckor. - ĂvervĂ€g alternativ: Innan du tar till refs, undersök om Reacts state-hantering eller kontrollerade komponenter kan uppnĂ„ det önskade beteendet.
- TillgÀnglighet: NÀr du manipulerar fokus, se till att applikationen förblir tillgÀnglig för anvÀndare med funktionsnedsÀttningar.
Globala övervÀganden vid anvÀndning av Refs
NÀr du bygger applikationer för en global publik, övervÀg följande aspekter vid anvÀndning av refs:
- Höger-till-vÀnster (RTL) layouter: NÀr du manipulerar DOM-element relaterade till layout (t.ex. skrollning), se till att din kod hanterar RTL-layouter korrekt för sprÄk som arabiska och hebreiska. AnvÀnd egenskaper som
scrollLeft
ochscrollWidth
med försiktighet och normalisera dem eventuellt baserat pÄ layoutens riktning. - Input Method Editors (IME:er): Var medveten om att anvÀndare i vissa regioner kan anvÀnda IME:er för att mata in text. NÀr du hanterar fokus eller textmarkering, se till att din kod interagerar korrekt med IME:er och inte stör anvÀndarens inmatning.
- InlÀsning av typsnitt: Om du mÀter elementdimensioner innan typsnitten har laddats helt, kan de initiala mÀtningarna vara felaktiga. AnvÀnd tekniker för att sÀkerstÀlla att typsnitt Àr laddade innan du förlitar dig pÄ dessa mÀtningar (t.ex. med
document.fonts.ready
). Olika skriftsystem (t.ex. latinska, kyrilliska, CJK) har mycket olika typsnittsstorlekar och metrik. - AnvÀndarpreferenser: Ta hÀnsyn till anvÀndarpreferenser för animationer och övergÄngar. Vissa anvÀndare kan föredra reducerad rörelse. Respektera dessa preferenser nÀr du anvÀnder refs för att utlösa animationer. AnvÀnd CSS-mediafrÄgan `prefers-reduced-motion` för att upptÀcka anvÀndarpreferenser.
Slutsats
React refs Àr ett kraftfullt verktyg för att direkt manipulera DOM, hantera fokus, integrera med tredjepartsbibliotek och optimera grÀnssnittets prestanda. Genom att förstÄ de olika ref-mönstren och följa bÀsta praxis kan du utnyttja refs effektivt samtidigt som du bibehÄller fördelarna med Reacts deklarativa tillvÀgagÄngssÀtt. Kom ihÄg att ta hÀnsyn till global tillgÀnglighet och internationaliseringsaspekter för att skapa inkluderande och anvÀndarvÀnliga applikationer för en mÄngsidig publik. Med noggrann planering och implementering kan React refs avsevÀrt förbÀttra funktionerna och responsiviteten i dina React-applikationer.