All language subtitles for 004 Nested Client Components_en

af Afrikaans
ak Akan
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bem Bemba
bn Bengali
bh Bihari
bs Bosnian
br Breton
bg Bulgarian
km Cambodian
ca Catalan
ceb Cebuano
chr Cherokee
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
ee Ewe
fo Faroese
tl Filipino
fi Finnish
fr French
fy Frisian
gaa Ga
gl Galician
ka Georgian
de German
el Greek
gn Guarani
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ia Interlingua
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
rw Kinyarwanda
rn Kirundi
kg Kongo
ko Korean
kri Krio (Sierra Leone)
ku Kurdish
ckb Kurdish (SoranĆ®)
ky Kyrgyz
lo Laothian
la Latin
lv Latvian
ln Lingala
lt Lithuanian
loz Lozi
lg Luganda
ach Luo
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mfe Mauritian Creole
mo Moldavian
mn Mongolian
my Myanmar (Burmese)
sr-ME Montenegrin
ne Nepali
pcm Nigerian Pidgin
nso Northern Sotho
no Norwegian
nn Norwegian (Nynorsk)
oc Occitan
or Oriya
om Oromo
ps Pashto
fa Persian
pl Polish
pt-BR Portuguese (Brazil)
pt Portuguese (Portugal)
pa Punjabi
qu Quechua
rm Romansh
nyn Runyakitara
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
sh Serbo-Croatian
st Sesotho
tn Setswana
crs Seychellois Creole
sn Shona
sd Sindhi
si Sinhalese
sk Slovak
sl Slovenian
so Somali
es Spanish
es-419 Spanish (Latin American)
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
tt Tatar
te Telugu
th Thai
ti Tigrinya
to Tonga
lua Tshiluba
tum Tumbuka
tr Turkish
tk Turkmen
tw Twi
ug Uighur
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
wo Wolof
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:03,000 --> 00:00:06,614 We know that we need to use a Client Component 2 00:00:06,614 --> 00:00:09,724 if we want any interactive functionality. 3 00:00:09,724 --> 00:00:12,120 But in our application we don't have 4 00:00:12,120 --> 00:00:14,049 a single component of course, 5 00:00:14,116 --> 00:00:16,381 we have many components, some of 6 00:00:16,381 --> 00:00:18,575 them nested inside one another. 7 00:00:18,646 --> 00:00:20,998 So in this video I want to show you 8 00:00:20,998 --> 00:00:23,317 how the "use client" directive 9 00:00:23,317 --> 00:00:25,326 affects nested components. 10 00:00:25,404 --> 00:00:27,927 At the moment the ShareLinkButton 11 00:00:27,927 --> 00:00:30,221 is used inside the ReviewPage. 12 00:00:30,297 --> 00:00:32,993 And in fact we can see that the server 13 00:00:32,993 --> 00:00:34,909 renders both the ReviewPage 14 00:00:34,979 --> 00:00:36,998 and the ShareLinkButton. 15 00:00:36,998 --> 00:00:39,558 While client-side rendering is only 16 00:00:39,558 --> 00:00:41,752 done for the Client Component. 17 00:00:41,826 --> 00:00:43,830 Now, instead of displaying only 18 00:00:43,830 --> 00:00:45,382 the "Share link" button, 19 00:00:45,447 --> 00:00:47,562 in our page we may want to show 20 00:00:47,562 --> 00:00:49,064 other buttons as well, 21 00:00:49,132 --> 00:00:52,356 to let users share the review on Twitter, 22 00:00:52,356 --> 00:00:53,928 Facebook, and so on. 23 00:00:54,007 --> 00:00:56,528 So we could create another component 24 00:00:56,528 --> 00:00:58,419 to group all those buttons. 25 00:00:58,489 --> 00:01:02,903 Let's add a new file, called "ShareButtons.jsx". 26 00:01:02,903 --> 00:01:05,761 Now, this is just a demo for this video. 27 00:01:05,761 --> 00:01:08,236 Be aware that I'll discard all these 28 00:01:08,236 --> 00:01:09,955 changes after this video. 29 00:01:10,023 --> 00:01:12,644 But in this ShareButtons component 30 00:01:12,644 --> 00:01:16,168 we could return a "div" grouping a few buttons. 31 00:01:16,168 --> 00:01:19,423 Let's include our existing ShareLinkButton, 32 00:01:19,423 --> 00:01:22,125 and then add another button for Twitter, 33 00:01:22,125 --> 00:01:25,283 and a third one for Facebook for example. 34 00:01:25,283 --> 00:01:27,529 I just put some placeholders, 35 00:01:27,529 --> 00:01:29,595 because we're not actually going to 36 00:01:29,595 --> 00:01:31,367 implement those other buttons. 37 00:01:31,426 --> 00:01:34,607 But this way we could use this ShareButtons 38 00:01:34,607 --> 00:01:36,679 component in the ReviewPage, 39 00:01:36,753 --> 00:01:39,496 in place of the "ShareLinkButton". 40 00:01:39,593 --> 00:01:41,829 Which also means we no longer need 41 00:01:41,829 --> 00:01:43,867 to import that other component. 42 00:01:43,933 --> 00:01:45,529 Ok, if we save, 43 00:01:45,793 --> 00:01:47,700 we now have three different 44 00:01:47,700 --> 00:01:49,466 ways to share the review. 45 00:01:49,537 --> 00:01:51,945 Two of them are just placeholders, 46 00:01:51,945 --> 00:01:53,433 but you get the idea. 47 00:01:53,504 --> 00:01:56,189 Now, let's add a log statement here, 48 00:01:56,624 --> 00:01:59,427 printing when this component is rendered, 49 00:01:59,427 --> 00:02:00,042 as usual. 50 00:02:00,324 --> 00:02:02,756 This way, if we keep an eye on the logs, 51 00:02:02,984 --> 00:02:04,533 and reload the page, 52 00:02:05,104 --> 00:02:07,140 we can see that ShareButtons 53 00:02:07,140 --> 00:02:09,103 only renders on the server, 54 00:02:09,175 --> 00:02:12,015 because it's currently a Server Component. 55 00:02:12,015 --> 00:02:14,371 We know that all components are 56 00:02:14,371 --> 00:02:16,574 Server Components by default. 57 00:02:16,650 --> 00:02:20,212 But if we change it to be a Client Component, 58 00:02:20,212 --> 00:02:23,644 by adding the "use client" directive at the top, 59 00:02:23,644 --> 00:02:27,618 then any other components used inside this one 60 00:02:27,618 --> 00:02:31,026 will also automatically be Client Components. 61 00:02:31,026 --> 00:02:35,019 This means that, in "ShareLinkButton.jsx" 62 00:02:35,019 --> 00:02:37,626 we no longer needĀ  "use client". 63 00:02:37,626 --> 00:02:40,018 Let's repeat our usual experiment 64 00:02:40,018 --> 00:02:43,030 of clearing the logs and reloading the page. 65 00:02:43,030 --> 00:02:45,164 You can see that ShareButtons 66 00:02:45,164 --> 00:02:46,930 rendered in the browser, 67 00:02:47,004 --> 00:02:49,791 because it's now a Client Component, 68 00:02:49,791 --> 00:02:52,545 but ShareLinkButton is also treated 69 00:02:52,545 --> 00:02:54,276 as a Client Component, 70 00:02:54,355 --> 00:02:58,319 even though we removed the "use client" directive. 71 00:02:58,319 --> 00:03:01,026 So, when you opt in to client-side 72 00:03:01,026 --> 00:03:03,095 rendering for a component, 73 00:03:03,175 --> 00:03:07,234 it will apply to all its child components as well. 74 00:03:07,234 --> 00:03:09,697 It has to be this way, because 75 00:03:09,697 --> 00:03:12,599 when this component renders in the browser 76 00:03:12,599 --> 00:03:15,769 it will also need to render all its children, 77 00:03:15,769 --> 00:03:17,936 so they will also need to use 78 00:03:17,936 --> 00:03:19,581 client-side rendering. 79 00:03:19,656 --> 00:03:22,856 Now, this also raises an interesting question: 80 00:03:22,856 --> 00:03:24,945 at what level should we put 81 00:03:24,945 --> 00:03:27,034 the "use client" directive? 82 00:03:27,112 --> 00:03:29,163 In theory, we could even set it 83 00:03:29,163 --> 00:03:31,015 in the ReviewPage component, 84 00:03:31,081 --> 00:03:35,031 and use client-side rendering for the whole page. 85 00:03:35,031 --> 00:03:38,286 In practice, this won't work in this case. 86 00:03:38,286 --> 00:03:40,617 The error says we cannot export 87 00:03:40,617 --> 00:03:42,799 a "generateMetadata" function 88 00:03:42,874 --> 00:03:46,180 from a component marked with "use client". 89 00:03:46,180 --> 00:03:48,617 That's because "generateMetadata" 90 00:03:48,617 --> 00:03:50,463 only works on the server. 91 00:03:50,537 --> 00:03:52,925 Even if we try commenting this out, 92 00:03:53,557 --> 00:03:55,247 we then get another error, 93 00:03:55,247 --> 00:03:58,318 because some of our code is trying to use 94 00:03:58,318 --> 00:04:00,779 the Node.js "fs" module. 95 00:04:00,779 --> 00:04:03,995 In this page we call the getReview function, 96 00:04:03,995 --> 00:04:07,891 that uses "readFile" to load the Markdown data. 97 00:04:07,891 --> 00:04:10,219 And that function is only available 98 00:04:10,219 --> 00:04:11,816 when running in Node.js. 99 00:04:11,883 --> 00:04:14,435 It will not be available in the browser, 100 00:04:14,435 --> 00:04:17,624 so we cannot use it in a Client Component. 101 00:04:17,624 --> 00:04:21,279 If a component uses any server-side functionality, 102 00:04:21,279 --> 00:04:22,597 like in this case, 103 00:04:22,670 --> 00:04:25,352 then it must be a Server Component. 104 00:04:25,352 --> 00:04:28,563 In any case, it's not usually a good idea 105 00:04:28,563 --> 00:04:32,237 to use client-side rendering for an entire page, 106 00:04:32,237 --> 00:04:34,588 because that will send an awful lot 107 00:04:34,588 --> 00:04:36,871 of JavaScript code to the browser. 108 00:04:36,938 --> 00:04:39,102 We want to use Client Components 109 00:04:39,102 --> 00:04:40,792 only when it's necessary. 110 00:04:40,859 --> 00:04:43,115 In this example, ShareButtons 111 00:04:43,115 --> 00:04:45,138 can be a Server Component. 112 00:04:45,215 --> 00:04:47,785 It's only in ShareLinkButton that 113 00:04:47,785 --> 00:04:50,356 we use client-side functionality. 114 00:04:50,433 --> 00:04:54,437 So we should only mark this one with "use client". 115 00:04:54,437 --> 00:04:57,909 Each page is rendered from a component tree, 116 00:04:57,909 --> 00:05:00,921 where at the top you have the RootLayout, 117 00:05:00,921 --> 00:05:03,793 that always contains the NavBar, 118 00:05:03,793 --> 00:05:06,470 and then the page-specificĀ component, 119 00:05:06,470 --> 00:05:08,207 inĀ this case ReviewPage. 120 00:05:08,279 --> 00:05:11,725 This will in turn have other nested components, 121 00:05:11,725 --> 00:05:14,572 like the Heading, and ShareButtons, 122 00:05:14,572 --> 00:05:17,872 and the latter includes the ShareLinkButton. 123 00:05:17,872 --> 00:05:20,823 In general, we want to minimize the amount 124 00:05:20,823 --> 00:05:23,001 of code we send to the browser. 125 00:05:23,072 --> 00:05:26,290 That's why we should try to put "use client" 126 00:05:26,290 --> 00:05:29,188 only at the leaves of our component tree. 9260

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.