36-წუთიანი სამუშაო სესია იმაზე, როგორ ფიქრობს React სინამდვილეში — კომპონენტები და ცალმხრივი მონაცემთა ნაკადი, ჰუკები, რომლებსაც ყოველდღე იყენებთ, ეფექტები, რომლებიც ჩვეულებრივ არ გჭირდებათ, და სად სრულდება თქვენი კოდი ახლა, როცა სერვერი ისევ სურათშია.
React-ის დიდი იდეა პატარაა: აღწერეთ, როგორ უნდა გამოიყურებოდეს ეკრანი მიმდინარე მონაცემებისთვის, DOM-ის ცვლილებები კი React-ს მიანდეთ. თქვენ არასდროს ძვრებით გვერდში და ხელით არ ასწორებთ ნოუდებს — ცვლით მდგომარეობას და თავიდან აღწერთ. მთელ მოდელს სამი ცნება ატარებს: კომპონენტები, JSX და ცალმხრივი მონაცემთა ნაკადი.
შედის მდგომარეობა, გამოდის UI-ის აღწერა. მოვლენა ახალ მდგომარეობას აყენებს და ციკლი თავიდან ეშვება.
ცალმხრივი ნაკადი: მონაცემები ქვევით მიდის props-ად; მოვლენები ზევით ბრუნდება callback-ებად. ვერცერთი შვილი გვერდულად ვერ წვდება მეზობელს.
გამოიყურება როგორც HTML, მაგრამ სინამდვილეში გამოსახულებაა: {} შიგნით ნებისმიერ JS მნიშვნელობას სვამს, className ანაცვლებს class-ს და ყველა თეგი უნდა დაიხუროს.
მშობელი მონაცემებს ქვევით გადასცემს. კომპონენტი არასდროს ცვლის თავის props-ს — ეს მისი რენდერის ფუნქციის არგუმენტებია.
ეკრანები პატარა კომპონენტების ჩალაგებით ააგეთ. children props კომპონენტს საშუალებას აძლევს, შემოახვიოს ყველაფერი, რასაც შიგნით ჩადებთ.
თუ მნიშვნელობას მშობელი გადმოგცემთ, ეს prop-ია. თუ კომპონენტს რენდერებს შორის რაღაცის დამახსოვრება სჭირდება — მთვლელი, ფორმის ველი, გახსნილია თუ არა მენიუ — ეს მდგომარეობაა და ჰუკს მიმართავთ. ჰუკები use-ით დაწყებული ფუნქციებია, რომლებიც ჩვეულებრივ ფუნქცია-კომპონენტს მდგომარეობის ქონისა და React-ის შესაძლებლობებთან წვდომის საშუალებას აძლევს.
სეტერი ერთადერთი კარია: ის ეუბნება React-ს, რომ მნიშვნელობა შეიცვალა და ხელახალი რენდერია საჭირო.
useState თუ useReducerreducer(state, action) ფუნქციაში გადაიტანეთ. კომპონენტი მხოლოდ აგზავნის ქმედებებს.როგორც დანომრილი ლოკერები — React მდგომარეობას იმ რიგით გცემთ, რა რიგითაც ითხოვთ, ამიტომ ყოველთვის ერთი და იმავე რიგით უნდა ითხოვოთ. props-ისა და ჰუკების დაბრუნებული მნიშვნელობების ტიპიზაცია ცალკე უნარია; იხილეთ TypeScript-ის დეკი.
useEffect არ ნიშნავს „რენდერის შემდეგ რაღაც კოდის გაშვებას“ — ეს React-ის გარე სისტემასთან სინქრონში შენარჩუნების გზაა: ქსელური კავშირი, ბრაუზერის API, არა-React ვიჯეტი, გამოწერა. თუ სამუშაო მხოლოდ props-ისა და მდგომარეობის JSX-ად ქცევაა, მისი ადგილი რენდერშია და არა ეფექტში.
აწყობა გარე სისტემას უკავშირდება; დაბრუნებული გაწმენდა კავშირს წყვეტს. ყოველი ეფექტი, რომელიც ხელს იწერს, უნდა გამოეწეროს კიდეც.
დამოკიდებულებების მასივი React-ისთვის მიცემული პირობაა: „ეს ეფექტი მხოლოდ ამ მნიშვნელობებზეა დამოკიდებული“. შეინარჩუნეთ პატიოსნება.
key.localStorage.გამოტოვებული გაწმენდა მსმენელებს ჟონავს; არაპატიოსანი დამოკიდებულებების მასივი მოძველებულ კლოჟერებს იწვევს. დეველოპმენტში Strict Mode ეფექტებს მაუნთზე განზრახ ორჯერ უშვებს — რომ დაკარგული გაწმენდა გამოაჩინოს.
როცა მნიშვნელობა ხის სიღრმეშია საჭირო — მიმდინარე თემა, შესული მომხმარებელი, ლოკალი — მისი ყოველი შუალედური კომპონენტის გავლით ჩამოტანა prop drilling-ია: მოსაბეზრებელი, და ყოველი შუალედური კომპონენტი უკვე მიბმულია მონაცემზე, რომელსაც არ იყენებს. ამას ორი ინსტრუმენტი წყვეტს: უკეთესი კომპოზიცია და Context.
მარცხნივ: მნიშვნელობა რგოლიდან რგოლში გადაეცემა. მარჯვნივ: Provider ერთხელ აქვეყნებს და სიღრმეში მყოფი შვილი პირდაპირ კითხულობს.
„drilling“-ის დიდი ნაწილი ქრება, თუ მონაცემების გატარების ნაცვლად JSX-ს children-ად გადასცემთ. ლეიაუთის კომპონენტს არ სჭირდება იცოდეს, რას ახვევს.
როგორც შენობის გახმოვანების სისტემა — მიმღები ერთხელ აცხადებს და ყველა სართული ისმენს, იმის ნაცვლად, რომ ბარათი მაგიდიდან მაგიდაზე გადაეცეს. გამოიყენეთ განცხადებებისთვის და არა ჩურჩულისთვის.
React კომპონენტს ხელახლა რენდერავს, როცა მისი მდგომარეობა იცვლება ან მისი მშობელი რენდერდება ხელახლა. ეს ჩვეულებრივ სწრაფი და უპრობლემოა — რერენდერი JSX-ს ითვლის და DOM-ს არ ეხება, სანამ რეალურად რაღაც არ შეიცვალა. წარმადობაზე მუშაობა ძირითადად ორ რამეზეა: სიის სტაბილურ გასაღებებზე და იმაზე, რომ ძვირი სამუშაო უსაფუძვლოდ არ გამეორდეს. memo-ს მხოლოდ მას შემდეგ მიმართეთ, რაც გაზომავთ.
მშობლის რერენდერი ყველა შვილამდე მიდის. memo შვილს აძლევს საშუალებას, გამოტოვოს რერენდერი, როცა მისი props უცვლელია.
memo-ში გახვეულმა შვილმა ყოველ რენდერზე „ახალი“ props არ დაინახოს.სამივე მეხსიერებასა და სირთულეს ცვლის ნაკლებ რენდერზე. თუ ყველგან რეფლექსურად გამოიყენებთ, კოდი ძნელად წასაკითხი და ნელა დასაწერი გახდება — გაზომილი მოგების გარეშე.
useMemo / useCallback უმეტესად საერთოდ აღარ სჭირდებათ — თქვენ წერთ ჩვეულებრივ კოდს და ქეშირებას კომპილატორი ამატებს. ხელით მემოიზაცია გამონაკლისად მიიჩნიეთ და არა ჩვევად.key არის React-ის საიდენტიფიკაციო იარლიყი სიის ელემენტისთვის. გამოიყენეთ სტაბილური id თქვენი მონაცემებიდან — არასდროს მასივის ინდექსი იმ სიისთვის, რომელიც შეიძლება გადალაგდეს, შეივსოს ან შემცირდეს.
თანამედროვე React კომპონენტებს იმის მიხედვით ყოფს, სად სრულდებიან ისინი. სერვერული კომპონენტი მხოლოდ სერვერზე მუშაობს, მონაცემებს პირდაპირ იღებს და ბრაუზერს ნულოვან JavaScript-ს უგზავნის. კლიენტის კომპონენტი ინტერაქტიული ნაწილია — მდგომარეობა, ეფექტები, მოვლენების ჰენდლერები — და ერთადერთია, რომელიც მოწყობილობაზე ჰიდრატირდება.
async და მონაცემები ადგილზე await-ით აიღოს, მაგრამ ვერ გამოიყენებს მდგომარეობას, ეფექტებს ან ბრაუზერის API-ებს. ინტერაქტიული საზღვარი "use client"-ით მონიშნეთ.სერვერი რენდერავს და ნაკადად აგზავნის; JS-ს მხოლოდ "use client" კუნძულები აგზავნიან და ჰიდრატირდებიან.
<Suspense fallback=...>-ში გახვიეთ და React fallback-ს აჩვენებს, სანამ კონტენტი მზად არ იქნება — შემდეგ კი მას ნაკადად ჩამოიტანს.isLoading ფლაგების მთელ ხეში გატარება აღარ გჭირდებათ; ჩატვირთვის მდგომარეობას საზღვარი ფლობს.use() ჰუკი კომპონენტს აძლევს საშუალებას, წაიკითხოს promise (ან context) და შეჩერდეს, სანამ ის არ დასრულდება.სად აიგება საბოლოოდ HTML — სერვერზე, კლიენტზე თუ სტატიკურად — ეს Rendering Strategies-ის თემაა.
სერვერულ კომპონენტებს ფრეიმვორკი სჭირდებათ, რომ დარენდერდნენ და როუტინგი მიიღონ. აირჩიეთ იმის მიხედვით, რამდენი სერვერი გინდათ სინამდვილეში.
აირჩიეთ, როცა გინდათ, რომ სერვერული რენდერი და მონაცემების წამოღება თავიდან ბოლომდე თქვენ მაგივრად მოგვარდეს.
აირჩიეთ, როცა გინდათ ვებ-სტანდარტებზე დაფუძნებული მონაცემთა ნაკადი და საშუალება, SPA-დ დაიწყოთ და შემდეგ გაიზარდოთ.
აირჩიეთ შიდა ინსტრუმენტებისა და ავტორიზაციის მიღმა მყოფი დაშბორდებისთვის, სადაც SEO და პირველი დახატვა მთავარი არ არის.
პატიოსანი ნაგულისხმევი: შიდა აპლიკაცია ყველაზე კარგად Vite SPA-დ გრძნობს თავს; საჯარო, კონტენტით სავსე პროდუქტს სერვერული ფრეიმვორკი უნდა. ნუ აიღებთ RSC-ს იმ აპლიკაციისთვის, რომელსაც სერვერი არასდროს სჭირდებოდა.
React პრიმიტივებს გაძლევთ — ელემენტებს, მდგომარეობას, ეფექტებს. მას არ აქვს ჩაშენებული ღილაკები, მოდალები ან დიზაინ-სისტემა. სწორედ ამ სიცარიელეში ცხოვრობენ კომპონენტების ბიბლიოთეკები.
აირჩიეთ, როცა გჭირდებათ საკუთარი დიზაინ-სისტემა, მაგრამ არა ხელმისაწვდომობის თავიდან გამოგონება.
აირჩიეთ, როცა გინდათ სწრაფი დასაწყისი და კოდზე სრული კონტროლი.
აირჩიეთ შიდა ინსტრუმენტებისთვის ან როცა სისწრაფე საკუთარ ბრენდს სჯობს.
პრიმიტივები იქ მთავრდება, სადაც დიზაინის შეხედულებები იწყება: პრიმიტივი გაძლევთ სწორ, ხელმისაწვდომ ქცევას; UI ბიბლიოთეკა ზემოდან ვიზუალურ სისტემას ამატებს. მდგომარეობის ინსტრუმენტები ცალკე ღერძია — იხილეთ State Management.
სად წამოიღებთ მონაცემებს, დამოკიდებულია იმაზე, სად რენდერავთ. სერვერზე კომპონენტი უბრალოდ await-ით ელოდება თავის მონაცემებს. კლიენტზე კი საკუთარს არ წერთ — მიმართავთ სერვერული მდგომარეობის ბიბლიოთეკას, რომელიც ქეშირებას, ხელახალ წამოღებას და მოძველებას თქვენ მაგივრად უვლის.
წამოიღეთ სერვერულ კომპონენტში და მონაცემები ქვევით გადაეცით. არანაირი ჩატვირთვის ფლაგი, არანაირი კლიენტის ჩანჩქერი — მონაცემები HTML-თან ერთად მოდის.
ბრაუზერში წამოღებული მონაცემებისთვის გამოიყენეთ TanStack Query ან SWR: ქეშირება, დუბლიკატების მოცილება და ფონური ხელახალი წამოღება. ნუ შეინახავთ სერვერის მონაცემებს useState-ში.
Actions და useActionState უვლის ფორმების გაგზავნას და მოლოდინის თუ ოპტიმისტურ UI-ს ხელით დაწერილი fetch-ისა და setState-ის ცეკვის გარეშე.
გაყოფა სერვერულ მდგომარეობასა (მონაცემები, რომლებსაც ბექენდიდან ქეშირებთ) და კლიენტის მდგომარეობას (მხოლოდ UI) შორის State Management-ის დეკის გულია — „React ძნელია“ ტკივილის უმეტესობა სინამდვილეში შენიღბული სერვერული მდგომარეობაა.
memo — იშვიათად, და მის უმეტეს ნაწილს კომპილატორი აკეთებს."use client" კუნძულები ინტერაქტიულობისთვის.ხუთი სწრაფი შეკითხვა სააზროვნო მოდელზე, ჰუკებზე, ეფექტებზე, წარმადობასა და სერვერულ კომპონენტებზე — მყისიერი პასუხი, ავტორიზაციის გარეშე.
ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში