All language subtitles for 009 Refactoring & Deriving States_en

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
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
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:02,070 --> 00:00:04,210 So now I also wanna validate 2 00:00:04,210 --> 00:00:05,920 on every keystroke, 3 00:00:05,920 --> 00:00:08,810 hence we can also copy this validation logic 4 00:00:08,810 --> 00:00:11,040 to the name and put change handler, 5 00:00:11,040 --> 00:00:14,030 but actually doing it like that would be incorrect 6 00:00:14,030 --> 00:00:16,470 because here we check if it's not valid 7 00:00:16,470 --> 00:00:19,830 and set this to not valid if it is, 8 00:00:19,830 --> 00:00:23,440 but actually of course, I wanna check if it is valid 9 00:00:23,440 --> 00:00:24,900 on every keystroke 10 00:00:24,900 --> 00:00:29,430 to get rid of that validation error as quickly as possible. 11 00:00:29,430 --> 00:00:31,540 Hence, here, I wanna check 12 00:00:31,540 --> 00:00:34,280 if it's not equal to an empty string 13 00:00:34,280 --> 00:00:38,740 and then set entered name is valid to true. 14 00:00:38,740 --> 00:00:40,560 And we don't need to return here, by the way, 15 00:00:40,560 --> 00:00:44,000 because there is no code to execute after the if statement. 16 00:00:44,000 --> 00:00:45,950 The same here in the blur handler, 17 00:00:45,950 --> 00:00:47,683 we can get rid of return there. 18 00:00:48,780 --> 00:00:51,530 So now in name input change handler, 19 00:00:51,530 --> 00:00:53,960 we are validating the input. 20 00:00:53,960 --> 00:00:55,470 We are setting this to true 21 00:00:55,470 --> 00:00:59,010 as soon as we do detect a valid input. 22 00:00:59,010 --> 00:01:00,440 Though here as a side note, 23 00:01:00,440 --> 00:01:02,540 we shouldn't use the entered name state, 24 00:01:02,540 --> 00:01:04,930 but instead event target value, 25 00:01:04,930 --> 00:01:08,430 because we do update the entered name state with this line, 26 00:01:08,430 --> 00:01:09,330 but as you learned, 27 00:01:09,330 --> 00:01:12,880 such state updates are then scheduled by react, 28 00:01:12,880 --> 00:01:15,300 they are not processed immediately, 29 00:01:15,300 --> 00:01:16,880 so in the next line thereafter, 30 00:01:16,880 --> 00:01:19,260 you don't have that latest state yet, 31 00:01:19,260 --> 00:01:22,240 hence here you would be referring to an old state 32 00:01:22,240 --> 00:01:23,960 if you used entered name. 33 00:01:23,960 --> 00:01:25,800 So therefore instead of doing that, 34 00:01:25,800 --> 00:01:28,470 we should use the same state data source 35 00:01:28,470 --> 00:01:31,440 we used for updating the state in the line before, 36 00:01:31,440 --> 00:01:33,523 which is the event target value here. 37 00:01:34,430 --> 00:01:36,970 Now with that, if we save this, 38 00:01:36,970 --> 00:01:38,710 if we start typing here, 39 00:01:38,710 --> 00:01:41,103 with every keystroke, we update this. 40 00:01:42,680 --> 00:01:46,620 So now we might have the best possible solution here. 41 00:01:46,620 --> 00:01:49,950 Now, we get this instant validation once it blurs 42 00:01:49,950 --> 00:01:51,690 or once we submit, 43 00:01:51,690 --> 00:01:54,220 but then if we have an error. 44 00:01:54,220 --> 00:01:57,580 So if we do, for example, blur with an invalid value, 45 00:01:57,580 --> 00:01:59,720 we do give immediate feedback 46 00:01:59,720 --> 00:02:02,170 and allow the user to directly fix this 47 00:02:02,170 --> 00:02:03,633 with every keystroke. 48 00:02:04,590 --> 00:02:08,500 And I think this is a rather good user experience. 49 00:02:08,500 --> 00:02:11,810 What's not so good though, is our code, 50 00:02:11,810 --> 00:02:16,810 because we wrote a lot of code for just one input. 51 00:02:16,930 --> 00:02:19,330 Now, there will be ways of reusing logic, 52 00:02:19,330 --> 00:02:20,920 and I'll come back to those, 53 00:02:20,920 --> 00:02:24,980 but I wanna start with cleaning up that code here a bit, 54 00:02:24,980 --> 00:02:28,630 because that is definitely not the code we wanna write 55 00:02:28,630 --> 00:02:31,330 to achieve this behavior. 56 00:02:31,330 --> 00:02:33,730 So what's problematic about this code? 57 00:02:33,730 --> 00:02:36,130 Well, we have a lot of repetition 58 00:02:36,130 --> 00:02:40,210 and we have a lot of code in general just to handle this, 59 00:02:40,210 --> 00:02:41,490 and it just doesn't feel 60 00:02:41,490 --> 00:02:44,460 like the shortest possible way of writing this. 61 00:02:44,460 --> 00:02:47,110 And indeed it isn't. 62 00:02:47,110 --> 00:02:51,290 Now of course, one tiny piece of code we can get rid of 63 00:02:51,290 --> 00:02:55,320 is that code here where I use my input ref. 64 00:02:55,320 --> 00:02:58,440 Because I am using state here to get the value, 65 00:02:58,440 --> 00:03:01,340 there is no need to keep the input ref around, 66 00:03:01,340 --> 00:03:02,930 but that's just a small thing. 67 00:03:02,930 --> 00:03:04,840 I will nonetheless remove it. 68 00:03:04,840 --> 00:03:07,170 But that's not the main thing I wanna change, 69 00:03:07,170 --> 00:03:10,280 though here I will therefore also delete name input ref, 70 00:03:10,280 --> 00:03:14,330 remove to use ref import and down in the JSX code, 71 00:03:14,330 --> 00:03:16,300 remove this ref assignment. 72 00:03:16,300 --> 00:03:19,200 But again, that was not the main thing. 73 00:03:19,200 --> 00:03:20,770 The main thing instead, 74 00:03:20,770 --> 00:03:22,860 is just general validation logic 75 00:03:22,860 --> 00:03:25,430 with all those different event handler functions 76 00:03:25,430 --> 00:03:27,040 and what they're doing. 77 00:03:27,040 --> 00:03:30,630 I think it doesn't have to be that complex. 78 00:03:30,630 --> 00:03:31,463 In the end, 79 00:03:31,463 --> 00:03:33,930 we must not forget that it is all about 80 00:03:33,930 --> 00:03:36,780 finding out whether the input is valid 81 00:03:36,780 --> 00:03:38,950 and if it was touched, 82 00:03:38,950 --> 00:03:41,310 and if it's invalid and was touched, 83 00:03:41,310 --> 00:03:43,830 we wanna show the user an error, 84 00:03:43,830 --> 00:03:46,300 otherwise we don't want to do that. 85 00:03:46,300 --> 00:03:48,240 Since that is the goal, 86 00:03:48,240 --> 00:03:51,270 we actually don't necessarily have to manage 87 00:03:51,270 --> 00:03:54,350 a separate entered name as a valid state, 88 00:03:54,350 --> 00:03:57,590 instead, let me get rid of that dummy use effect call. 89 00:03:57,590 --> 00:03:58,980 We don't need it here, 90 00:03:58,980 --> 00:04:01,640 instead we could add a derived 91 00:04:02,790 --> 00:04:06,820 entered name is valid constant here 92 00:04:08,170 --> 00:04:11,130 and get rid of that state here, 93 00:04:11,130 --> 00:04:16,130 and just work with the value and detached state. 94 00:04:16,130 --> 00:04:18,230 Because entered name is valid 95 00:04:18,230 --> 00:04:20,760 is simply something we can derive 96 00:04:20,760 --> 00:04:22,450 from the entered name state, 97 00:04:22,450 --> 00:04:25,960 and since this entire component function will re-execute 98 00:04:25,960 --> 00:04:28,730 whenever a new value is entered, 99 00:04:28,730 --> 00:04:30,860 we ensure that this constant 100 00:04:30,860 --> 00:04:32,510 will always take into account 101 00:04:32,510 --> 00:04:34,930 the latest value and touched state. 102 00:04:34,930 --> 00:04:37,900 Because whenever one of these two states changes, 103 00:04:37,900 --> 00:04:40,033 this component function gets re-rendered. 104 00:04:40,870 --> 00:04:42,820 So here in entered name is valid, 105 00:04:42,820 --> 00:04:45,770 I wanna store the result of checking entered name. 106 00:04:45,770 --> 00:04:47,933 So this entered name state here. 107 00:04:48,777 --> 00:04:53,170 .trim being equal or not equal to an empty string 108 00:04:54,280 --> 00:04:56,430 because this is entered name is valid 109 00:04:56,430 --> 00:04:59,790 and that should be true if this here yields true. 110 00:04:59,790 --> 00:05:02,490 If the trend entered name is not empty, 111 00:05:02,490 --> 00:05:04,940 then entered name is valid. 112 00:05:04,940 --> 00:05:08,450 This means that we can get rid of all the parts of the code 113 00:05:08,450 --> 00:05:11,760 where we set entered name as valid 114 00:05:11,760 --> 00:05:13,640 because deriving this result 115 00:05:13,640 --> 00:05:16,650 from the already existing states like this is enough, 116 00:05:16,650 --> 00:05:18,910 and here I do set entered name, 117 00:05:18,910 --> 00:05:23,210 hence we ensure that the component function gets re-rendered 118 00:05:23,210 --> 00:05:26,650 and gets reevaluated on every keystroke, 119 00:05:26,650 --> 00:05:28,423 which is exactly what we want here. 120 00:05:29,360 --> 00:05:33,550 Now what about this name input blur handler? 121 00:05:33,550 --> 00:05:34,920 Well, in the end here, 122 00:05:34,920 --> 00:05:38,090 I also don't need to validate this. 123 00:05:38,090 --> 00:05:40,160 Instead, we can delete this 124 00:05:40,160 --> 00:05:43,270 and we can rely on this inferred state 125 00:05:43,270 --> 00:05:47,010 combined with this inferred value down there, 126 00:05:47,010 --> 00:05:48,543 name input is invalid, 127 00:05:49,590 --> 00:05:52,720 which takes this inferred constant into account. 128 00:05:52,720 --> 00:05:54,170 The entered name is valid, 129 00:05:54,170 --> 00:05:56,680 which is based on the entered name value 130 00:05:56,680 --> 00:05:59,740 and combines that with entered name touched. 131 00:05:59,740 --> 00:06:01,630 And to make this a bit easier, 132 00:06:01,630 --> 00:06:06,510 I'll move that constant right below entered name is valid. 133 00:06:06,510 --> 00:06:09,060 So these two lines of code now work together. 134 00:06:09,060 --> 00:06:12,260 We first find out if the entered name was valid 135 00:06:12,260 --> 00:06:14,310 and we then check if it's not valid, 136 00:06:14,310 --> 00:06:18,380 and combine that information with entered name touched. 137 00:06:18,380 --> 00:06:20,580 So now we still get these values, 138 00:06:20,580 --> 00:06:23,370 but we have to manage one state slice less, 139 00:06:23,370 --> 00:06:25,743 we don't have to manage the state validity. 140 00:06:28,410 --> 00:06:30,360 Now, in the form submission handler, 141 00:06:30,360 --> 00:06:33,770 we of course, still wanna keep this if check around though, 142 00:06:33,770 --> 00:06:37,160 to cancel the form submission if the input is invalid, 143 00:06:37,160 --> 00:06:40,120 but here we don't need to set the validity, 144 00:06:40,120 --> 00:06:44,390 instead here we can simply check if entered name is valid 145 00:06:44,390 --> 00:06:45,610 is false. 146 00:06:45,610 --> 00:06:48,493 So this inferred variable, if that's false. 147 00:06:50,240 --> 00:06:52,723 If it's not valid, I wanna return. 148 00:06:53,580 --> 00:06:54,880 I can do this here 149 00:06:54,880 --> 00:06:56,690 because this function, 150 00:06:56,690 --> 00:06:59,510 this form submission function, this handler function 151 00:06:59,510 --> 00:07:01,260 also gets recreated 152 00:07:01,260 --> 00:07:04,570 when the component function is re-evaluated. 153 00:07:04,570 --> 00:07:07,340 So this form submission handler function 154 00:07:07,340 --> 00:07:10,150 will have access to that latest inferred 155 00:07:10,150 --> 00:07:12,680 entered name is valid value here. 156 00:07:14,950 --> 00:07:18,410 And here where it then set entered name is valid to true, 157 00:07:18,410 --> 00:07:20,800 that is also not needed here 158 00:07:20,800 --> 00:07:22,930 because we got all the code related to that, 159 00:07:22,930 --> 00:07:25,700 which we need already in place. 160 00:07:25,700 --> 00:07:27,150 Now, with all of that, 161 00:07:27,150 --> 00:07:29,240 if we give this a try and reload. 162 00:07:29,240 --> 00:07:31,820 If I submit, we still see that it's invalid. 163 00:07:31,820 --> 00:07:34,380 If I click in there and out of there, we see this. 164 00:07:34,380 --> 00:07:37,090 If I enter something, this behaves correctly, 165 00:07:37,090 --> 00:07:38,590 but if I then submit, 166 00:07:38,590 --> 00:07:41,210 if I submit a correct value, 167 00:07:41,210 --> 00:07:45,160 it jumps back to showing me that this is invalid, 168 00:07:45,160 --> 00:07:46,240 and that's not a bug, 169 00:07:46,240 --> 00:07:49,890 but simply a result from the code we wrote here, 170 00:07:49,890 --> 00:07:52,870 where we set entered name to an empty string 171 00:07:52,870 --> 00:07:57,803 and that indeed does result in entered name being not valid. 172 00:07:59,600 --> 00:08:01,200 But the fix is simple. 173 00:08:01,200 --> 00:08:04,140 We just also wanna reset the touched state 174 00:08:04,140 --> 00:08:05,960 once we submit the form. 175 00:08:05,960 --> 00:08:08,320 So after a set entered name 176 00:08:08,320 --> 00:08:10,230 and setting this back to an empty string, 177 00:08:10,230 --> 00:08:14,440 I want to set set entered name touched back to false 178 00:08:14,440 --> 00:08:16,550 to reset the touched state, 179 00:08:16,550 --> 00:08:18,520 because once the form is submitted, 180 00:08:18,520 --> 00:08:19,580 it of course, should again 181 00:08:19,580 --> 00:08:21,970 act as if it wasn't touched at all 182 00:08:21,970 --> 00:08:24,223 because it's a brand new form now in the end. 183 00:08:25,200 --> 00:08:28,520 So if we add this and then go back. 184 00:08:28,520 --> 00:08:30,690 Now, if I submit this form, 185 00:08:30,690 --> 00:08:33,049 it's not showing me the error again. 186 00:08:33,049 --> 00:08:35,740 And we now definitely slimmed down that code 187 00:08:35,740 --> 00:08:39,470 and have a way more readable and manageable code. 188 00:08:39,470 --> 00:08:43,100 And I know that it took quite a lot of steps to get there, 189 00:08:43,100 --> 00:08:44,410 but I wanted to make it clear 190 00:08:44,410 --> 00:08:46,570 what the thought process is here 191 00:08:46,570 --> 00:08:49,350 and why we are doing it like that. 192 00:08:49,350 --> 00:08:51,750 And let me get rid of that use effect import, 193 00:08:51,750 --> 00:08:53,520 which we don't need anymore. 194 00:08:53,520 --> 00:08:57,290 With that, we have a relatively lean component here, 195 00:08:57,290 --> 00:09:01,500 which manages the input value and the touched state, 196 00:09:01,500 --> 00:09:05,393 and then derives to validity from those states. 15166

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