mirror of
https://github.com/reactjs/react.dev.git
synced 2026-02-22 03:42:14 +00:00
Fix useOptimistic example (#7792)
* fix useOptimistic example * prepend messages
This commit is contained in:
@@ -66,39 +66,40 @@ For example, when a user types a message into the form and hits the "Send" butto
|
||||
|
||||
|
||||
```js src/App.js
|
||||
import { useOptimistic, useState, useRef } from "react";
|
||||
import { useOptimistic, useState, useRef, startTransition } from "react";
|
||||
import { deliverMessage } from "./actions.js";
|
||||
|
||||
function Thread({ messages, sendMessage }) {
|
||||
function Thread({ messages, sendMessageAction }) {
|
||||
const formRef = useRef();
|
||||
async function formAction(formData) {
|
||||
function formAction(formData) {
|
||||
addOptimisticMessage(formData.get("message"));
|
||||
formRef.current.reset();
|
||||
await sendMessage(formData);
|
||||
sendMessageAction(formData);
|
||||
}
|
||||
const [optimisticMessages, addOptimisticMessage] = useOptimistic(
|
||||
messages,
|
||||
(state, newMessage) => [
|
||||
...state,
|
||||
{
|
||||
text: newMessage,
|
||||
sending: true
|
||||
}
|
||||
},
|
||||
...state,
|
||||
]
|
||||
);
|
||||
|
||||
return (
|
||||
<>
|
||||
<form action={formAction} ref={formRef}>
|
||||
<input type="text" name="message" placeholder="Hello!" />
|
||||
<button type="submit">Send</button>
|
||||
</form>
|
||||
{optimisticMessages.map((message, index) => (
|
||||
<div key={index}>
|
||||
{message.text}
|
||||
{!!message.sending && <small> (Sending...)</small>}
|
||||
</div>
|
||||
))}
|
||||
<form action={formAction} ref={formRef}>
|
||||
<input type="text" name="message" placeholder="Hello!" />
|
||||
<button type="submit">Send</button>
|
||||
</form>
|
||||
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -107,11 +108,15 @@ export default function App() {
|
||||
const [messages, setMessages] = useState([
|
||||
{ text: "Hello there!", sending: false, key: 1 }
|
||||
]);
|
||||
async function sendMessage(formData) {
|
||||
const sentMessage = await deliverMessage(formData.get("message"));
|
||||
setMessages((messages) => [...messages, { text: sentMessage }]);
|
||||
function sendMessageAction(formData) {
|
||||
startTransition(async () => {
|
||||
const sentMessage = await deliverMessage(formData.get("message"));
|
||||
startTransition(() => {
|
||||
setMessages((messages) => [{ text: sentMessage }, ...messages]);
|
||||
})
|
||||
})
|
||||
}
|
||||
return <Thread messages={messages} sendMessage={sendMessage} />;
|
||||
return <Thread messages={messages} sendMessageAction={sendMessageAction} />;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user