Reactã®å®éšçããã¯experimental_useOptimisticã培åºè§£èª¬ããªããã£ãã¹ãã£ãã¯UIãå®è£ ããããã¹ã ãŒãºã§å¿çæ§ã®é«ãUIãšã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ã®åäžãå®çŸããæ¹æ³ãåŠã³ãŸãã
React experimental_useOptimistic: ãªããã£ãã¹ãã£ãã¯UIã®ãã¹ã¿ãŒ
çŸä»£ã®Webéçºã®äžçã§ã¯ãã·ãŒã ã¬ã¹ã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããšãæãéèŠã§ãããŠãŒã¶ãŒã¯ããã©ãŒã ã®éä¿¡ããµãŒããŒäžã®ããŒã¿ã®æŽæ°ãšãã£ãéåæåŠçãæ±ãå Žåã§ãã峿ã®ãã£ãŒãããã¯ãšæå°éã®ç¥èŠé
å»¶ãæåŸ
ããŸããReactã®experimental_useOptimisticããã¯ã¯ããããå®çŸããããã®åŒ·åãªã¡ã«ããºã ãã€ãŸããªããã£ãã¹ãã£ãã¯UIïŒæ¥œèŠ³çæŽæ°ïŒãæäŸããŸãããã®èšäºã§ã¯ãexperimental_useOptimisticãçè§£ãå®è£
ããããã®å
æ¬çãªã¬ã€ããæäŸããããé
åçã§ããã©ãŒãã³ã¹ã®é«ãReactã¢ããªã±ãŒã·ã§ã³ãäœæã§ããããã«ããŸãã
ãªããã£ãã¹ãã£ãã¯UIïŒæ¥œèŠ³çæŽæ°ïŒãšã¯ïŒ
ãªããã£ãã¹ãã£ãã¯UIã¯ããµãŒããŒããã®ç¢ºèªãåãåãåã«ãéåæåŠçã®æåŸ ãããçµæãåæ ããããã«UIãå³åº§ã«æŽæ°ãããã¯ããã¯ã§ãããã®åŠçã¯æåãããšããåæã«åºã¥ããŠããŸããããæçµçã«åŠçã倱æããå ŽåãUIã¯ä»¥åã®ç¶æ ã«æ»ãããŸããããã«ããã峿ã®ãã£ãŒãããã¯ã®é¯èŠãçã¿åºããã¢ããªã±ãŒã·ã§ã³ã®äœæçãªå¿çæ§ãåçã«åäžãããŸãã
ãŠãŒã¶ãŒããœãŒã·ã£ã«ã¡ãã£ã¢ã®æçš¿ã§ããããããã¿ã³ãã¯ãªãã¯ããã·ããªãªãèããŠã¿ãŸãããããªããã£ãã¹ãã£ãã¯UIããªããã°ãUIã¯éåžžããµãŒããŒããããã確èªããã®ãåŸ ã£ãŠããããããã®æ°ãæŽæ°ããŸããããã¯ãç¹ã«ãããã¯ãŒã¯æ¥ç¶ãé ãå Žåã«é¡èãªé å»¶ãåŒãèµ·ããå¯èœæ§ããããŸãããªããã£ãã¹ãã£ãã¯UIã䜿çšãããšããã¿ã³ãã¯ãªãã¯ããããšãã«ããããŸãããã®æ°ãå¢å ããŸãããµãŒããŒããããã確èªããã°ãããã§åé¡ãããŸããããããµãŒããŒãããããæåŠããå ŽåïŒãšã©ãŒãæš©éã®åé¡ãªã©ïŒããããã®æ°ã¯æžå°ãããŠãŒã¶ãŒã«å€±æãéç¥ãããŸãã
experimental_useOptimisticã®ç޹ä»
Reactã®experimental_useOptimisticããã¯ã¯ããªããã£ãã¹ãã£ãã¯UIã®å®è£
ãç°¡çŽ åããŸããããã«ãããæ¥œèгçãªç¶æ
ã管çããå¿
èŠã«å¿ããŠå
ã®ç¶æ
ã«æ»ãæ¹æ³ãæäŸãããŸãããã®ããã¯ã¯çŸåšå®éšçãªãã®ã§ããããšã«æ³šæããããšãéèŠã§ããã€ãŸããå°æ¥ã®ReactããŒãžã§ã³ã§APIã倿Žãããå¯èœæ§ããããŸããããããããã¯Reactã¢ããªã±ãŒã·ã§ã³ã«ãããããŒã¿ãã³ããªã³ã°ã®æªæ¥ãå£éèŠã貎éãªæ©äŒãæäŸããŸãã
åºæ¬çãªäœ¿ãæ¹
experimental_useOptimisticããã¯ã¯2ã€ã®åŒæ°ãåããŸãïŒ
- å ã®state: ããã¯æ¥œèгçã«æŽæ°ãããããŒã¿ã®åæå€ã§ãã
- æŽæ°é¢æ°: ãã®é¢æ°ã¯ã楜芳çãªæŽæ°ãé©çšããããšãã«åŒã³åºãããŸããçŸåšã®æ¥œèгçãªstateãšãªãã·ã§ã³ã®åŒæ°ïŒéåžžã¯æŽæ°ã«é¢é£ããããŒã¿ïŒãåãåããæ°ããæ¥œèгçãªstateãè¿ããŸãã
ãã®ããã¯ã¯ã以äžãå«ãé åãè¿ããŸãïŒ
- çŸåšã®æ¥œèгçãªstate: ããã¯å ã®stateãšé©çšãããæ¥œèгçãªæŽæ°ã®äž¡æ¹ãåæ ããstateã§ãã
addOptimistic颿°: ãã®é¢æ°ã䜿çšãããšã楜芳çãªæŽæ°ãé©çšã§ããŸããããã¯ãæŽæ°é¢æ°ã«æž¡ããããªãã·ã§ã³ã®åŒæ°ãåããŸãã
äŸïŒæ¥œèгçãªãããã«ãŠã³ã¿ãŒ
ãããã«ãŠã³ã¿ãŒã®ç°¡åãªäŸã§èª¬æããŸãããïŒ
import React, { useState } from 'react';
import { experimental_useOptimistic as useOptimistic } from 'react';
function LikeButton({ postId }) {
const [likes, setLikes] = useState(50); // Initial number of likes
const [optimisticLikes, addOptimistic] = useOptimistic(
likes,
(state, newLike) => state + newLike // Update function
);
const handleLike = async () => {
addOptimistic(1); // Optimistically increment likes
try {
// Simulate an API call to like the post
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency
// In a real application, you'd make an API call here
// await api.likePost(postId);
setLikes(optimisticLikes); // Update the actual likes count with the optimistic value after successful API call
} catch (error) {
console.error("Failed to like post:", error);
addOptimistic(-1); // Revert the optimistic update if the API call fails
setLikes(likes);
}
};
return (
);
}
export default LikeButton;
解説ïŒ
likesstateãåæå€ïŒäŸïŒ50ïŒã§åæåããŸããexperimental_useOptimisticã䜿çšããŠãoptimisticLikesstateãšaddOptimistic颿°ãäœæããŸãã- æŽæ°é¢æ°ã¯ãåã«
stateãnewLikeã®å€ïŒãã®å Žåã¯1ïŒã ãã€ã³ã¯ãªã¡ã³ãããŸãã - ãã¿ã³ãã¯ãªãã¯ããããšã
addOptimistic(1)ãåŒã³åºããŠã衚瀺ããããããã®æ°ãå³åº§ã«ã€ã³ã¯ãªã¡ã³ãããŸãã - 次ã«ã
setTimeoutã䜿çšããŠAPIåŒã³åºããã·ãã¥ã¬ãŒãããŸããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã§å®éã®APIåŒã³åºããè¡ããŸãã - APIåŒã³åºããæåããå Žåãå®éã®
likesstateãoptimisticLikesã®å€ã§æŽæ°ããŸãã - APIåŒã³åºãã倱æããå Žåã
addOptimistic(-1)ãåŒã³åºããŠæ¥œèгçãªæŽæ°ãå ã«æ»ããlikesãå ã®å€ã«èšå®ããŸãã
é«åºŠãªäœ¿çšæ³ïŒè€éãªããŒã¿æ§é ã®åŠç
experimental_useOptimisticã¯ãããè€éãªããŒã¿æ§é ãæ±ãããšãã§ããŸããã³ã¡ã³ãã®ãªã¹ãã«ã³ã¡ã³ãã远å ããäŸãèããŠã¿ãŸãããïŒ
import React, { useState } from 'react';
import { experimental_useOptimistic as useOptimistic } from 'react';
function CommentList({ postId }) {
const [comments, setComments] = useState([
{ id: 1, text: 'This is a great post!' },
{ id: 2, text: 'I learned a lot from this.' },
]);
const [optimisticComments, addOptimistic] = useOptimistic(
comments,
(state, newComment) => [...state, newComment] // Update function
);
const handleAddComment = async (text) => {
const newComment = { id: Date.now(), text }; // Generate a temporary ID
addOptimistic(newComment); // Optimistically add the comment
try {
// Simulate an API call to add the comment
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency
// In a real application, you'd make an API call here
// await api.addComment(postId, text);
setComments(optimisticComments);
} catch (error) {
console.error("Failed to add comment:", error);
// Revert the optimistic update by filtering out the temporary comment
setComments(comments);
}
};
return (
{optimisticComments.map(comment => (
- {comment.text}
))}
);
}
function CommentForm({ onAddComment }) {
const [text, setText] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
onAddComment(text);
setText('');
};
return (
);
}
export default CommentList;
解説ïŒ
commentsstateãã³ã¡ã³ããªããžã§ã¯ãã®é åã§åæåããŸããexperimental_useOptimisticã䜿çšããŠãoptimisticCommentsstateãšaddOptimistic颿°ãäœæããŸãã- æŽæ°é¢æ°ã¯ãã¹ãã¬ããæ§æïŒ
...stateïŒã䜿çšããŠãnewCommentãªããžã§ã¯ããæ¢åã®stateé åã«é£çµããŸãã - ãŠãŒã¶ãŒãã³ã¡ã³ããéä¿¡ãããšãæ°ããã³ã¡ã³ãã«äžæçãª
idãçæããŸããããã¯ãReactããªã¹ãã¢ã€ãã ã«äžæã®ããŒãèŠæ±ããããéèŠã§ãã addOptimistic(newComment)ãåŒã³åºããŠãã³ã¡ã³ããæ¥œèгçã«ãªã¹ãã«è¿œå ããŸãã- APIåŒã³åºãã倱æããå Žåãäžæçãª
idãæã€ã³ã¡ã³ããcommentsé åãããã£ã«ã¿ãªã³ã°ããŠã楜芳çãªæŽæ°ãå ã«æ»ããŸãã
ãšã©ãŒåŠçãšæŽæ°ã®åãæ¶ã
ãªããã£ãã¹ãã£ãã¯UIã广çã«äœ¿çšããéµã¯ããšã©ãŒãé©åã«åŠçããæäœã倱æãããšãã«UIã以åã®ç¶æ
ã«æ»ãããšã§ããäžèšã®äŸã§ã¯ãtry...catchãããã¯ã䜿çšããŠãAPIåŒã³åºãäžã«çºçããå¯èœæ§ã®ãããšã©ãŒããã£ããããŸãããcatchãããã¯å
ã§ãå
ã®æŽæ°ã®éã®å€ãaddOptimisticã«æž¡ãããstateãå
ã®å€ã«ãªã»ããããããšã§ã楜芳çãªæŽæ°ãå
ã«æ»ããŸããã
ãšã©ãŒãçºçããéã«ã¯ããŠãŒã¶ãŒã«æç¢ºãªãã£ãŒãããã¯ãæäŸããããšãäžå¯æ¬ ã§ããããã«ã¯ããšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºã圱é¿ãåããèŠçŽ ã®åŒ·èª¿è¡šç€ºããŸãã¯çãã¢ãã¡ãŒã·ã§ã³ã䌎ã£ãŠUIã以åã®ç¶æ ã«æ»ãããšãªã©ãå«ãŸããŸãã
ãªããã£ãã¹ãã£ãã¯UIã®å©ç¹
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒ ãªããã£ãã¹ãã£ãã¯UIã¯ãã¢ããªã±ãŒã·ã§ã³ãããå¿çæ§ãé«ãã€ã³ã¿ã©ã¯ãã£ãã«æããããããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªãããŸãã
- äœæé å»¶ã®åæžïŒ 峿ã®ãã£ãŒãããã¯ãæäŸããããšã§ããªããã£ãã¹ãã£ãã¯UIã¯éåæåŠçã®é å»¶ãé ããŸãã
- ãŠãŒã¶ãŒãšã³ã²ãŒãžã¡ã³ãã®åäžïŒ ããå¿çæ§ã®é«ãUIã¯ããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãšããå€ã察話ããããšãä¿é²ããŸãã
èæ ®äºé ãšæœåšçãªæ¬ ç¹
- è€éãïŒ ãªããã£ãã¹ãã£ãã¯UIãå®è£ ãããšãæœåšçãªãšã©ãŒãåŠçããUIã以åã®ç¶æ ã«æ»ãå¿ èŠããããããã³ãŒããè€éã«ãªããŸãã
- äžæŽåã®å¯èœæ§ïŒ ãµãŒããŒåŽã®æ€èšŒã«ãŒã«ãã¯ã©ã€ã¢ã³ãåŽã®ä»®å®ãšç°ãªãå Žåããªããã£ãã¹ãã£ãã¯UIã¯UIãšå®éã®ããŒã¿ãšã®éã«äžæçãªäžæŽåãåŒãèµ·ããå¯èœæ§ããããŸãã
- ãšã©ãŒåŠçãæ¥µããŠéèŠïŒ ãšã©ãŒãé©åã«åŠçããªããšããŠãŒã¶ãŒã«ãšã£ãŠæ··ä¹±ãæããäžæºã®ããŸãäœéšã«ã€ãªããå¯èœæ§ããããŸãã
experimental_useOptimisticã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
- ç°¡åãªãã®ããå§ããïŒ ããè€éãªã·ããªãªã«åãçµãåã«ãããããã¿ã³ãã³ã¡ã³ãã«ãŠã³ã¿ãŒãªã©ã®ç°¡åãªãŠãŒã¹ã±ãŒã¹ããå§ããŸãããã
- 培åºãããšã©ãŒåŠçïŒ å€±æããæäœãé©åã«åŠçããæ¥œèгçãªæŽæ°ãå ã«æ»ãããã®å ç¢ãªãšã©ãŒåŠçãå®è£ ããŸãã
- ãŠãŒã¶ãŒãžã®ãã£ãŒãããã¯æäŸïŒ ãšã©ãŒãçºçããéã«ãŠãŒã¶ãŒã«éç¥ããUIãå ã«æ»ãããçç±ã説æããŸãã
- ãµãŒããŒãµã€ãã®æ€èšŒãèæ ®ããïŒ äžæŽåã®å¯èœæ§ãæå°éã«æããããã«ãã¯ã©ã€ã¢ã³ããµã€ãã®ä»®å®ããµãŒããŒãµã€ãã®æ€èšŒã«ãŒã«ãšäžèŽãããããã«åªããŸãã
- 泚æããŠäœ¿çšããïŒ
experimental_useOptimisticã¯ãŸã å®éšçã§ãããããå°æ¥ã®ReactããŒãžã§ã³ã§APIã倿Žãããå¯èœæ§ãããããšãèŠããŠãããŠãã ããã
å®äžçã§ã®äŸãšãŠãŒã¹ã±ãŒã¹
ãªããã£ãã¹ãã£ãã¯UIã¯ãããŸããŸãªæ¥çã®ããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã§åºã䜿çšãããŠããŸãã以äžã«ããã€ãã®äŸãæããŸãïŒ
- ãœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ïŒ æçš¿ãžã®ããããããã³ã¡ã³ãã®è¿œå ãã¡ãã»ãŒãžã®éä¿¡ãInstagramãTwitterã§ããããããã¿ããããåŸã«å³åº§ã®ãã£ãŒãããã¯ããªãããšãæ³åããŠã¿ãŠãã ããã
- Eã³ããŒã¹ãµã€ãïŒ ã·ã§ããã³ã°ã«ãŒããžã®ååã®è¿œå ãæ°éã®æŽæ°ãå²åŒã®é©çšãã«ãŒãã«ååã远å ããéã®é å»¶ã¯ãææªã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã§ãã
- ãããžã§ã¯ã管çããŒã«ïŒ ã¿ã¹ã¯ã®äœæããŠãŒã¶ãŒã®å²ãåœãŠãã¹ããŒã¿ã¹ã®æŽæ°ãAsanaãTrelloã®ãããªããŒã«ã¯ãæµåçãªã¯ãŒã¯ãããŒã®ããã«ãªããã£ãã¹ãã£ãã¯UIã«å€§ããäŸåããŠããŸãã
- ãªã¢ã«ã¿ã€ã ã³ã©ãã¬ãŒã·ã§ã³ã¢ããªïŒ ããã¥ã¡ã³ãã®ç·šéããã¡ã€ã«ã®å ±æããããªäŒè°ãžã®åå ãäŸãã°ãGoogle Docsã¯ãã»ãŒç¬æã®å ±åäœæ¥äœéšãæäŸããããã«ãªããã£ãã¹ãã£ãã¯UIãå€çšããŠããŸããç°ãªãã¿ã€ã ãŸãŒã³ã«åæ£ãããªã¢ãŒãããŒã ã«ãšã£ãŠããããã®æ©èœãé å»¶ããå Žåã®èª²é¡ãèããŠã¿ãŠãã ããã
代æ¿ã¢ãããŒã
experimental_useOptimisticã¯ãªããã£ãã¹ãã£ãã¯UIãå®è£
ãã䟿å©ãªæ¹æ³ãæäŸããŸãããæ€èšã§ãã代æ¿ã¢ãããŒãããããŸãïŒ
- æåã§ã®ç¶æ
管çïŒ Reactã®
useStateããã¯ã䜿çšããŠæ¥œèгçãªç¶æ ãæåã§ç®¡çããUIã®æŽæ°ãšåŸ©å ã®ããžãã¯ãèªåã§å®è£ ããããšãã§ããŸãããã®ã¢ãããŒãã¯ããå€ãã®å¶åŸ¡ãæäŸããŸãããããå€ãã®ã³ãŒããå¿ èŠã§ãã - ã©ã€ãã©ãªïŒ ããã€ãã®ã©ã€ãã©ãªãããªããã£ãã¹ãã£ãã¯UIãšããŒã¿åæã®ããã®ãœãªã¥ãŒã·ã§ã³ãæäŸããŠããŸãããããã®ã©ã€ãã©ãªã¯ããªãã©ã€ã³ãµããŒããç«¶å解決ãªã©ã®è¿œå æ©èœãæäŸããå ŽåããããŸããããå æ¬çãªããŒã¿ç®¡çãœãªã¥ãŒã·ã§ã³ã«ã¯ãApollo ClientãRelayã®ãããªã©ã€ãã©ãªãæ€èšããŠãã ããã
çµè«
Reactã®experimental_useOptimisticããã¯ã¯ã峿ã®ãã£ãŒãããã¯ãæäŸããäœæé
å»¶ãæžããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããã®è²ŽéãªããŒã«ã§ãããªããã£ãã¹ãã£ãã¯UIã®ååãçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ããã®åŒ·åãªãã¯ããã¯ã掻çšããŠãããé
åçã§ããã©ãŒãã³ã¹ã®é«ãReactã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãããšã©ãŒãé©åã«åŠçããå¿
èŠã«å¿ããŠUIã以åã®ç¶æ
ã«æ»ãããšãå¿ããªãã§ãã ãããä»ã®å®éšçãªæ©èœãšåæ§ã«ãå°æ¥ã®ReactããŒãžã§ã³ã§ã®API倿Žã®å¯èœæ§ã«æ³šæããŠãã ããããªããã£ãã¹ãã£ãã¯UIãæ¡çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®äœæããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒæºè¶³åºŠã倧å¹
ã«åäžããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠããæŽç·Žãããæ¥œãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«è²¢ç®ã§ããŸãã