# Tengeneza Programu ya Benki Sehemu ya 3: Njia za Kupata na Kutumia Data Fikiria kuhusu kompyuta ya Enterprise katika Star Trek - wakati Kapteni Picard anauliza kuhusu hali ya meli, taarifa zinaonekana mara moja bila kuzuia kiolesura kizima kusimamika na kujijenga upya. Mtiririko wa taarifa usio na mshono ni hasa kile tunachojenga hapa kwa kupata data kwa mabadiliko ya wakati halisi. Hivi sasa, programu yako ya benki ni kama gazeti lililochapishwa - lina habari lakini ni iliyokauka. Tutalibadilisha kuwa kitu kama kituo cha mawasiliano cha NASA, ambako data inatembea mara kwa mara na kusasishwa kwa wakati halisi bila kuingilia kazi ya mtumiaji. Utafundishwa jinsi ya kuwasiliana na seva kwa njia isiyo ya uwazi (asynchronous), kushughulikia data inayokuja kwa nyakati tofauti, na kubadilisha taarifa ghafi kuwa kitu chenye maana kwa watumiaji wako. Hii ndiyo tofauti kati ya maonyesho na programu inayotengenezwa kwa ajili ya uzalishaji. ## ⚑ Unachoweza Kufanya Katika Dakika 5 Zijazo **Njia ya Kuanzisha Haraka kwa Watengenezaji Wenye Muda Mfupi** ```mermaid flowchart LR A[⚑ Dakika 5] --> B[Sanidi seva ya API] B --> C[Jaribu kupokea kwa curl] C --> D[Tengeneza kazi ya kuingia] D --> E[Tazama data ikifanya kazi] ``` - **Dakika 1-2**: Anzisha seva yako ya API (`cd api && npm start`) na jaribu muunganisho - **Dakika 3**: Unda kazi ya msingi `getAccount()` ukitumia fetch - **Dakika 4**: Unganisha fomu ya kuingia na `action="javascript:login()"` - **Dakika 5**: Jaribu kuingia na angalia data ya akaunti inaonekana kwenye konsole **Amri za Kujaribu Haraka**: ```bash # Thibitisha API inaendesha curl http://localhost:5000/api # Jaribu upokeaji data za akaunti curl http://localhost:5000/api/accounts/test ``` **Kwa Nini Hii ni Muhimu**: Ndani ya dakika 5, utaona uchawi wa kupata data kwa njia isiyo ya uwazi (asynchronous) unaoiendesha kila programu ya wavuti ya kisasa. Hii ni msingi unaofanya programu kuwa na mwitikio na hisia za kuishi. ## πŸ—ΊοΈ Safari Yako ya Kujifunza Kupitia Programu za Wavuti Zinazotumia Data ```mermaid journey title Kutoka Kurasa Tulivu hadi Programu Zinazobadilika section Kuelewa Mageuzi Upakiaji wa kurasa za jadi: 3: You Kugundua faida za AJAX/SPA: 5: You Kufuata mifumo ya Fetch API: 7: You section Kujenga Uthibitishaji Tengeneza kazi za kuingia: 4: You Shimamia operesheni zisizo za mara moja: 6: You Dhibiti vikao vya mtumiaji: 8: You section Mabadiliko ya Kiolesura Bora Jifunze udhibiti wa DOM: 5: You Tengeneza maonyesho ya miamala: 7: You Tengeneza dashibodi zinazojibika: 9: You section Mifumo ya Kitaalamu Uwasilishaji wa mfano wa template: 6: You Mikakati ya kushughulikia makosa: 7: You Uboreshaji wa utendaji: 8: You ``` **Lengo la Safari Yako**: Mwisho wa somo hili, utaelewa jinsi programu za wavuti za kisasa zinavyopata, kushughulikia, na kuonyesha data kwa mabadiliko ya wakati halisi, zikitengeneza uzoefu wa mtumiaji usio na mshono tunao matarajia kutoka kwa programu za kitaalamu. ## Mtihani wa Kabla ya Mafunzo [Mtihani wa kabla ya somo](https://ff-quizzes.netlify.app/web/quiz/45) ### Mahitaji ya Awali Kabla ya kuingia kwenye kupata data, hakikisha una vipengele hivi tayari: - **Somo la Awali**: Kamilisha [Fomu ya Kuingia na Usajili](../2-forms/README.md) - tutajenga juu ya msingi huu - **Seva ya Ndani**: Sakinisha [Node.js](https://nodejs.org) na [endesha seva ya API](../api/README.md) ili kutoa data za akaunti - **Muunganisho wa API**: Jaribu muunganisho wa seva yako kwa amri hii: ```bash curl http://localhost:5000/api # Jibu lililotarajiwa: "API ya Benki v1.0.0" ``` Jaribio hili la haraka linahakikisha vipengele vyote vinaendesha vizuri: - Inathibitisha kwamba Node.js inaendeshwa ipasavyo kwenye mfumo wako - Inathibitisha seva yako ya API iko hai na inajibu - Inathibitisha programu yako inaweza kufikia seva (kama kuangalia mawasiliano ya redio kabla ya misheni) ## 🧠 Muhtasari wa Mfumo wa Usimamizi wa Data ```mermaid mindmap root((Usimamizi wa Takwimu)) Authentication Flow Login Process Form Validation Credential Verification Session Management User State Kifaa cha Akaunti ya Ulimwengu Vizuizi vya Urambazaji Ushughulikiaji wa Makosa API Communication Fetch Patterns Maombi ya GET Maombi ya POST Majibu ya Makosa Data Formats Usindikaji wa JSON Uandishi wa URL Uchambuzi wa Majibu Dynamic UI Updates DOM Manipulation Maboresho Salama ya Maandishi Uundaji wa Vitu Nakala ya Mifano User Experience Maboresho ya Muda Halisi Ujumbe wa Makosa Hali za Kupakia Security Considerations XSS Prevention Matumizi ya textContent Usafishaji wa Kuingiza Data Uundaji Salama wa HTML CORS Handling Maombi ya Asili Mbalimbali Usanidi wa Vichwa Usanidi wa Maendeleo ``` **Kanuni Muhimu**: Programu za wavuti za kisasa ni mifumo ya kuratibu data - zinapanga kati ya violesura vya mtumiaji, seva za API, na mifano ya usalama ya kivinjari ili kuunda uzoefu usio na mshono, wenye mwitikio. --- ## Kuelewa Kupata Data Katika Programu za Wavuti za Kisasa Jinsi programu za wavuti zinavyoshughulikia data imebadilika sana katika miongo miwili iliyopita. Kuelewa mabadiliko haya kutakusaidia kufahamu kwa nini mbinu za kisasa kama AJAX na Fetch API ni zenye nguvu na kwa nini zimekuwa zana muhimu kwa watengenezaji wa wavuti. Tuchunguze jinsi tovuti za zamani zilivyofanya kazi ikilinganishwa na programu za kisasa, zenye mwitikio, tunazojenga leo. ### Programu za Wavuti za Kurasa Nyingi za Kiasili (MPA) Katika siku za mwanzo za wavuti, kila bonyeza lilikuwa kama kubadilisha chaneli kwenye televisheni ya zamani - skrini ingekuwa tupu, kisha polepole ikaanza kuonyesha yaliyomo mapya. Hii ilikuwa halisi ya programu za wavuti za zamani, ambapo kila ushirikiano ulimaanisha kujenga upya ukurasa mzima kutoka mwanzoni. ```mermaid sequenceDiagram participant User participant Browser participant Server User->>Browser: Bonyeza kiungo au tuma fomu Browser->>Server: Inaomba ukurasa mpya wa HTML Note over Browser: Ukurasa unakuwa tupu Server->>Browser: Inarudisha ukurasa kamili wa HTML Browser->>User: Inaonyesha ukurasa mpya (mwanga/upya) ``` ![Mtiririko wa sasisho katika programu ya kurasa nyingi](../../../../translated_images/sw/mpa.7f7375a1a2d4aa77.webp) **Kwa nini njia hii ilihisi polepole:** - Kila bonyeza lilimaanisha kujenga ukurasa mzima upya kutoka mwanzoni - Watumiaji walikatizwa katikati ya mawazo na miale hiyo ya kurasa - Muunganisho wako wa intaneti ulifanya kazi nguvu kupakua tena kichwa na futi za ukurasa mara kwa mara - Programu zilihisi zaidi kama kubonyeza faili milingoti badala ya kutumia programu ### Programu za Sasa za Kurasa Moja (SPA) AJAX (Asynchronous JavaScript and XML) ilibadilisha sura hii kabisa. Kama muundo wa moduli wa Kituo cha Anga cha Kimataifa, ambapo wanaanga wanaweza kubadilisha vipengele binafsi bila kujenga tena miundo yote, AJAX inaruhusu sisi kusasisha sehemu maalum ya ukurasa wa wavuti bila kupakia kila kitu upya. Licha ya jina kutaja XML, sisi mara nyingi tunatumia JSON leo, lakini kanuni kuu inabaki: sasisha tu kile kinachohitaji kubadilika. ```mermaid sequenceDiagram participant User participant Browser participant JavaScript participant Server User->>Browser: Huingiliana na ukurasa Browser->>JavaScript: Huchochea mshughulikiaji wa tukio JavaScript->>Server: Huchukua data inayohitajika tu Server->>JavaScript: Inarejea data ya JSON JavaScript->>Browser: Husaidia vipengele maalum vya ukurasa Browser->>User: Inaonyesha yaliyosasishwa (hakuna upyaaji) ``` ![Mtiririko wa sasisho katika programu ya ukurasa mmoja](../../../../translated_images/sw/spa.268ec73b41f992c2.webp) **Kwa nini SPA zinahisi bora zaidi:** - Sehemu tu zilizobadilika ndizo zinazosasishwa (tajiri, sivyo?) - Hakuna tena katizo la ghafla - watumiaji wako wanaendelea bila kufikia - Data kidogo kusafirishwa kwenye waya inamaanisha kupakia haraka - Kila kitu kinahisi chapchap na kwa mwitikio, kama programu kwenye simu yako ### Maendeleo ya API ya Fetch ya Kisasa Vivinjari vya kisasa vinatoa [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API), inayobadilisha [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest) ya zamani. Kama tofauti kati ya kutumia telegrafu na barua pepe, Fetch API hutumia ahadi (promises) kwa msimbo safi wa asynchronous na hushughulikia JSON kwa asili. | Kipengele | XMLHttpRequest | Fetch API | |---------|----------------|----------| | **Sintaksia** | Callback ngumu | Ahadi safi | | **Usindikaji wa JSON** | Inahitaji parsing ya mwongozo | Njia ya kijenzi `.json()` | | **Usimamizi wa makosa** | Maelezo machache ya makosa | Maelezo kamili ya makosa | | **Msaada wa Kisasa** | Ulinganishaji wa zamani | Ahadi na async/await ya ES6+ | > πŸ’‘ **Ulinganishaji wa Vivinjari**: Habari njema - Fetch API inafanya kazi katika vivinjari vyote vya kisasa! Ikiwa unavutiwa na matoleo maalum, [caniuse.com](https://caniuse.com/fetch) ina habari kamili kuhusu ulinganishaji. > **Hitimisho:** - Inafanya kazi vizuri Chrome, Firefox, Safari, na Edge (sehemu yote mtumiaji wako yuko) - Internet Explorer tu ndilo linahitaji msaada wa ziada (na ukweli, ni wakati wa kuachana na IE) - Inakupa msingi mzuri kwa mifumo sugu ya async/await tutakayotumia baadaye ### Kutekeleza Kuingia kwa Mtumiaji na Kupata Data Sasa tutawekeza mfumo wa kuingia ambao unabadilisha programu yako ya benki kutoka kuonyesha kimya kimya hadi kuwa programu inayofanya kazi. Kama itifaki za uthibitishaji zinazotumika katika maeneo salama ya kijeshi, tutajiridhisha sifa za mtumiaji kisha tutoa ufikiaji kwa data zao maalum. Tutajenga hatua baada ya hatua, kuanzia na uthibitishaji wa msingi kisha kuongeza uwezo wa kupata data. #### Hatua ya 1: Tengeneza Msingi wa Kazi ya Kuingia Fungua faili yako `app.js` na ongeza kazi mpya ya `login`. Hii itashughulikia mchakato wa uthibitishaji wa mtumiaji: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; } ``` **Hebu tuchambue hii:** - Neno `async`? Inasema JavaScript "hebu, kazi hii inaweza kuhitaji kusubiri mambo" - Tunavua fomu yetu kutoka ukurasa (bila mambo ya ziada, tunaitafuta kwa ID yake) - Halafu tunachukua kitu chochote mtumiaji aliandika kama jina la mtumiaji - Hii ni mbinu nzuri: unaweza kufikia input ya fomu yoyote kwa jina lake `name` - hakuna haja ya getElementById ziada! > πŸ’‘ **Mfumo wa Kufikia Fomu**: Kila udhibiti wa fomu unaweza kufikiwa kwa jina lake (lilowekwa kwenye HTML kwa kutumia sifa ya `name`) kama mali ya kipengele cha fomu. Hii inatoa njia safi, inayosomeka ya kupata data za fomu. #### Hatua ya 2: Tengeneza Kazi ya Kupata Data za Akaunti Ifuatayo, tutaunda kazi maalum ya kupata data za akaunti kutoka seva. Hii inafuata mfano ule ule wa kazi yako ya usajili lakini inazingatia kupata data: ```javascript async function getAccount(user) { try { const response = await fetch('//localhost:5000/api/accounts/' + encodeURIComponent(user)); return await response.json(); } catch (error) { return { error: error.message || 'Unknown error' }; } } ``` **Hii msimbo unafanikisha:** - **Inatumia** API ya kisasa ya `fetch` kupata data kwa njia isiyo ya wazi - **Inajenga** ombi la GET na parameter ya jina la mtumiaji - **Inatumia** `encodeURIComponent()` kushughulikia usalama wa herufi maalum kwenye URLs - **Inageuza** jibu kuwa fomati ya JSON kwa urahisi wa kusindika data - **Inashughulikia** makosa kwa upole kwa kurudisha kitu cha kosa badala ya kusababisha hitilafu > ⚠️ **Kumbuka Usalama**: Kazi ya `encodeURIComponent()` hushughulikia herufi maalum kwenye URLs. Kama mifumo ya usimbaji inayotumika katika mawasiliano ya majini, huhakikisha ujumbe wako unafika kama ulivyokusudishwa, kuzuia herufi kama "#" au "&" kutafsiriwa vibaya. > **Kwa nini hii ni muhimu:** - Inazuia herufi maalum kuvunja URLs - Inalinda dhidi ya mashambulizi ya uchezaji URLs - Inahakikisha seva yako inapata data iliyo kusudiwa - Inafuata mbinu salama za kuandika msimbo #### Kuelewa Maombi ya HTTP GET Hapa kuna kitu ambacho kinaweza kukushangaza: wakati unatumia `fetch` bila chaguzi zozote, inajenga moja kwa moja ombi la [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET). Hii ni kamili kwa tunachofanya - kuomba seva "hebu, naweza kuona data za akaunti ya mtumiaji huyu?" Fikiria maombi ya GET kama kuuliza kwa heshima kukopa kitabu maktaba - unatoa ombi la kuona kitu ambacho tayari kipo. Maombi ya POST (tulitumia kwa usajili) ni zaidi kama kuwasilisha kitabu kipya ili kuongezwa kwenye maktaba. | OMBI LA GET | OMBI LA POST | |-------------|-------------| | **Madhumuni** | Kupata data iliyopo | Kutuma data mpya kwa seva | | **Vigezo** | Katika URL/kiungo cha uchunguzi | Katika mwili wa ombi | | **Kuhifadhi Cache** | Inaweza kuhifadhiwa na vivinjari | Huu siyo kawaida kuhifadhiwa | | **Usalama** | Inaonekana katika URL/rekodi | Imefichwa mwilini mwa ombi | ```mermaid sequenceDiagram participant B as Browser participant S as Server Note over B,S: Ombi la GET (Kupata Data) B->>S: GET /api/accounts/test S-->>B: 200 OK + Data ya Akaunti Note over B,S: Ombi la POST (Kuwasilisha Data) B->>S: POST /api/accounts + Data Mpya ya Akaunti S-->>B: 201 Created + Thibitisho Note over B,S: Usimamizi wa Makosa B->>S: GET /api/accounts/nonexistent S-->>B: 404 Not Found + Ujumbe wa Hitilafu ``` #### Hatua ya 3: Kuleta Kila Kitu Pamoja Sasa sehemu ya kuridhisha - tuchanganye kazi yako ya kupata akaunti na mchakato wa kuingia. Hapa ndipo kila kitu kinapoungana: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; const data = await getAccount(user); if (data.error) { return console.log('loginError', data.error); } account = data; navigate('/dashboard'); } ``` Kazi hii inafuata mfuatano wazi: - Tolea jina la mtumiaji kutoka kwenye fomu - Ombwa data ya akaunti ya mtumiaji kutoka seva - Shughulikia makosa yoyote yanayotokea wakati wa mchakato - Hifadhi data za akaunti na uelekezwe kwenye dashibodi baada ya mafanikio > 🎯 **Mfumo wa Async/Await**: Kwa kuwa `getAccount` ni kazi isiyo ya mara moja (asynchronous), tunatumia neno `await` kusimamisha utekelezaji hadi seva itakapojibu. Hii inazuia msimbo kuendelea na data isiyo wazi. #### Hatua ya 4: Tengeneza Mahali pa Kuhifadhi Data Yako Programu yako inahitaji mahali pa kukumbuka taarifa za akaunti mara baada ya kupakiwa. Fikiria hii kama kumbukumbu ya muda mfupi ya programu yako - mahali pa kuweka data za mtumiaji wa sasa uwezo. Ongeza mstari huu juu ya faili yako `app.js`: ```javascript // Hii ina data za akaunti za mtumiaji wa sasa let account = null; ``` **Kwa nini tunahitaji hili:** - Hufanya data za akaunti zipatikane kutoka sehemu yoyote ya programu yako - Kuanzia na `null` inamaanisha "hakuna aliyelogin bado" - Inasasishwa mtu anapofanikisha kuingia au kusajiliwa - Inatumika kama chanzo kimoja cha ukweli - hakuna mkanganyiko kuhusu nani ameingia #### Hatua ya 5: Unganisha Fomu Yako Sasa tuunganishie kazi yako mpya ya kuingia kwenye fomu ya HTML. Sasisha lebo la fomu kama hii: ```html
``` **Mabadiliko haya madogo hufanya:** - Kusimamisha fomu kufanya tabia yake ya kawaida ya kupakia ukurasa mzima upya - Kupigia simu kazi yako ya JavaScript badala yake - Kuacha kila kitu kiende vizuri kama programu ya ukurasa mmoja - Kukupa ushawishi kamili juu ya kinachotokea mtumiaji anakabidhi "Login" #### Hatua ya 6: Boresheni Kazi Yako ya Usajili Kwa usawa, sasisha kazi yako ya `register` kuhifadhi data za akaunti na kupeleka dashibodi pia: ```javascript // Ongeza mistari hii mwishoni mwa kazi yako ya kusajili account = result; navigate('/dashboard'); ``` **Uboreshaji huu unatoa:** - **Mabadiliko yasiyo na mshono** kutoka usajili hadi dashibodi - **Uzoefu thabiti** wa mtumiaji kati ya mchakato wa kuingia na usajili - **Ufikiaji wa papo hapo** wa data za akaunti baada ya usajili kufanikiwa #### Jaribu Utekelezaji Wako ```mermaid flowchart TD A[Mtumiaji aingize nywila] --> B[Kifanyi kazi cha Kuingia kimeitwa] B --> C[Pata data ya akaunti kutoka seva] C --> D{Data imepokelewa kwa mafanikio?} D -->|Ndiyo| E[Hifadhi data ya akaunti ulimwenguni] D -->|Hapana| F[Onyesha ujumbe wa kosa] E --> G[Elekea kwenye dashibodi] F --> H[Mtumiaji abaki kwenye ukurasa wa kuingia] ``` **Ni wakati wa kujaribu:** 1. Unda akaunti mpya kuhakikisha kila kitu kinafanya kazi 2. Jaribu kuingia kwa kutumia taarifa hizo za akaunti 3. Angalia konsole ya kivinjari chako (F12) kama kuna kitu kinachoonekana tofauti 4. Hakikisha unafika kwenye dashibodi baada ya kuingia kwa mafanikio Kama kitu hakifanyi kazi, usijali! Flaws nyingi ni marekebisho rahisi kama makosa ya tahajia au kusahau kuanzisha seva ya API. #### Neno Fupi Kuhusu Uchawi wa Cross-Origin Unaweza kujiuliza: "Je, programu yangu ya wavuti inazungumzaje na seva hii ya API wakati zinaendesha kwenye port tofauti?" Swali zuri! Hii inahusiana na jambo ambalo kila mtengenezaji wa wavuti hukumbana nalo hatimaye. > πŸ”’ **Usalama wa Cross-Origin**: Vivinjari hutekeleza sera ya "asili sawa" kuzuia mawasiliano yasiyoruhusiwa kati ya maeneo tofauti. Kama mfumo wa mizingatio katika Pentagon, huhakikisha mawasiliano yanaruhusiwa kabla ya kuruhusu usafirishaji wa data. > **Katika usanidi wetu:** - Programu yako ya wavuti inaendesha kwenye `localhost:3000` (seva ya maendeleo) - Seva yako ya API inaendesha kwenye `localhost:5000` (seva ya backend) - Seva ya API inaongeza [vichwa vya CORS](https://developer.mozilla.org/docs/Web/HTTP/CORS) vinavyoelezea moja kwa moja mawasiliano kutoka programu yako ya wavuti Usanidi huu unaendana na maendeleo halisi ambapo programu za mbele na nyuma kawaida huendesha kwenye seva tofauti. > πŸ“š **Jifunze Zaidi**: Jiingize zaidi katika APIs na kupata data kwa kutumia somo hili kamili la [Microsoft Learn kuhusu APIs](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon). ## Kuleta Data Yako Kuwa Hai Katika HTML Sasa tutafanya data tuliyopata ionekane kwa watumiaji kupitia usimamizi wa DOM. Kama mchakato wa kukuza picha katika chumba cha giza, tunachukua data isiyoonekana na kuitengeneza kuwa kitu watumiaji wanaweza kuona na kuingiliana nacho. Manipuli ya DOM ni mbinu inayobadilisha kurasa za wavuti zisizobadilika kuwa programu zinazobadilika zinazosasisha yaliyomo yao kulingana na mwingiliano wa mtumiaji na majibu ya seva. ### Kuchagua Chombo Sahihi kwa Kazi Linapokuja suala la kusasisha HTML yako kwa JavaScript, una chaguzi kadhaa. Fikiria hizi kama zana tofauti kwenye sanduku la zana - kila moja ni nzuri kwa kazi maalum: | Njia | Inafaa kwa ajili ya nini | Lini uitumie | Kiwango cha usalama | |--------|---------------------|----------------|--------------| | `textContent` | Kuonyesha data ya mtumiaji kwa usalama | Wakati wowote unapoweka maandishi | βœ… Imara kabisa | | `createElement()` + `append()` | Kujenga mipangilio tata | Kuunda sehemu/mpangilio mpya | βœ… Salama kabisa | | `innerHTML` | Kuweka yaliyomo ya HTML | ⚠️ Jitahidi kuepuka hii | ❌ Kazi yenye hatari | #### Njia Salama ya Kuweka Maandishi: textContent Mali ya [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) ni rafiki yako mkubwa unapoonyesha data ya mtumiaji. Ni kama kuwa na mlinda lango kwa ukurasa wako wa wavuti - hakuna kitu kibaya kinachopitishwa: ```javascript // Njia salama, ya kuaminika ya kusasisha maandishi const balanceElement = document.getElementById('balance'); balanceElement.textContent = account.balance; ``` **Manufaa ya textContent:** - Huhandle kila kitu kama maandishi ya kawaida (hutazuia utekelezaji wa skiripti) - Hufuta yaliyokuwepo awali kwa moja kwa moja - Inafaa kwa masasisho ya maandishi rahisi - Hutoa usalama wa ndani dhidi ya yaliyomo yenye madhara #### Kuunda Vipengele vya HTML Vinavyobadilika Kwa yaliyomo tata zaidi, ungana [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) na njia ya [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append): ```javascript // Njia salama ya kuunda vipengele vipya const transactionItem = document.createElement('div'); transactionItem.className = 'transaction-item'; transactionItem.textContent = `${transaction.date}: ${transaction.description}`; container.append(transactionItem); ``` **Kuelewa mbinu hii:** - **Hundi** vipengele vipya vya DOM kwa programu - **Inadumisha** udhibiti kamili wa sifa za kipengele na yaliyomo - **Inaruhusu** muundo tata wa vipengele vilivyo ndani ya vingine - **Inahifadhi** usalama kwa kutenganisha muundo na yaliyomo > ⚠️ **Kuzingatia Usalama**: Ingawa [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) huonekana katika mafunzo mengi, inaweza kuendesha skiripti zenye nyongeza ndani. Kama taratibu za usalama CERN zinazozuia utekelezaji wa msimbo usioruhusiwa, kutumia `textContent` na `createElement` ni mbadala salama zaidi. > **Hatari za innerHTML:** - Huitekeleza yoyote `