@@ -66,39 +66,40 @@ For example, when a user types a message into the form and hits the "Send" butto
66
66
67
67
68
68
``` js src/App.js
69
- import { useOptimistic , useState , useRef } from " react" ;
69
+ import { useOptimistic , useState , useRef , startTransition } from " react" ;
70
70
import { deliverMessage } from " ./actions.js" ;
71
71
72
- function Thread ({ messages, sendMessage }) {
72
+ function Thread ({ messages, sendMessageAction }) {
73
73
const formRef = useRef ();
74
- async function formAction (formData ) {
74
+ function formAction (formData ) {
75
75
addOptimisticMessage (formData .get (" message" ));
76
76
formRef .current .reset ();
77
- await sendMessage (formData);
77
+ sendMessageAction (formData);
78
78
}
79
79
const [optimisticMessages , addOptimisticMessage ] = useOptimistic (
80
80
messages,
81
81
(state , newMessage ) => [
82
- ... state,
83
82
{
84
83
text: newMessage,
85
84
sending: true
86
- }
85
+ },
86
+ ... state,
87
87
]
88
88
);
89
89
90
90
return (
91
91
<>
92
+ < form action= {formAction} ref= {formRef}>
93
+ < input type= " text" name= " message" placeholder= " Hello!" / >
94
+ < button type= " submit" > Send< / button>
95
+ < / form>
92
96
{optimisticMessages .map ((message , index ) => (
93
97
< div key= {index}>
94
98
{message .text }
95
99
{!! message .sending && < small> (Sending... )< / small> }
96
100
< / div>
97
101
))}
98
- < form action= {formAction} ref= {formRef}>
99
- < input type= " text" name= " message" placeholder= " Hello!" / >
100
- < button type= " submit" > Send< / button>
101
- < / form>
102
+
102
103
< / >
103
104
);
104
105
}
@@ -107,11 +108,15 @@ export default function App() {
107
108
const [messages , setMessages ] = useState ([
108
109
{ text: " Hello there!" , sending: false , key: 1 }
109
110
]);
110
- async function sendMessage (formData ) {
111
- const sentMessage = await deliverMessage (formData .get (" message" ));
112
- setMessages ((messages ) => [... messages, { text: sentMessage }]);
111
+ function sendMessageAction (formData ) {
112
+ startTransition (async () => {
113
+ const sentMessage = await deliverMessage (formData .get (" message" ));
114
+ startTransition (() => {
115
+ setMessages ((messages ) => [{ text: sentMessage }, ... messages]);
116
+ })
117
+ })
113
118
}
114
- return < Thread messages= {messages} sendMessage = {sendMessage } / > ;
119
+ return < Thread messages= {messages} sendMessageAction = {sendMessageAction } / > ;
115
120
}
116
121
```
117
122
0 commit comments