useDeferredValueã§Reactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæå€§éã«åŒãåºããŸãããã®æ©èœãå®çšçãªå¿çšäŸãã°ããŒãã«éçºã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠè§£èª¬ããŸãã
React useDeferredValue: ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹æé©åã«é¢ãã詳现ãªåæ
仿¥ã®ãŸããŸãè€éåããWebç°å¢ã«ãããŠãäžè²«ããŠã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããšã¯æéèŠèª²é¡ã§ãããç¹ã«ãããŸããŸãªãããã¯ãŒã¯ç°å¢ãããã€ã¹ã®èœåãæã€å€æ§ãªãŠãŒã¶ãŒããŒã¹ã«å¯Ÿå¿ããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠã¯äžå¯æ¬ ã§ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹æ§ç¯ã®ããã®åŒ·åãªJavaScriptã©ã€ãã©ãªã§ããReactã¯ãéçºè
ããããå®çŸããããã®ããŸããŸãªããŒã«ãæäŸããŠããŸãããã®äžã§ããuseDeferredValue
ããã¯ã¯ãUIã®éèŠåºŠã®äœãéšåãžã®æŽæ°ãé
ãããããšã«ãã£ãŠãã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãæé©åããããã®åŒ·åãªã¡ã«ããºã ãšããŠéç«ã£ãŠããŸãããã®å
æ¬çãªã¬ã€ãã§ã¯ãuseDeferredValue
ã®è€éãããã®å©ç¹ãåœéçãªäŸãçšããå®çšçãªãŠãŒã¹ã±ãŒã¹ããããŠã°ããŒãã«ãªReactãããžã§ã¯ãã§å¹æçã«æŽ»çšããããã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠè§£èª¬ããŸãã
ããã©ãŒãã³ã¹æé©åã®å¿ èŠæ§ãçè§£ãã
ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã¯ãåçã§ããŒã¿ãè±å¯ã§ãããŠãŒã¶ãŒã¯å³åº§ã®ãã£ãŒãããã¯ãšã·ãŒã ã¬ã¹ãªã€ã³ã¿ã©ã¯ã·ã§ã³ãæåŸ ããŠããŸããããããé »ç¹ãªç¶æ æŽæ°ãå€§èŠæš¡ãªãªã¹ããè€éãªèšç®ããŸãã¯ãªã¢ã«ã¿ã€ã ã®ããŒã¿ã¹ããªãŒã ãæ±ãå ŽåãReactã®ããã©ã«ãã®ã¬ã³ããªã³ã°åäœã¯ãããã©ãŒãã³ã¹ããã«ããã¯ã«ã€ãªããããšããããŸãããããã¯æ¬¡ã®ããã«çŸããå¯èœæ§ããããŸãã
- UIã®é å»¶: å ¥åãã£ãŒã«ããžã®å ¥åããå€§èŠæš¡ãªããŒã¿ã»ããã®ãã£ã«ã¿ãªã³ã°ãªã©ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãé ãæããããããšããããŸãã
- ãã¬ãŒã ã®ãããã: è€éãªã¢ãã¡ãŒã·ã§ã³ããã©ã³ãžã·ã§ã³ãã«ã¯ã€ããããã¡ãªããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãçã¿åºãå¯èœæ§ããããŸãã
- å¿çã®ãªãå ¥å: ãã©ãŠã¶ãã¬ã³ããªã³ã°ã®èŠæ±ã«å¯Ÿå¿ããã®ã«èŠåŽãããããéèŠãªãŠãŒã¶ãŒå ¥åãé ããå¯èœæ§ããããŸãã
ãããã®åé¡ã¯ãã°ããŒãã«ãªç¶æ³ã§å¢å¹ ãããŸããã€ã³ã¿ãŒãããæ¥ç¶ãé ãå°åããæ§èœã®äœãããã€ã¹ã䜿çšããŠãããŠãŒã¶ãŒã¯ããããã®ããã©ãŒãã³ã¹äœäžããã匷ãçµéšããããšã«ãªããŸãããããã£ãŠãç©æ¥µçãªããã©ãŒãã³ã¹æé©åã¯ãåãªãèŽ æ²¢ã§ã¯ãªããäžçäžã§å æ¬çã§é«æ§èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®å¿ èŠäžå¯æ¬ ãªèŠçŽ ãšãªã£ãŠããŸãã
useDeferredValue
ã®ç޹ä»
useDeferredValue
ã¯ãReact 18ã§å°å
¥ãããããã®æ°ããåæå®è¡æ©èœã®äžéšã§ããReactããã¯ã§ãããã®äž»ãªç®çã¯ãæ®ãã®éšåããããã¯ããããšãªããUIã®äžéšã®æŽæ°ãé
ãããããšã§ããæ¬è³ªçã«ãReactã«å¯Ÿããã¡ã€ã³ã¹ã¬ããã空ããŸã§ãç¹å®ã®å€ãåã¬ã³ããªã³ã°ããããšãå»¶æããããã«æç€ºããŸãã
ãã®ããã«èããŠã¿ãŸãããã2ã€ã®ã¿ã¹ã¯ããããŸããã¿ã¹ã¯Aã¯éèŠã§ãããããã«å®è¡ããå¿
èŠããããŸãïŒäŸïŒãŠãŒã¶ãŒå
¥åãžã®å¿çïŒãã¿ã¹ã¯Bã¯ããã»ã©éèŠã§ã¯ãªããã¿ã¹ã¯Aãå®äºãããŸã§åŸ
ã€ããšãã§ããŸãïŒäŸïŒãã®å
¥åã«åºã¥ããŠé·ããªã¹ããåã¬ã³ããªã³ã°ããïŒãuseDeferredValue
ã¯ããããã®åªå
é äœã管çããã®ã«åœ¹ç«ã¡ãŸãã
ä»çµã¿
useDeferredValue
ã§å€ãã©ããããŸããå
ã®å€ã倿ŽããããšãReactã¯æ°ããå€ã§åã¬ã³ããªã³ã°ãã¹ã±ãžã¥ãŒã«ããŸãããã ããuseDeferredValue
ã¯ãããã€ã³ã¿ãŒã»ããããéèŠãªæŽæ°ãç¶è¡ã§ããããã«ãæåã«*以åã®*å€ã§UIãã¬ã³ããªã³ã°ããããã«Reactã«æç€ºããŸããã¡ã€ã³ã¹ã¬ãããã¢ã€ãã«ç¶æ
ã«ãªããšãReactã¯æ°ããå€ã§é
å»¶éšåãåã¬ã³ããªã³ã°ããŸãã
ããã¯ã®ã·ã°ããã£ã¯ç°¡åã§ãã
const deferredValue = useDeferredValue(value);
ããã§ãvalue
ã¯é
å»¶ãããå€ã§ããdeferredValue
ã¯æåã¯value
ãšåãã§ãããvalue
ã倿ŽããããšãReactãå®å
šã«æŽæ°ã§ããããã«ãªããŸã§ãdeferredValue
ã¯ä»¥åã®å€ãä¿æããŸãã
useDeferredValue
ã®äž»ãªå©ç¹
useDeferredValue
ãæŽ»çšããããšã§ãReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«ããã€ãã®éèŠãªå©ç¹ãåŸãããŸãã
- å¿çæ§ã®åäž: æ¬è³ªçã§ãªãæŽæ°ãé ãããããšã«ãããã¡ã€ã³ã¹ã¬ããã¯ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãåŠçãç¶ããããšãã§ããããã¯ã°ã©ãŠã³ãã§ã®èšç®ã«é¢ä¿ãªããUIããããããšå¿çããããã«ãªããŸãã
- ããã¹ã ãŒãºãªãã©ã³ãžã·ã§ã³: ããã§ãªããã°ãžã£ã³ã¯ãåŒãèµ·ããå¯èœæ§ã®ããè€éãªåã¬ã³ããªã³ã°ãã¹ã ãŒãºã«ããããšãã§ããããå¿«é©ãªã¢ãã¡ãŒã·ã§ã³ãšèŠèŠçãªãã£ãŒãããã¯ã«ã€ãªãããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäž: ããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ã¯ããã幞ããªãŠãŒã¶ãŒã«ã€ãªãããŸããããã¯ãçæ³çãšã¯èšããªããããã¯ãŒã¯ç°å¢ã§æäœããŠããå¯èœæ§ã®ããã°ããŒãã«ãŠãŒã¶ãŒã«ãšã£ãŠç¹ã«åœãŠã¯ãŸããŸãã
- åæå®è¡æ§ã®ç°¡çŽ å: Reactã®åæå®è¡æ©èœã宣èšçã«ãªããã€ã³ããæ¹æ³ãæäŸããç¹å®ã®ã±ãŒã¹ã§
requestAnimationFrame
ããããŠã³ã¹æè¡ãæåã§å®è£ ããããšãªããè€éãªã¬ã³ããªã³ã°ã·ããªãªãããç°¡åã«ç®¡çã§ããŸãã
ã°ããŒãã«ãªäŸãçšããå®çšçãªãŠãŒã¹ã±ãŒã¹
useDeferredValue
ã¯ã以äžã®ãããªã·ããªãªã§ç¹ã«åœ¹ç«ã¡ãŸãã
1. å€§èŠæš¡ãªã¹ãã®ãã£ã«ã¿ãªã³ã°ãšæ€çŽ¢
äœåãã®ååã®äžãããŠãŒã¶ãŒãæ€çŽ¢ã§ããã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ããããŠãŒã¶ãŒãæ€çŽ¢ããŒã«å ¥åãããšãçµæã®ãªã¹ããæŽæ°ããå¿ èŠããããŸããé å»¶ãããªããšãå ¥åãéããšããã£ã«ã¿ãªã³ã°ããžãã¯ãå®è¡ãããUIãåããŒã¹ãããŒã¯ã§åã¬ã³ããªã³ã°ããããããé å»¶ãçºçããå¯èœæ§ããããŸãã
ã·ããªãª: ãŠãŒã¶ãŒããã©ã€ããæ€çŽ¢ã§ããå€åœç±ã®æ è¡äºçŽãµã€ãããŠãŒã¶ãŒãç®çå°ã®éœåžïŒäŸïŒããã¥ãŒãšãŒã¯ãããæ±äº¬ããããã«ãªã³ãïŒãå ¥åãããšãäžèŽããéœåžã®é·ããªã¹ãããã£ã«ã¿ãªã³ã°ãããå¿ èŠããããŸããäžéšã®éœåžã§ã¯ãããŒã¿ããŒã¹ã«æ°åãã®æœåšçãªäžèŽãããå¯èœæ§ããããŸãã
å®è£ :
import React, { useState, useDeferredValue } from 'react';
function FlightSearch() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
const cities = ['New York, USA', 'Tokyo, Japan', 'Berlin, Germany', 'London, UK', 'Paris, France', 'Sydney, Australia', 'Mumbai, India', 'Beijing, China', 'Cairo, Egypt', 'Rio de Janeiro, Brazil']; // A much larger list in a real app
const filteredCities = cities.filter(city =>
city.toLowerCase().includes(deferredQuery.toLowerCase())
);
return (
setQuery(e.target.value)}
placeholder="Search for a city..."
/>
{filteredCities.map((city, index) => (
- {city}
))}
);
}
説æ: ãŠãŒã¶ãŒãå
¥åãããšãsetQuery
ãç¶æ
ãããã«æŽæ°ããŸããããã«ãããåã¬ã³ããªã³ã°ãããªã¬ãŒãããŸãããã ããdeferredQuery
ã¯ãæåã¯åã®å€ãä¿æããŸããReactã¯ãå
¥åãšãªã¹ããdeferredQuery
ã䜿çšããŠã¬ã³ããªã³ã°ããŸããããã¯ã°ã©ãŠã³ãã§ã¯ãReactã¯query
ã倿ŽãããããšãèªèããŸããã¡ã€ã³ã¹ã¬ããã空ã«ãªããšãæŽæ°ãããdeferredQuery
ã§ã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããææ°ã®æ€çŽ¢çµæã§ãªã¹ããæŽæ°ããŸãããã®ããã»ã¹å
šäœãéããŠãå
¥åãã£ãŒã«ãã¯å¿çæ§ãç¶æããŸãã
ã°ããŒãã«ãªèæ ®äºé : åã¢ãžã¢ãã¢ããªã«ã®äžéšãªã©ã垯åå¹ ãéãããŠããåœã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯ããã®é å»¶ã¬ã³ããªã³ã°ã«ãããæœåšçã«é ãããŒã¿ãã§ãããå€§èŠæš¡ãªããŒã¿ã»ããã«å¯Ÿããè€éãªãã£ã«ã¿ãªã³ã°ãåå ã§ãæ€çŽ¢å ¥åãå¿çããªããªãããšãé²ããŸããå ¥åãã£ãŒã«ãã«å¯Ÿãã峿ã®ãã£ãŒãããã¯ã¯äžå¯æ¬ ã§ãã
2. å€§èŠæš¡ããŒã¿ã»ããã®è¡šç€ºïŒããŒãã«ãã°ãªããïŒ
ã°ããŒãã«ãªéèåžå Žã®ããã·ã¥ããŒããå€åœç±äŒæ¥ã®åšåº«ç®¡çã·ã¹ãã ããŸãã¯ãœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒããªã©ã倧éã®ããŒã¿ãæ±ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã®ããŒã¿ãããŒãã«ãŸãã¯ã°ãªããã§è¡šç€ºããããšããããããŸãããããã®å€§èŠæš¡ãªæ§é ãåã¬ã³ããªã³ã°ããããšã¯ããªãœãŒã¹ã倧éã«æ¶è²»ããå¯èœæ§ããããŸãã
ã·ããªãª: æ°åã®æ ªåŒã®ãªã¢ã«ã¿ã€ã äŸ¡æ ŒæŽæ°ã衚瀺ããã°ããŒãã«ãªæ ªåŒåžå Žãã©ãã«ãŒãæ°ããäŸ¡æ ŒããŒã¿ãå°çãããšãããŒãã«ã¯ãããã®å€æŽãåæ ããå¿ èŠããããŸãããã ããäžéšã®æ ªåŒã¯ãŠãŒã¶ãŒã®ããŠã©ãããªã¹ããïŒéèŠãªèŠçŽ ïŒã«ãããä»ã®æ ªåŒã¯äžè¬çãªãã£ãŒãã®äžéšã«ãããŸããïŒå³æã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãšããŠã¯éèŠåºŠãäœãïŒã
å®è£
: useDeferredValue
ã¯ããµãããªãŒå
šäœã®é
å»¶ã«ã¯åªããŠããŸããã倧ããªããŒãã«å
ã®ãã现ããæŽæ°ïŒåã
ã®ã»ã«ã®å€æŽãªã©ïŒã«ã¯ãReact.memo
ãŸãã¯ä»®æ³åããããªã¹ããªã©ã®æè¡ã®æ¹ãé©ããŠããããšããããããŸãããã ããuseDeferredValue
ã¯ãããŒãã«ã®*äžéš*ãéèŠåºŠã®äœãããŒã¿ã«åºã¥ããŠæŽæ°ããå¿
èŠãããå ŽåããŸãã¯è€éãªãã£ã«ã¿ãªã³ã°/ãœãŒãæäœã衚瀺å
šäœã«åœ±é¿ããå Žåã«åœ¹ç«ã¡ãŸãã
ããç°¡åãªã±ãŒã¹ãèããŠã¿ãŸããããé²è¡äžã®ã°ããŒãã«ãããžã§ã¯ãã®ãªã¹ããæã€ããã·ã¥ããŒããã¹ããŒã¿ã¹ãŸãã¯å°åã§ãããã®ãããžã§ã¯ãããã£ã«ã¿ãªã³ã°ããŠããããã·ã¥ããŒãå šäœãããªãŒãºããããšã¯ãããŸããã
import React, { useState, useDeferredValue } from 'react';
function ProjectDashboard() {
const [filterRegion, setFilterRegion] = useState('');
const deferredFilterRegion = useDeferredValue(filterRegion);
const projects = [
{ id: 1, name: 'Project Alpha', region: 'Europe', status: 'In Progress' },
{ id: 2, name: 'Project Beta', region: 'Asia', status: 'Completed' },
{ id: 3, name: 'Project Gamma', region: 'North America', status: 'Planning' },
{ id: 4, name: 'Project Delta', region: 'Europe', status: 'Completed' },
{ id: 5, name: 'Project Epsilon', region: 'Asia', status: 'In Progress' },
{ id: 6, name: 'Project Zeta', region: 'South America', status: 'In Progress' },
]; // Imagine this list contains thousands of projects
const filteredProjects = projects.filter(project =>
deferredFilterRegion === '' || project.region === deferredFilterRegion
);
return (
Global Projects
Projects
{filteredProjects.map(project => (
-
{project.name} ({project.region}) - {project.status}
))}
);
}
ã°ããŒãã«ãªèæ ®äºé : ãããžã§ã¯ãããã£ã«ã¿ãªã³ã°ããããšããŠãããã©ãžã«ã®ãŠãŒã¶ãŒã¯ãæ°åã®ã¬ã³ãŒãã«å¯Ÿãããã£ã«ã¿ãªã³ã°ããžãã¯ããããã¯ãããŠããå Žåãé¡èãªé å»¶ãçµéšããå¯èœæ§ããããŸãããããžã§ã¯ããªã¹ãã®æŽæ°ãé ãããããšã§ãå°åãã£ã«ã¿ããããããŠã³ã¯å¿çæ§ãç¶æãããªã¹ãã¯ããã¯ã°ã©ãŠã³ãã§ã¹ã ãŒãºã«æŽæ°ãããŸããããã¯ãå ç¢æ§ã®äœãã€ã³ã¿ãŒãããã€ã³ãã©ã¹ãã©ã¯ãã£ã«äŸåããŠããå°åã®ãŠãŒã¶ãŒã«ãšã£ãŠãå¹ççãªã¯ã©ã€ã¢ã³ãåŽã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã«äžå¯æ¬ ã§ãã
3. è€éãªUIç¶æ æŽæ°ã®åŠç
ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãè€æ°ã®ç¶æ æŽæ°ãããªã¬ãŒããããšãããããã®äžéšã¯ä»ã®ãã®ãããéèŠã§ããããšãã°ããã©ãŒã å ¥åã®æŽæ°ã«ãã£ãŠãè€éãªèšç®ããUIã®å€§éšåãåã¬ã³ããªã³ã°ããå¯äœçšãããªã¬ãŒãããå ŽåããããŸãã
ã·ããªãª: 倿®µéã®åœéãªã³ããŒãã£ã³ã°ãã©ãŒã ããŠãŒã¶ãŒãèªåœãéžæãããšããã©ãŒã ã¯åçã«åœåºæã®ãã£ãŒã«ããæ€èšŒã«ãŒã«ãèªã¿èŸŒã¿ãæœåšçã«ãã®ãããã¡ã€ã«ã®æŠèŠãã¥ãŒãæŽæ°ããå ŽåããããŸããåœåºæã®ããŒã¿ã®èªã¿èŸŒã¿ã«ã¯ãã°ããæéããããå ŽåããããŸãã
å®è£ :
import React, { useState, useDeferredValue } from 'react';
function OnboardingForm() {
const [country, setCountry] = useState('USA');
const deferredCountry = useDeferredValue(country);
// Simulate fetching country-specific data
const getCountrySpecificFields = (countryCode) => {
console.log(`Fetching fields for: ${countryCode}`);
// In a real app, this would be an API call or a large data lookup
if (countryCode === 'USA') return ['Zip Code', 'State'];
if (countryCode === 'CAN') return ['Postal Code', 'Province'];
if (countryCode === 'IND') return ['PIN Code', 'State/UT'];
return ['Address Line 1', 'City', 'Region'];
};
const countrySpecificFields = getCountrySpecificFields(deferredCountry);
return (
International Onboarding
Address Details
{countrySpecificFields.map((field, index) => (
))}
);
}
説æ: ãŠãŒã¶ãŒãæ°ããåœãéžæãããšãcountry
ã®ç¶æ
ãæŽæ°ãããŸããdeferredCountry
ã¯ãæåã¯å€ãå€ã衚瀺ããŸããåã®åœã«é¢é£ããå
¥åãã£ãŒã«ããã¬ã³ããªã³ã°ãããŸããæ°ããåœã®ïŒã·ãã¥ã¬ãŒããããïŒããŒã¿ãã§ãããå®äºããReactã®ã¹ã±ãžã¥ãŒã©ãŒãé©åã§ãããšå€æãããšãdeferredCountry
ãæŽæ°ãããäœæãã£ãŒã«ããæ°ããåœã®ç¹å®ã®èŠä»¶ã§åã¬ã³ããªã³ã°ãããŸããåœã»ã¬ã¯ã¿ãŒèªäœã¯ããã«ã€ã³ã¿ã©ã¯ãã£ããªãŸãŸã§ãã
ã°ããŒãã«ãªèæ ®äºé : ã€ã³ããªã©ãäœæåœ¢åŒãè€éã§ãã€ã³ãã©ã¹ãã©ã¯ãã£ãåå ã§ããŒã¿ã®èªã¿èŸŒã¿ãé ããªãå¯èœæ§ãããå°åã§ã¯ããããã®ç¹å®ã®ãã£ãŒã«ãã®èªã¿èŸŒã¿ãšã¬ã³ããªã³ã°ãé ãããããšã§ãæåã®åœã®éžæãç¬æã«è¡ãããããšãä¿èšŒãããŸããããã«ããããŠãŒã¶ãŒããªã³ããŒãã£ã³ã°ããã»ã¹ãããã²ãŒãããéã®äžæºãé²ããŸãã
useDeferredValue
ã䜿çšããå Žå
useDeferredValue
ã¯ã以äžã®å Žåã«æé©ã§ãã
- ãã³ããããã³ã°ã¬ã³ããªã³ã°: UIã®äžéšãã峿ã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«åœ±é¿ãäžããããšãªããå°ãé ããŠæŽæ°ã§ããå Žåã
- é«ã³ã¹ãã®èšç®: ç¶æ ã®å€åã«ãUIãããªãŒãºãããå¯èœæ§ã®ããèšç®éçŽçãªã¿ã¹ã¯ïŒäŸïŒè€éãªãã£ã«ã¿ãªã³ã°ããœãŒããããŒã¿å€æïŒãå¿ èŠãªå Žåã
- å€§èŠæš¡ãªãªã¹ããŸãã¯ããªãŒã®ã¬ã³ããªã³ã°: 倧éã®ããŒã¿ã®ã³ã¬ã¯ã·ã§ã³ãæŽæ°ãŸãã¯ãã£ã«ã¿ãªã³ã°ããå Žåã
- å ¥åãå¿çæ§ã®é«ãç¶æ ã«ä¿ã€: å ¥åãã£ãŒã«ããã倿ŽãéèŠãªUIã®æŽæ°ãããªã¬ãŒããå Žåã§ããå¿çæ§ãç¶æããŠããããšã確èªããŸãã
useDeferredValue
ã䜿çšããªãå Žå
useDeferredValue
ãæ³šææ·±ã䜿çšããããšãéèŠã§ãã
- éèŠãªããŒã¿: ãŠãŒã¶ãŒå ¥åãŸãã¯éèŠãªã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãšããã«äžè²«æ§ãå¿ èŠãªããŒã¿ã«ã¯ã決ããŠäœ¿çšããªãã§ãã ãããããšãã°ããä¿åããã¿ã³ã®ç¡å¹ãªç¶æ ã¯ãé å»¶ã§ã¯ãªããããã«æŽæ°ããå¿ èŠããããŸãã
- å°ããªãªã¹ããŸãã¯èšç®: å°ããªããŒã¿ã»ãããŸãã¯åçŽãªèšç®ã®å Žåã
useDeferredValue
ã®ãªãŒããŒãããããã®ã¡ãªãããäžåãå¯èœæ§ããããŸãã - 粟床ãå¿ èŠãšããã¢ãã¡ãŒã·ã§ã³: äžéšã®ã¢ãã¡ãŒã·ã§ã³ãã¹ã ãŒãºã«ããããšãã§ããŸãããéåžžã«æ£ç¢ºãªã¿ã€ãã³ã°ãšå³æã®ãã¬ãŒã æŽæ°ã«äŸåããã¢ãã¡ãŒã·ã§ã³ã¯ãä»ã®ææ³ã§åŠçããæ¹ãè¯ãå ŽåããããŸãã
- ãã¹ãŠã®ãããŠã³ã¹/ã¹ããããªã³ã°ã®çœ®ãæã:
useDeferredValue
ã¯ããŠãŒã¶ãŒå ¥åã€ãã³ãèªäœã®ãããŠã³ã¹ãŸãã¯ã¹ããããªã³ã°ã®çŽæ¥çãªä»£æ¿ã§ã¯ãããŸãããç¶æ ã®å€åã«ãã£ãŠåŒãèµ·ãããã*ã¬ã³ããªã³ã°*ãé ãããŸãã
useDeferredValue
vs. useTransition
useDeferredValue
ãšuseTransition
ã¯ã©ã¡ããUIããã©ãŒãã³ã¹ãåäžãããããšãç®çãšããåæå®è¡æ©èœã§ãããããæ··åããã¡ã§ãããã ãããããã¯å°ãç°ãªãç®çã«åœ¹ç«ã¡ãŸãã
useDeferredValue
: *å€*ã®æŽæ°ãé ãããŸããæ°ããå€ãããã¯ã°ã©ãŠã³ãã§èšç®ãŸãã¯ã¬ã³ããªã³ã°ãããŠããéãUIã®äžéšãå€ãå€ã§ã¬ã³ããªã³ã°ããå Žåã«åœ¹ç«ã¡ãŸããäž»ã«å®£èšçã§ãããé å»¶ãèªåçã«åŠçããŸããuseTransition
: ç¹å®ã®ç¶æ æŽæ°ããã©ã³ãžã·ã§ã³ãšããŠããŒã¯ããããšãå¯èœã«ããŸãããã©ã³ãžã·ã§ã³ã¯ãããç·æ¥æ§ã®é«ãæŽæ°ïŒãŠãŒã¶ãŒå ¥åãªã©ïŒãæ¥ãå Žåã«Reactãäžæã§ãããç·æ¥åºŠã®äœãæŽæ°ã§ããã©ã®æŽæ°ãç·æ¥ã§ãã©ããããã§ãªãããããæç€ºçã«å¶åŸ¡ã§ãããã©ã³ãžã·ã§ã³ãé²è¡äžãã©ããã瀺ãisPending
ãã©ã°ãå ¬éããŸãã
ã¢ãããžãŒ:
useDeferredValue
: ã¢ã·ã¹ã¿ã³ãã«ãããšããããå€ãã¬ããŒãã衚瀺ããæ°ããããŒã¿ãå ¥ãæ¬¡ç¬¬æŽæ°ããŠããšäŒããããšãæ³åããŠãã ãããuseTransition
: ããã®ã¬ããŒããæŽæ°ããŠãã ããããã ããCEOãç·æ¥ã®èŠæ±ãæã£ãŠå ¥ã£ãŠããå Žåã¯ãã¬ããŒãã®æŽæ°ãäžæ¢ããŠããŸãCEOã«å¯Ÿå¿ããŠãã ãããããšèšã£ãŠããããšãæ³åããŠãã ããããŸããã¬ããŒãã®æŽæ°ããŸã è¡ãããŠãããã©ãããç¥ã£ãŠããèªã¿èŸŒã¿äžãã€ã³ãžã±ãŒã¿ãŒã衚瀺ããããšãã§ããŸãã
å€ãã®å ŽåãuseDeferredValue
ã¯å®éã«ã¬ã³ããªã³ã°ãããå€ã«äœ¿çšããuseTransition
ã¯ãããå€ãã®å¶åŸ¡ãŸãã¯ä¿çäžã®ã€ã³ãžã±ãŒã¿ãŒãå¿
èŠãªå Žåã«ããã®å€ãæŽæ°ãã*ããã»ã¹*ã管çããããã«äœ¿çšããŸãã
useDeferredValue
ã䜿çšããã°ããŒãã«éçºã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ãã¿ãŒã²ãããšããã¢ããªã±ãŒã·ã§ã³ã§useDeferredValue
ãå®è£
ããå Žåã¯ããããã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ããã
- ã¯ãªãã£ã«ã«ãã¹ã®ç¹å®: UIã®ã©ã®éšåã絶察ã«å¿çããå¿ èŠããããã©ã®éšåãããããªé å»¶ã«èãããããã倿ããŸãããŠãŒã¶ãŒå ¥åããã¿ã³ãªã©ã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãããã³äžå¯æ¬ ãªããã²ãŒã·ã§ã³ã¯ãäžè¬çã«é å»¶ãããã¹ãã§ã¯ãããŸãããå€§èŠæš¡ãªããŒã¿ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ãæ€çŽ¢çµæããŸãã¯è€éãªãã£ã«ã¿ãªã³ã°UIã¯ãé å»¶ã®é©åãªåè£ã§ãã
- ããŸããŸãªãããã¯ãŒã¯æ¡ä»¶äžã§ã®ãã¹ã: ãã©ãŠã¶éçºè ããŒã«ïŒChrome DevToolsã®ãããã¯ãŒã¯ã¹ããããªã³ã°ãªã©ïŒã䜿çšããŠãããŸããŸãªå°åã§ãŠãŒã¶ãŒãçµéšããå¯èœæ§ã®ãããããé ããããã¯ãŒã¯é床ãã·ãã¥ã¬ãŒãããŸãããããã®æ¡ä»¶äžã§ãé å»¶æŽæ°ãã©ã®ããã«å®è¡ããããã芳å¯ããŸãã
- ããã€ã¹ã®èœåãèæ ®ãã: å€ããŸãã¯äœé»åã®ã¢ãã€ã«ããã€ã¹ããã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŠãããŠãŒã¶ãŒã¯ãUIãžã£ã³ã¯ã®åæžãã倧ããªæ©æµãåããŸããå¯èœãªå Žåã¯ããšãã¥ã¬ãŒããããããŒãšã³ãããã€ã¹ã§ãã¹ãããŸãã
-
èŠèŠçãªãã£ãŒãããã¯ãæäŸããïŒãªãã·ã§ã³ã§ããæšå¥šïŒ:
useDeferredValue
ã¯ãæ¬è³ªçã«useTransition
ã®ãããªä¿çäžã®ç¶æ ãæäŸããŸããããå€ãã®å Žåããããæšæž¬ã§ããŸããé å»¶ãããå€ãå ã®å€ãšç°ãªãå ŽåãæŽæ°ãé²è¡äžã§ããããšãæå³ããŸãããã¬ãŒã¹ãã«ããŒãŸãã¯åŸ®åŠãªããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãæ¡ä»¶ä»ãã§ã¬ã³ããªã³ã°ã§ããŸããããšãã°ãé å»¶ãããæ€çŽ¢çµæã空ã®é åã§ããããã¯ãšãªãããã§ãªãå Žåãçµæããã§ãããããŠããããšãããããŸãã -
ãã®ä»ã®æé©åãšçµã¿åããã:
useDeferredValue
ã¯ãäžèœè¬ã§ã¯ãããŸãããã³ã³ããŒãã³ãã®ã¡ã¢åã«ã¯React.memo
ãæ©èœã®é å»¶èªã¿èŸŒã¿ã«ã¯ã³ãŒãåå²ãéåžžã«é·ããªã¹ãã«ã¯ä»®æ³åãªã¹ããªã©ãä»ã®Reactããã©ãŒãã³ã¹ãã¿ãŒã³ãšçµã¿åãããããšã§æé©ã«æ©èœããŸãã -
åœéåïŒi18nïŒãšããŒã«ã©ã€ãºïŒl10nïŒ:
useDeferredValue
ã管çãæ¯æŽããããŒã¿ã®å€æãŸãã¯ãã£ã«ã¿ãªã³ã°ããžãã¯ããi18n/l10nã«å¯Ÿå¿ããŠããããšã確èªããŸããããšãã°ãæååã®ãœãŒãã«ã¯ããã±ãŒã«åºæã®ç §åèŠåãå¿ èŠã«ãªãå ŽåããããŸãã - ã¢ã¯ã»ã·ããªãã£: ããã©ãŒãã³ã¹ã®æé©åããã¢ã¯ã»ã·ããªãã£ã«æªåœ±é¿ãåãŒããªãããšãåžžã«ç¢ºèªããŠãã ãããããšãã°ãæŽæ°ãé ãããããšã«ãã£ãŠéèŠãªæ å ±ãé衚瀺ã«ãªãå Žåã¯ããŠãŒã¶ãŒãããã«ã¢ã¯ã»ã¹ããããã®æç¢ºãªæ¹æ³ãŸãã¯ã³ã³ãã³ããèªã¿èŸŒãŸããŠããããšã®æç¢ºãªè¡šç€ºãããããšã確èªããŸãã
äŸïŒç¡éã¹ã¯ããŒã«ãšãã£ã«ã¿ãªã³ã°ãåããã°ããŒãã«è£œåã«ã¿ãã°
äžçäžã§è£œåã販売ããŠããå€§èŠæš¡ãªãªã³ã©ã€ã³å°å£²æ¥è ãèããŠã¿ãŸãããã圌ãã¯ãå°åãã¿ã€ããäŸ¡æ Œå¥ã«åé¡ãããäœçŸäžãã®ã¢ã€ãã ãå«ãã«ã¿ãã°ãæã£ãŠããŸãããŠãŒã¶ãŒã¯ããã®ã«ã¿ãã°ããã°ãããã£ã«ã¿ãªã³ã°ããã¹ã¯ããŒã«ããªããããã«å€ãã®ã¢ã€ãã ãèªã¿èŸŒãããšãæåŸ ããŠããŸãã
課é¡: ãŠãŒã¶ãŒãããšãŒããããã®ããšã¬ã¯ãããã¯ã¹ãã§ãã£ã«ã¿ãªã³ã°ãããšãã¢ããªã±ãŒã·ã§ã³ã¯æ°åã®è£œåããã§ããããŠã¬ã³ããªã³ã°ããå¿ èŠããããŸãããã®ãã£ã«ã¿ãªã³ã°ãšãã®åŸã®ã¬ã³ããªã³ã°ã¯ãç¹ã«æ¥ç¶æ§ãäœãå°åã®ã¢ãã€ã«ããã€ã¹ã§ã¯é ããªãå¯èœæ§ããããŸãã
useDeferredValue
ã䜿çšãããœãªã¥ãŒã·ã§ã³:
- ãã£ã«ã¿ç¶æ
: çŸåšã®ãã£ã«ã¿åºæºïŒäŸïŒ
category
ãregion
ïŒã®ç¶æ ãç¶æããŸãã - é
å»¶ãã£ã«ã¿ç¶æ
: ãã£ã«ã¿åºæºã«
useDeferredValue
ã䜿çšããŸãã - ããŒã¿ã®ãã§ãã: *é å»¶*ãã£ã«ã¿åºæºã«åºã¥ããŠè£œåããã§ããããŸãã
- ãªã¹ãã®ã¬ã³ããªã³ã°: ãã§ããããã補åãã¬ã³ããªã³ã°ããŸãã
éèŠãªã®ã¯ããŠãŒã¶ãŒãç©æ¥µçã«ãã£ã«ã¿ã倿ŽããŠããéïŒäŸïŒããšã¬ã¯ãããã¯ã¹ããšãã¢ãã¬ã«ããåãæ¿ããïŒããã£ã«ã¿ãªã³ã°ã®UIãå¿çæ§ãç¶æããããšã§ããæ°ããäžé£ã®è£œåã®ãã§ãããšã¬ã³ããªã³ã°ãšãããæœåšçã«é·æéãããã¿ã¹ã¯ã¯ãé å»¶ãããŸãã
import React, { useState, useDeferredValue, useMemo } from 'react';
// Mock API call - simulates fetching product data
const fetchProducts = async (filters) => {
console.log('Fetching products with filters:', filters);
// Simulate network latency
await new Promise(resolve => setTimeout(resolve, 500));
// Dummy data
const allProducts = [
{ id: 1, name: 'Laptop Pro', category: 'Electronics', region: 'Europe', price: 1200 },
{ id: 2, name: 'Smart TV X', category: 'Electronics', region: 'Asia', price: 800 },
{ id: 3, name: 'Designer T-Shirt', category: 'Apparel', region: 'Europe', price: 50 },
{ id: 4, name: 'Running Shoes', category: 'Apparel', region: 'North America', price: 100 },
{ id: 5, name: 'Wireless Mouse', category: 'Electronics', region: 'North America', price: 30 },
{ id: 6, name: 'Silk Scarf', category: 'Apparel', region: 'Asia', price: 75 },
{ id: 7, name: 'Gaming Keyboard', category: 'Electronics', region: 'Europe', price: 150 },
];
return allProducts.filter(p =>
(filters.category === '' || p.category === filters.category) &&
(filters.region === '' || p.region === filters.region)
);
};
function ProductCatalog() {
const [filters, setFilters] = useState({ category: '', region: '' });
const deferredFilters = useDeferredValue(filters);
const [products, setProducts] = useState([]);
const [isLoading, setIsLoading] = useState(false);
// Use useMemo to avoid re-fetching if deferredFilters haven't effectively changed
useMemo(async () => {
setIsLoading(true);
const fetchedProducts = await fetchProducts(deferredFilters);
setProducts(fetchedProducts);
setIsLoading(false);
}, [deferredFilters]);
const handleFilterChange = (key, value) => {
setFilters(prevFilters => ({ ...prevFilters, [key]: value }));
};
return (
Global Product Catalog
{isLoading ? (
Loading products...
) : (
{products.map(product => (
-
{product.name} ({product.region}) - ${product.price}
))}
)}
);
}
ã°ããŒãã«ãªåœ±é¿: éããã垯åå¹ ã®åœïŒã¢ããªã«ãæ±åã¢ãžã¢ã®äžéšãªã©ïŒã®ãŠãŒã¶ãŒã¯ããã£ã«ã¿ããããããŠã³ãéåžžã«å¿çæ§ãé«ãããšã«æ°ã¥ããŸããããšã¬ã¯ãããã¯ã¹ããéžæããŠããããšãŒãããããéžæãããšã補åãªã¹ãã®èªã¿èŸŒã¿ã«æ°ç§ãããå Žåã§ãããŠãŒã¶ãŒã¯ãã£ã«ã¿ã³ã³ãããŒã«ã«ã©ã°ãæããããšãªããããã«ãå°åãã«ãããã£ã«ã¿ãªã³ã°ã«åãæ¿ããããšãã§ããŸããããã«ãããããŸããŸãªã°ããŒãã«ãŠãŒã¶ãŒããŒã¹ã®ç¥èŠãããããã©ãŒãã³ã¹ãšäœ¿ãããããå€§å¹ ã«åäžããŸãã
çµè«
useDeferredValue
ã¯ãç¹ã«ã°ããŒãã«ãªãªãŒããæã€ã¢ããªã±ãŒã·ã§ã³ã®å Žåãããã©ãŒãã³ã¹ãé«ããå¿çæ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã®Reactéçºè
ã®ããŒã«ãããã«ããã匷åãªããŒã«ã§ããæ¬è³ªçã§ãªãUIã®æŽæ°ãã€ã³ããªãžã§ã³ãã«é
ãããããšã«ãããéèŠãªã€ã³ã¿ã©ã¯ã·ã§ã³ãã¹ã ãŒãºã«ç¶æããããã¹ãŠã®ããã€ã¹ãšãããã¯ãŒã¯ç°å¢ã§åªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåŸãããŸãã
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«æ§ç¯ããå Žåãããã©ãŒãã³ã¹ãåªå
ããããšã¯ãå
æ¬æ§ã®éµãšãªããŸããuseDeferredValue
ã¯ãã¬ã³ããªã³ã°ã®åªå
é äœã管çããããã®å®£èšçã§å¹æçãªæ¹æ³ãæäŸããReactã¢ããªã±ãŒã·ã§ã³ãäžçäžã§èŒãã®ã«åœ¹ç«ã¡ãŸããä»ã®æé©åæŠç¥ãšçµã¿åãããåžžã«åŸ¹åºçã«ãã¹ãããŠããã¹ãŠã®ãŠãŒã¶ãŒã«å¯èœãªéãæé«ã®äœéšãæäŸããããšãå¿ããªãã§ãã ããã
Webã¢ããªã±ãŒã·ã§ã³ããŸããŸãè€éã«ãªãã«ã€ããŠãuseDeferredValue
ã®ãããªããŒã«ããã¹ã¿ãŒããããšã¯ãçã«åªããã°ããŒãã«ãšã¯ã¹ããªãšã³ã¹ãäœæããããšãç®æãããã³ããšã³ãéçºè
ã«ãšã£ãŠãŸããŸãéèŠã«ãªããŸãã