@@ -66,39 +66,47 @@ function AppContainer() {
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> (发送中……)< / small> }
96
100
< / div>
97
101
))}
102
+ <<<<<< < HEAD
98
103
< form action= {formAction} ref= {formRef}>
99
104
< input type= " text" name= " message" placeholder= " 你好!" / >
100
105
< button type= " submit" > 发送< / button>
101
106
< / form>
107
+ ====== =
108
+
109
+ >>>>>> > d6c4c0fee514d06e329d08774bf2f37a7e4e594e
102
110
< / >
103
111
);
104
112
}
@@ -107,11 +115,15 @@ export default function App() {
107
115
const [messages , setMessages ] = useState ([
108
116
{ text: " 你好,在这儿!" , sending: false , key: 1 }
109
117
]);
110
- async function sendMessage (formData ) {
111
- const sentMessage = await deliverMessage (formData .get (" message" ));
112
- setMessages ((messages ) => [... messages, { text: sentMessage }]);
118
+ function sendMessageAction (formData ) {
119
+ startTransition (async () => {
120
+ const sentMessage = await deliverMessage (formData .get (" message" ));
121
+ startTransition (() => {
122
+ setMessages ((messages ) => [{ text: sentMessage }, ... messages]);
123
+ })
124
+ })
113
125
}
114
- return < Thread messages= {messages} sendMessage = {sendMessage } / > ;
126
+ return < Thread messages= {messages} sendMessageAction = {sendMessageAction } / > ;
115
127
}
116
128
```
117
129
0 commit comments