Skip to content

Commit 590c44b

Browse files
docs: translate rsc-sandbox-test.md to Português (Brasil)
1 parent 7d367d7 commit 590c44b

1 file changed

Lines changed: 242 additions & 6 deletions

File tree

src/content/learn/rsc-sandbox-test.md

Lines changed: 242 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export default async function Albums() {
9090

9191
## Prova de Streaming {/*streaming-proof*/}
9292

93-
Esta demonstração prova que o streaming é incremental. A "shell" renderiza instantaneamente com um fallback `<Suspense>`. Após 2 segundos, o componente assíncrono é transmitido e o substitui — sem re-renderizar o conteúdo externo. Os timestamps mostram a diferença.
93+
Esta demonstração prova que o streaming é incremental. A estrutura (shell) é renderizada instantaneamente com um fallback do `<Suspense>`. Após 2 segundos, o componente assíncrono é transmitido e o substitui — sem re-renderizar o conteúdo externo. Os timestamps mostram a diferença.
9494

9595
<SandpackRSC>
9696

@@ -147,7 +147,7 @@ export default function Timestamp() {
147147

148148
## Tipos de Dados do Flight {/*flight-data-types*/}
149149

150-
Esta demonstração passa Map, Set, Date e BigInt de um componente de servidor através do stream Flight para um componente de cliente, provando que o sistema de tipos completo do protocolo Flight funciona de ponta a ponta.
150+
Esta demonstração passa Map, Set, Date e BigInt de um componente de servidor através do stream Flight para um componente cliente, provando que o sistema de tipos completo do protocolo Flight funciona de ponta a ponta.
151151

152152
<SandpackRSC>
153153

@@ -206,9 +206,9 @@ export default function DataViewer({ map, set, date, big }) {
206206

207207
</SandpackRSC>
208208

209-
## Streaming de Promessas com use() {/*promise-streaming-use*/}
209+
## Streaming de Promise com use() {/*promise-streaming-use*/}
210210

211-
O servidor cria uma promessa (resolve em 2s) e a passa como prop através de um componente pai assíncrono que suspende por 3s. Quando o pai revela por volta de 3s, a promessa já está resolvida — então `use()` retorna instantaneamente sem um fallback interno. O tempo decorrido deve ser de ~3000ms (o atraso do pai), não ~5000ms (o que significaria que a promessa reiniciou no cliente).
211+
O servidor cria uma promise (resolve em 2s) e a passa como prop através de um componente pai assíncrono que suspende por 3s. Quando o pai é revelado em ~3s, a promise já está resolvida — então `use()` retorna instantaneamente sem um fallback interno. O tempo decorrido deve ser de ~3000ms (o atraso do pai), não ~5000ms (o que significaria que a promise reiniciou no cliente).
212212

213213
<SandpackRSC>
214214

@@ -286,7 +286,7 @@ export default function UserCard({ userPromise, serverTime }) {
286286

287287
## Tipos de Dados do Flight em Ações de Servidor {/*flight-data-types-actions*/}
288288

289-
Esta demonstração envia Map, Set, Date e BigInt de um componente de cliente *para* uma ação de servidor via `encodeReply`/`decodeReply`, e então verifica se os tipos sobreviveram à viagem de ida e volta.
289+
Esta demonstração envia Map, Set, Date e BigInt de um componente cliente *para* uma ação de servidor via `encodeReply`/`decodeReply`, e então verifica se os tipos sobreviveram à viagem de ida e volta.
290290

291291
<SandpackRSC>
292292

@@ -336,4 +336,240 @@ export async function testTypes(map, set, date, big) {
336336
ok: set instanceof Set,
337337
detail: set instanceof Set
338338
? 'values: ' + JSON.stringify([...set])
339-
: 'received
339+
: 'received: ' + typeof set,
340+
},
341+
{
342+
label: 'Date',
343+
ok: date instanceof Date,
344+
detail: date instanceof Date
345+
? date.toISOString()
346+
: 'received: ' + typeof date,
347+
},
348+
{
349+
label: 'BigInt',
350+
ok: typeof big === 'bigint',
351+
detail: typeof big === 'bigint'
352+
? big.toString()
353+
: 'received: ' + typeof big,
354+
},
355+
];
356+
}
357+
358+
export async function getResults() {
359+
return results;
360+
}
361+
```
362+
363+
```js src/TestButton.js
364+
'use client';
365+
import { useTransition } from 'react';
366+
367+
export default function TestButton({ testTypes }) {
368+
const [pending, startTransition] = useTransition();
369+
370+
function handleClick() {
371+
startTransition(async () => {
372+
await testTypes(
373+
new Map([['alice', 100], ['bob', 200]]),
374+
new Set(['react', 'next', 'remix']),
375+
new Date('2025-06-15T12:00:00Z'),
376+
9007199254740993n
377+
);
378+
});
379+
}
380+
381+
return (
382+
<button onClick={handleClick} disabled={pending}>
383+
{pending ? 'Sending...' : 'Send typed data to server'}
384+
</button>
385+
);
386+
}
387+
```
388+
389+
</SandpackRSC>
390+
391+
## Mutação de Ação de Servidor + Re-renderização {/*action-mutation-rerender*/}
392+
393+
A ação de servidor modifica dados no lado do servidor e retorna uma string de confirmação. A lista atualizada só é visível porque o framework re-renderiza automaticamente toda a árvore de componentes do servidor após a conclusão da ação — o componente do servidor relê os dados e transmite a nova UI para o cliente.
394+
395+
<SandpackRSC>
396+
397+
```js src/App.js
398+
import { getTodos } from './db';
399+
import { createTodo } from './actions';
400+
import AddTodo from './AddTodo';
401+
402+
export default function App() {
403+
const todos = getTodos();
404+
return (
405+
<div>
406+
<h1>Todo List</h1>
407+
<p style={{ color: '#666', fontSize: 13 }}>
408+
This list is rendered by a server component
409+
reading server-side data. It only updates because
410+
the server re-renders after each action.
411+
</p>
412+
<ul>
413+
{todos.map((todo, i) => (
414+
<li key={i}>{todo}</li>
415+
))}
416+
</ul>
417+
<AddTodo createTodo={createTodo} />
418+
</div>
419+
);
420+
}
421+
```
422+
423+
```js src/db.js
424+
let todos = ['Buy groceries'];
425+
426+
export function getTodos() {
427+
return [...todos];
428+
}
429+
430+
export function addTodo(text) {
431+
todos.push(text);
432+
}
433+
```
434+
435+
```js src/actions.js
436+
'use server';
437+
import { addTodo } from './db';
438+
439+
export async function createTodo(text) {
440+
if (!text) return 'Please enter a todo.';
441+
addTodo(text);
442+
return 'Added: ' + text;
443+
}
444+
```
445+
446+
```js src/AddTodo.js
447+
'use client';
448+
import { useState, useTransition } from 'react';
449+
450+
export default function AddTodo({ createTodo }) {
451+
const [text, setText] = useState('');
452+
const [message, setMessage] = useState('');
453+
const [pending, startTransition] = useTransition();
454+
455+
function handleSubmit(e) {
456+
e.preventDefault();
457+
startTransition(async () => {
458+
const result = await createTodo(text);
459+
setMessage(result);
460+
setText('');
461+
});
462+
}
463+
464+
return (
465+
<div>
466+
<form onSubmit={handleSubmit}>
467+
<input
468+
value={text}
469+
onChange={e => setText(e.target.value)}
470+
placeholder="New todo"
471+
/>
472+
<button disabled={pending}>
473+
{pending ? 'Adding...' : 'Add'}
474+
</button>
475+
</form>
476+
{message && (
477+
<p style={{ color: '#666', fontSize: 13 }}>
478+
Action returned: "{message}"
479+
</p>
480+
)}
481+
</div>
482+
);
483+
}
484+
```
485+
486+
</SandpackRSC>
487+
488+
## Ações de Servidor Inline {/*inline-server-actions*/}
489+
490+
Ações de servidor definidas inline dentro de um componente de servidor com `'use server'` no corpo da função. A ação fecha sobre o estado do nível do módulo e é passada como prop — nenhum arquivo `actions.js` separado é necessário.
491+
492+
<SandpackRSC>
493+
494+
```js src/App.js
495+
import LikeButton from './LikeButton';
496+
497+
let count = 0;
498+
499+
export default function App() {
500+
async function addLike() {
501+
'use server';
502+
count++;
503+
}
504+
505+
return (
506+
<div>
507+
<h1>Inline Server Actions</h1>
508+
<p>Likes: {count}</p>
509+
<LikeButton addLike={addLike} />
510+
</div>
511+
);
512+
}
513+
```
514+
515+
```js src/LikeButton.js
516+
'use client';
517+
518+
export default function LikeButton({ addLike }) {
519+
return (
520+
<form action={addLike}>
521+
<button type="submit">Like</button>
522+
</form>
523+
);
524+
}
525+
```
526+
527+
</SandpackRSC>
528+
529+
## Funções de Servidor {/*server-functions*/}
530+
531+
<SandpackRSC>
532+
533+
```js src/App.js
534+
import { addLike, getLikeCount } from './actions';
535+
import LikeButton from './LikeButton';
536+
537+
export default async function App() {
538+
const count = await getLikeCount();
539+
return (
540+
<div>
541+
<h1>Server Functions</h1>
542+
<p>Likes: {count}</p>
543+
<LikeButton addLike={addLike} />
544+
</div>
545+
);
546+
}
547+
```
548+
549+
```js src/actions.js
550+
'use server';
551+
552+
let count = 0;
553+
554+
export async function addLike() {
555+
count++;
556+
}
557+
558+
export async function getLikeCount() {
559+
return count;
560+
}
561+
```
562+
563+
```js src/LikeButton.js
564+
'use client';
565+
566+
export default function LikeButton({ addLike }) {
567+
return (
568+
<form action={addLike}>
569+
<button type="submit">Like</button>
570+
</form>
571+
);
572+
}
573+
```
574+
575+
</SandpackRSC>

0 commit comments

Comments
 (0)