<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Doniyor</title><subtitle>27 y.o Senior Frontend developer at Uzum Technologies with 6+ years of experience. Posting some good frontend stuff on t.me/peaceofcode.</subtitle><author><name>Doniyor</name></author><id>https://teletype.in/atom/dyusupov</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/dyusupov?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@dyusupov?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=dyusupov"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/dyusupov?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-21T06:41:59.247Z</updated><entry><id>dyusupov:vue3-watchers</id><link rel="alternate" type="text/html" href="https://teletype.in/@dyusupov/vue3-watchers?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=dyusupov"></link><title>Vue 3 da watch methodi</title><published>2024-11-24T19:34:13.839Z</published><updated>2024-11-24T19:34:13.839Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/09/60/0960b6fc-99eb-4213-a9b1-47eb5204b0b4.png"></media:thumbnail><category term="vue" label="Vue"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/db/51/db51183b-c75b-4332-8f2e-86ef7748e5d6.png&quot;&gt;Vue 3 Watchers</summary><content type="html">
  &lt;figure id=&quot;Cxcc&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9c/8f/9c8fc37e-2f73-49bd-b1c5-97a63f8ca197.png&quot; width=&quot;1418&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;q4sj&quot;&gt;watch() metodi reaktiv ma&amp;#x27;lumotlardagi o&amp;#x27;zgarishlarni kuzatish va ularga javob qaytarish uchun ishlatiladi. Bu metod quyidagi asosiy xususiyatlarga ega:&lt;/p&gt;
  &lt;h2 id=&quot;QAjo&quot;&gt;Asosiy xususiyatlari&lt;/h2&gt;
  &lt;ol id=&quot;H4ZU&quot;&gt;
    &lt;li id=&quot;Ef7Z&quot;&gt;Side Effects: Reactive data o&amp;#x27;zgarganda side effect&amp;#x27;larni bajarish imkonini beradi&lt;/li&gt;
    &lt;li id=&quot;fxlF&quot;&gt;Async Operations: Async operatsiyalarni bajarish imkoniyati&lt;/li&gt;
    &lt;li id=&quot;Yc9M&quot;&gt;Control: Watching boshlanishi va to&amp;#x27;xtatilishini nazorat qilish&lt;/li&gt;
    &lt;li id=&quot;B1Dy&quot;&gt;Deep watching: Obyektlarni chuqur kuzatish imkoniyati&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;ZbXg&quot;&gt;Basic Usage&lt;/h2&gt;
  &lt;pre id=&quot;pSiL&quot; data-lang=&quot;typescript&quot;&gt;import { ref, watch } from &amp;#x27;vue&amp;#x27;

const searchQuery = ref(&amp;#x27;&amp;#x27;)
const searchResults = ref([])

// Basic watcher
watch(searchQuery, async (newQuery, oldQuery) =&amp;gt; {
  if (newQuery.trim()) {
    const results = await fetchSearchResults(newQuery)
    searchResults.value = results
  } else {
    searchResults.value = []
  }
})&lt;/pre&gt;
  &lt;h2 id=&quot;OxyR&quot;&gt;Multiple Sources&lt;/h2&gt;
  &lt;p id=&quot;UUMd&quot;&gt;Bir nechta source&amp;#x27;larni kuzatish mumkin:&lt;/p&gt;
  &lt;pre id=&quot;G8gQ&quot; data-lang=&quot;typescript&quot;&gt;const firstName = ref(&amp;#x27;John&amp;#x27;)
const lastName = ref(&amp;#x27;Doe&amp;#x27;)

watch([firstName, lastName], ([newFirst, newLast], [oldFirst, oldLast]) =&amp;gt; {
  console.log(&amp;#x60;Name changed from ${oldFirst} ${oldLast} to ${newFirst} ${newLast}&amp;#x60;)
})&lt;/pre&gt;
  &lt;h2 id=&quot;wJdd&quot;&gt;Deep Watching&lt;/h2&gt;
  &lt;p id=&quot;DD4l&quot;&gt;Obyekt ichidagi o&amp;#x27;zgarishlarni ham kuzatish:&lt;/p&gt;
  &lt;pre id=&quot;hcbN&quot; data-lang=&quot;typescript&quot;&gt;const user = reactive({
  name: &amp;#x27;John&amp;#x27;,
  profile: {
    age: 25,
    city: &amp;#x27;Tashkent&amp;#x27;
  }
})

// Deep watcher
watch(user, (newValue, oldValue) =&amp;gt; {
  console.log(&amp;#x27;User data changed:&amp;#x27;, newValue)
}, { deep: true })&lt;/pre&gt;
  &lt;h2 id=&quot;0EfF&quot;&gt;Immediate Watching&lt;/h2&gt;
  &lt;p id=&quot;LTqx&quot;&gt;Watcher ni darhol ishga tushirish:&lt;/p&gt;
  &lt;pre id=&quot;AY4W&quot; data-lang=&quot;typescript&quot;&gt;const todoId = ref(1)
const todoData = ref(null)

watch(todoId, async (newId) =&amp;gt; {
  todoData.value = await fetchTodo(newId)
}, { immediate: true })&lt;/pre&gt;
  &lt;h2 id=&quot;J4mK&quot;&gt;Watch vs watchEffect&lt;/h2&gt;
  &lt;p id=&quot;v0AM&quot;&gt;Vue 3 da ikkita watching mexanizmi mavjud:&lt;/p&gt;
  &lt;h3 id=&quot;YJ7X&quot;&gt;watch&lt;/h3&gt;
  &lt;ul id=&quot;i3sM&quot;&gt;
    &lt;li id=&quot;JD1E&quot;&gt;Aniq source va callback bilan ishlaydi&lt;/li&gt;
    &lt;li id=&quot;gG34&quot;&gt;Old va new qiymatlarni taqdim etadi&lt;/li&gt;
    &lt;li id=&quot;Yx4h&quot;&gt;Watching qachon ishga tushishini nazorat qilish mumkin&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;5djS&quot; data-lang=&quot;typescript&quot;&gt;const counter = ref(0)
watch(counter, (newValue, oldValue) =&amp;gt; {
  console.log(&amp;#x60;Counter changed from ${oldValue} to ${newValue}&amp;#x60;)
})&lt;/pre&gt;
  &lt;h3 id=&quot;V9or&quot;&gt;watchEffect&lt;/h3&gt;
  &lt;ul id=&quot;CJfx&quot;&gt;
    &lt;li id=&quot;GFUJ&quot;&gt;Avtomatik ravishda dependency&amp;#x27;larni kuzatadi&lt;/li&gt;
    &lt;li id=&quot;zGhq&quot;&gt;Callback ichida ishlatilgan har qanday reactive value o&amp;#x27;zgarganda ishga tushadi&lt;/li&gt;
    &lt;li id=&quot;JSyC&quot;&gt;Darhol ishga tushadi&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;9txc&quot; data-lang=&quot;typescript&quot;&gt;const todos = ref([])
const error = ref(null)

watchEffect(async () =&amp;gt; {
  try {
    todos.value = await fetchTodos()
  } catch (e) {
    error.value = e
  }
})&lt;/pre&gt;
  &lt;h2 id=&quot;1t1P&quot;&gt;Stop Watching&lt;/h2&gt;
  &lt;p id=&quot;h1ww&quot;&gt;Watcher&amp;#x27;ni to&amp;#x27;xtatish:&lt;/p&gt;
  &lt;pre id=&quot;ZRCg&quot; data-lang=&quot;typescript&quot;&gt;const stop = watch(source, callback)
// Kerak bo&amp;#x27;lganda
stop()&lt;/pre&gt;
  &lt;h2 id=&quot;T91Y&quot;&gt;Best Practices&lt;/h2&gt;
  &lt;ol id=&quot;qnT6&quot;&gt;
    &lt;li id=&quot;LMoK&quot;&gt;&lt;strong&gt;Cleanup function ishlatish&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;tpF8&quot; data-lang=&quot;typescript&quot;&gt;watch(id, async (newId, oldId, onCleanup) =&amp;gt; {
  const { response, cancel } = doAsyncWork(newId)
  
  // Agar yangi watcher ishga tushsa, oldingi requestni bekor qilish
  onCleanup(() =&amp;gt; cancel())
  
  data.value = await response
})&lt;/pre&gt;
  &lt;ol id=&quot;am72&quot;&gt;
    &lt;li id=&quot;QSFh&quot;&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;yu2E&quot; data-lang=&quot;typescript&quot;&gt;watch(source, async (value) =&amp;gt; {
  try {
    await someAsyncOperation()
  } catch (error) {
    console.error(&amp;#x27;Error in watcher:&amp;#x27;, error)
  }
})&lt;/pre&gt;
  &lt;ol id=&quot;ATF0&quot;&gt;
    &lt;li id=&quot;EUpA&quot;&gt;&lt;strong&gt;Debouncing&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;OQO9&quot; data-lang=&quot;typescript&quot;&gt;import { debounce } from &amp;#x27;lodash&amp;#x27;

const debouncedWatch = watch(searchInput, debounce((value) =&amp;gt; {
  // Search logic here
}, 300))&lt;/pre&gt;
  &lt;h2 id=&quot;xE1C&quot;&gt;&lt;br /&gt;Anti-patterns va Ogohlantirishlar&lt;/h2&gt;
  &lt;h3 id=&quot;JrSl&quot;&gt;1. Computed property o&amp;#x27;rniga watch ishlatish&lt;/h3&gt;
  &lt;pre id=&quot;v1gz&quot; data-lang=&quot;typescript&quot;&gt;// ❌ Yomon
watch([firstName, lastName], ([first, last]) =&amp;gt; {
  fullName.value = &amp;#x60;${first} ${last}&amp;#x60;
})

// ✅ Yaxshi
const fullName = computed(() =&amp;gt; &amp;#x60;${firstName.value} ${lastName.value}&amp;#x60;)&lt;/pre&gt;
  &lt;p id=&quot;7eZd&quot;&gt;&lt;strong&gt;Nega bu anti-pattern?&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;YLeX&quot;&gt;
    &lt;li id=&quot;S02b&quot;&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Watch har doim callback funksiyani to&amp;#x27;liq bajaradi, computed esa keshlanadi va faqat dependency o&amp;#x27;zgargandagina qayta hisoblanadi&lt;/li&gt;
    &lt;li id=&quot;aNll&quot;&gt;&lt;strong&gt;Code readability&lt;/strong&gt;: Computed aniq ko&amp;#x27;rsatadiki bu yangi value hisoblanmoqda. Watch esa side-effect uchun mo&amp;#x27;ljallangan&lt;/li&gt;
    &lt;li id=&quot;FBxb&quot;&gt;&lt;strong&gt;Debugging&lt;/strong&gt;: Computed bilan value qayerdan kelayotganini kuzatish osonroq&lt;/li&gt;
    &lt;li id=&quot;GM30&quot;&gt;&lt;strong&gt;Testing&lt;/strong&gt;: Computed propertylarni test qilish osonroq chunki ular pure function&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;oaEk&quot;&gt;2. Bir watcher ichida ko&amp;#x27;p vazifalarni bajarish&lt;/h3&gt;
  &lt;pre id=&quot;2xuD&quot; data-lang=&quot;stylus&quot;&gt;// ❌ Yomon
watch(user, () =&amp;gt; {
  updateProfile()
  sendAnalytics()
  refreshUI()
  loadRelatedData()
})

// ✅ Yaxshi - Alohida watcherlar
watch(user, updateProfile)
watch(user, sendAnalytics)
watch(user, refreshUI)
watch(user, loadRelatedData)&lt;/pre&gt;
  &lt;p id=&quot;aYOd&quot;&gt;&lt;strong&gt;Nega bu anti-pattern?&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;xfmX&quot;&gt;
    &lt;li id=&quot;3PPZ&quot;&gt;&lt;strong&gt;Maintainability&lt;/strong&gt;: Har bir watcher alohida mas&amp;#x27;uliyatga ega bo&amp;#x27;lishi kerak (Single Responsibility Principle)&lt;/li&gt;
    &lt;li id=&quot;QeHW&quot;&gt;&lt;strong&gt;Error handling&lt;/strong&gt;: Bitta funksiyada xato chiqsa, boshqa funksiyalar ham ishlamay qoladi&lt;/li&gt;
    &lt;li id=&quot;C4dA&quot;&gt;&lt;strong&gt;Testing&lt;/strong&gt;: Ko&amp;#x27;p vazifali watcherni test qilish murakkab&lt;/li&gt;
    &lt;li id=&quot;BLzi&quot;&gt;&lt;strong&gt;Debug qilish&lt;/strong&gt;: Xato qaysi operatsiyada yuz berganini aniqlash qiyin&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;NgpE&quot;&gt;3. Watch ichida reactive data o&amp;#x27;zgartirish&lt;/h3&gt;
  &lt;pre id=&quot;wqeQ&quot; data-lang=&quot;typescript&quot;&gt;// ❌ Yomon
watch(count, (newCount) =&amp;gt; {
  anotherCount.value = newCount * 2
})

// ✅ Yaxshi
const anotherCount = computed(() =&amp;gt; count.value * 2)&lt;/pre&gt;
  &lt;p id=&quot;7UYW&quot;&gt;&lt;strong&gt;Nega bu anti-pattern?&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;28yl&quot;&gt;
    &lt;li id=&quot;EOd7&quot;&gt;&lt;strong&gt;Infinite loop xavfi&lt;/strong&gt;: Agar watched value watcherni ichida o&amp;#x27;zgartirilsa, infinite loop yuzaga kelishi mumkin&lt;/li&gt;
    &lt;li id=&quot;esoa&quot;&gt;&lt;strong&gt;State management murakkabligi&lt;/strong&gt;: Reactive datani bir necha joyda o&amp;#x27;zgartirish debug qilishni qiyinlashtiradi&lt;/li&gt;
    &lt;li id=&quot;6vuT&quot;&gt;&lt;strong&gt;Vue&amp;#x27;ning reaktivlik tizimidan noto&amp;#x27;g&amp;#x27;ri foydalanish&lt;/strong&gt;: Bu vazifa computed property uchun mo&amp;#x27;ljallangan&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;VSV9&quot;&gt;4. Watcherda og&amp;#x27;ir operatsiyalarni to&amp;#x27;g&amp;#x27;ridan-to&amp;#x27;g&amp;#x27;ri bajarish&lt;/h3&gt;
  &lt;pre id=&quot;wX1p&quot; data-lang=&quot;typescript&quot;&gt;// ❌ Yomon
watch(searchQuery, (query) =&amp;gt; {
  const results = heavyComputation(query)
  searchResults.value = results
})

// ✅ Yaxshi
watch(searchQuery, debounce(async (query) =&amp;gt; {
  const results = await heavyComputation(query)
  searchResults.value = results
}, 300))&lt;/pre&gt;
  &lt;p id=&quot;xjkY&quot;&gt;&lt;strong&gt;Nega bu anti-pattern?&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;1xHV&quot;&gt;
    &lt;li id=&quot;ZN6D&quot;&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Har bir o&amp;#x27;zgarishda og&amp;#x27;ir hisob-kitoblar UI ni sekinlashtiradi&lt;/li&gt;
    &lt;li id=&quot;fmCZ&quot;&gt;&lt;strong&gt;User Experience&lt;/strong&gt;: Foydalanuvchi kiritayotgan vaqtda ham hisob-kitoblar amalga oshiriladi&lt;/li&gt;
    &lt;li id=&quot;S1pq&quot;&gt;&lt;strong&gt;Resource usage&lt;/strong&gt;: Keraksiz hisob-kitoblar tizim resurslarini behuda sarflaydi&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;xprL&quot;&gt;5. Deep watching ni keraksiz ishlatish&lt;/h3&gt;
  &lt;pre id=&quot;AibQ&quot; data-lang=&quot;typescript&quot;&gt;// ❌ Yomon
watch(complexObject, (newVal) =&amp;gt; {
  // Something with newVal
}, { deep: true })

// ✅ Yaxshi - Faqat kerakli propertyni kuzatish
watch(() =&amp;gt; complexObject.specificProperty, (newVal) =&amp;gt; {
  // Something with newVal
})&lt;/pre&gt;
  &lt;p id=&quot;Aej8&quot;&gt;&lt;strong&gt;Nega bu anti-pattern?&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;rzaX&quot;&gt;
    &lt;li id=&quot;4RA2&quot;&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Deep watching katta obyektlar uchun sezilarli performance yo&amp;#x27;qotishga olib keladi&lt;/li&gt;
    &lt;li id=&quot;k6KQ&quot;&gt;&lt;strong&gt;Unnecessary updates&lt;/strong&gt;: Keraksiz propertylar o&amp;#x27;zgarganda ham watcher ishga tushadi&lt;/li&gt;
    &lt;li id=&quot;ezy3&quot;&gt;&lt;strong&gt;Memory usage&lt;/strong&gt;: Vue har bir property uchun reactive wrapper yaratishi kerak bo&amp;#x27;ladi&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;pibR&quot;&gt;6. watchEffect ichida async operatsiyalarni noto&amp;#x27;g&amp;#x27;ri boshqarish&lt;/h3&gt;
  &lt;pre id=&quot;nxK3&quot; data-lang=&quot;typescript&quot;&gt;// ❌ Yomon
watchEffect(async () =&amp;gt; {
  const data = await fetchData()
  results.value = data
})

// ✅ Yaxshi
watchEffect((onCleanup) =&amp;gt; {
  const controller = new AbortController()
  onCleanup(() =&amp;gt; controller.abort())
  
  fetchData({ signal: controller.signal })
    .then(data =&amp;gt; {
      results.value = data
    })
})&lt;/pre&gt;
  &lt;p id=&quot;1MOp&quot;&gt;&lt;strong&gt;Nega bu anti-pattern?&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;wxl3&quot;&gt;
    &lt;li id=&quot;jAy7&quot;&gt;&lt;strong&gt;Race conditions&lt;/strong&gt;: Oldingi request tugatilmasdan yangi request boshlanishi mumkin&lt;/li&gt;
    &lt;li id=&quot;w4o9&quot;&gt;&lt;strong&gt;Memory leaks&lt;/strong&gt;: Cleanup funksiyasisiz eskii requestlar to&amp;#x27;planib qolishi mumkin&lt;/li&gt;
    &lt;li id=&quot;QmJI&quot;&gt;&lt;strong&gt;State inconsistency&lt;/strong&gt;: Natijalar noto&amp;#x27;g&amp;#x27;ri tartibda kelishi mumkin&lt;br /&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;ArMi&quot;&gt;Best Practice Recommendations&lt;/h2&gt;
  &lt;ol id=&quot;ocka&quot;&gt;
    &lt;li id=&quot;xowC&quot;&gt;&lt;strong&gt;Watch o&amp;#x27;rniga computed ishlatish mumkin bo&amp;#x27;lgan holatlarni aniqlang&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;yYtb&quot;&gt;
      &lt;li id=&quot;qH96&quot;&gt;Agar yangi value hisoblash kerak bo&amp;#x27;lsa - computed ishlating&lt;/li&gt;
      &lt;li id=&quot;DcJb&quot;&gt;Agar side-effect (API call, DOM manipulation) kerak bo&amp;#x27;lsa - watch ishlating&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;cTV2&quot;&gt;&lt;strong&gt;Watcherlarni kichik va aniq vazifalar uchun ajrating&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;ZMOa&quot;&gt;
      &lt;li id=&quot;QPAl&quot;&gt;Har bir watcher bitta vazifani bajarsin&lt;/li&gt;
      &lt;li id=&quot;uopP&quot;&gt;Vazifalar bir-biriga bog&amp;#x27;liq bo&amp;#x27;lsa, alohida composable funksiya yarating&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;RkdX&quot;&gt;&lt;strong&gt;Async operatsiyalar uchun cleanup ishlatishni unutmang&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;D0T3&quot;&gt;
      &lt;li id=&quot;KT13&quot;&gt;Race conditionlardan qochish uchun&lt;/li&gt;
      &lt;li id=&quot;Ab4V&quot;&gt;Memory leaklarni oldini olish uchun&lt;/li&gt;
      &lt;li id=&quot;7qVN&quot;&gt;Network requestlarni to&amp;#x27;g&amp;#x27;ri boshqarish uchun&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;cH0X&quot;&gt;&lt;strong&gt;Watch va watchEffect ni to&amp;#x27;g&amp;#x27;ri tanlang&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;vZk8&quot;&gt;
      &lt;li id=&quot;AUol&quot;&gt;Watch - aniq dependency va old/new value kerak bo&amp;#x27;lganda&lt;/li&gt;
      &lt;li id=&quot;XB3j&quot;&gt;watchEffect - dependency avtomatik aniqlanishi kerak bo&amp;#x27;lganda&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;5g4q&quot;&gt;&lt;strong&gt;Performance optimizatsiyasi&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;9W26&quot;&gt;
      &lt;li id=&quot;fPdt&quot;&gt;Deep watching o&amp;#x27;rniga specific propertylarni kuzating&lt;/li&gt;
      &lt;li id=&quot;3Gjj&quot;&gt;Debounce/throttle qo&amp;#x27;llang&lt;/li&gt;
      &lt;li id=&quot;BRru&quot;&gt;Og&amp;#x27;ir operatsiyalarni optimize qiling&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;gKB8&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;kfny&quot;&gt;Hozircha shu, keyingi postlarda ko&amp;#x27;rishguncha. Stay tuned...&lt;br /&gt;&lt;a href=&quot;https://t.me/peaceofcode&quot; target=&quot;_blank&quot;&gt;@peaceofcode&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>dyusupov:vue-computed</id><link rel="alternate" type="text/html" href="https://teletype.in/@dyusupov/vue-computed?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=dyusupov"></link><title>Computed properties</title><published>2024-08-27T11:15:12.332Z</published><updated>2024-08-27T11:23:37.216Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/8c/07/8c076fd0-9812-4d3c-8b67-43d15d48ec1e.png"></media:thumbnail><category term="vue" label="Vue"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/30/1b/301b9591-b27e-419a-b9e7-2704d7c2b78a.jpeg&quot;&gt;computed() method reaktiv va kuzatuvchan xususiyatlarni yaratish uchun ishlatiladi. Bu metod quyidagi asosiy xususiyatlarga ega:</summary><content type="html">
  &lt;figure id=&quot;6uWi&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/1b/301b9591-b27e-419a-b9e7-2704d7c2b78a.jpeg&quot; width=&quot;1260&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;KL7e&quot;&gt;&lt;code&gt;computed()&lt;/code&gt; method reaktiv va kuzatuvchan xususiyatlarni yaratish uchun ishlatiladi. Bu metod quyidagi asosiy xususiyatlarga ega:&lt;/p&gt;
  &lt;ol id=&quot;LpjO&quot;&gt;
    &lt;li id=&quot;5z5c&quot;&gt;Create aggregate value: Boshqa reaktiv ma&amp;#x27;lumotlarga asoslangan qiymatlarni hisoblaydi.&lt;/li&gt;
    &lt;li id=&quot;RE7w&quot;&gt;Caching: Natijani keshlashtiradi va faqat bog&amp;#x27;liq ma&amp;#x27;lumotlar o&amp;#x27;zgargandagina qayta hisoblaydi.&lt;/li&gt;
    &lt;li id=&quot;ID49&quot;&gt;Getter function: &lt;code&gt;computed()&lt;/code&gt; ga uzatiladigan funksiya getter sifatida ishlaydi.&lt;/li&gt;
    &lt;li id=&quot;fAgN&quot;&gt;Reactivity: Hisoblangan xususiyat o&amp;#x27;zgarsa, undan foydalanuvchi komponentlar avtomatik ravishda yangilanadi.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;fUh1&quot;&gt;Create aggregated value&lt;/h3&gt;
  &lt;pre id=&quot;H1Sv&quot; data-lang=&quot;javascript&quot;&gt;import { computed, ref } from &amp;#x27;vue&amp;#x27;

const user = reactive({
  firstName: &amp;#x27;Doniyor&amp;#x27;,
  lastName: &amp;#x27;Yusupov&amp;#x27;,
  status: 1
})

const statusMap = {
 0: &amp;#x27;Created&amp;#x27;,
 1: &amp;#x27;Verified&amp;#x27;
}

const fullName = computed(() =&amp;gt; &amp;#x60;${user.firstName} ${user.lastName}&amp;#x60;) // Doniyor Yusupov

const userStatus = computed(() =&amp;gt; statusMap[user.status]) // &amp;#x27;Verified&amp;#x27;&lt;/pre&gt;
  &lt;p id=&quot;ppGl&quot;&gt;Bu Create aggregate value uchun misol edi. Ya&amp;#x27;ni bir reactive object dan bir nechta reactive object larni create qilishimiz mumkin.&lt;/p&gt;
  &lt;p id=&quot;4hie&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;BTFi&quot;&gt;Caching&lt;/h3&gt;
  &lt;pre id=&quot;XZDb&quot; data-lang=&quot;javascript&quot;&gt;import { ref, computed } from &amp;#x27;vue&amp;#x27;

const numbers = ref(Array.from({ length: 10000 }, (_, i) =&amp;gt; i + 1))
const searchTerm = ref(&amp;#x27;&amp;#x27;)

const filteredAndSortedNumbers = computed(() =&amp;gt; {
  return numbers.value
    .filter(num =&amp;gt; num.toString().includes(searchTerm.value))
    .sort((a, b) =&amp;gt; b - a)
    .slice(0, 100)
})

function useNumbers() {
  function updateSearchTerm(newTerm) {
    searchTerm.value = newTerm
  }

  return {
    filteredAndSortedNumbers,
    updateSearchTerm
  }
}
&lt;/pre&gt;
  &lt;pre id=&quot;0jWA&quot; data-lang=&quot;html&quot;&gt;&amp;lt;template&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;input v-model=&amp;quot;searchTerm&amp;quot; @input=&amp;quot;updateSearchTerm&amp;quot; placeholder=&amp;quot;Qidirish&amp;quot;&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;li v-for=&amp;quot;num in filteredAndSortedNumbers&amp;quot; :key=&amp;quot;num&amp;quot;&amp;gt;{{ num }}&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    ...
    &amp;lt;ul&amp;gt;
      &amp;lt;li v-for=&amp;quot;num in filteredAndSortedNumbers&amp;quot; :key=&amp;quot;num&amp;quot;&amp;gt;{{ num }}&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup&amp;gt;
const { filteredAndSortedNumbers, updateSearchTerm } = useNumbers()
&amp;lt;/script&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;lha4&quot;&gt;Bu misolda:&lt;/p&gt;
  &lt;ol id=&quot;6kSd&quot;&gt;
    &lt;li id=&quot;xUMN&quot;&gt;&lt;code&gt;numbers&lt;/code&gt; - 10,000 ta elementdan iborat katta massiv.&lt;/li&gt;
    &lt;li id=&quot;hnb6&quot;&gt;&lt;code&gt;searchTerm&lt;/code&gt; - foydalanuvchi kiritadigan qidiruv so&amp;#x27;zi.&lt;/li&gt;
    &lt;li id=&quot;W9Jc&quot;&gt;&lt;code&gt;filteredAndSortedNumbers&lt;/code&gt; - hisoblangan xususiyat bo&amp;#x27;lib, u quyidagi amallarni bajaradi:&lt;/li&gt;
    &lt;ul id=&quot;unIO&quot;&gt;
      &lt;li id=&quot;U8nC&quot;&gt;Massivni filtrlaydi&lt;/li&gt;
      &lt;li id=&quot;USAb&quot;&gt;Teskari tartibda saralaydi&lt;/li&gt;
      &lt;li id=&quot;vGGG&quot;&gt;Natijadan faqat birinchi 100 ta elementni oladi&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;XvGj&quot;&gt;Keshlashtirish afzalligi:&lt;/p&gt;
  &lt;ol id=&quot;JkYY&quot;&gt;
    &lt;li id=&quot;lqvH&quot;&gt;Samaradorlik: &lt;code&gt;filteredAndSortedNumbers&lt;/code&gt; faqat &lt;code&gt;numbers&lt;/code&gt; yoki &lt;code&gt;searchTerm&lt;/code&gt; o&amp;#x27;zgargandagina qayta hisoblanadi. Aks holda, keshlashtirish natijasidan foydalaniladi.&lt;/li&gt;
    &lt;li id=&quot;8n2X&quot;&gt;Takroriy hisob-kitoblardan qochish: Agar komponentda &lt;code&gt;filteredAndSortedNumbers&lt;/code&gt;ga bir necha marta murojaat qilinsa ham, hisob-kitob faqat bir marta bajariladi.&lt;/li&gt;
    &lt;li id=&quot;oZvf&quot;&gt;Tezkorlik: Foydalanuvchi interfeysi sezilarli darajada tezroq ishlaydi, chunki murakkab hisob-kitoblar faqat zarur bo&amp;#x27;lgandagina bajariladi.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;o55e&quot;&gt;&lt;/h3&gt;
  &lt;h3 id=&quot;p4Bk&quot;&gt;Reacts only to reactive data change&lt;/h3&gt;
  &lt;p id=&quot;fyt7&quot;&gt;&lt;code&gt;computed() &lt;/code&gt;methodi faqat reactive data o&amp;#x27;zgarsagina callback ishlaydi.&lt;/p&gt;
  &lt;pre id=&quot;XY1D&quot; data-lang=&quot;javascript&quot;&gt;const now = computed(() =&amp;gt; Date.now())
const counter = computed(() =&amp;gt; localStorage.getItem(&amp;#x27;counter&amp;#x27;))&lt;/pre&gt;
  &lt;p id=&quot;PCQt&quot;&gt;Bu misollarda &lt;code&gt;now&lt;/code&gt; va &lt;code&gt;counter&lt;/code&gt; o&amp;#x27;zgaruvchilari bir marta initialization paytida set qilinadi va boshqa o&amp;#x27;zgarmaydi chunki &lt;code&gt;Date&lt;/code&gt; ham &lt;code&gt;localStorage&lt;/code&gt; ham reactive emas.&lt;br /&gt;&lt;/p&gt;
  &lt;h3 id=&quot;2viT&quot;&gt;Writable computed - &lt;em&gt;Not recommended&lt;/em&gt;&lt;/h3&gt;
  &lt;p id=&quot;Wtxj&quot;&gt;Ccomputed properties default holatda &lt;strong&gt;getter&lt;/strong&gt; funksiyaga ega. Kamdan-kam hollarda sizga writable computed value kerak bo&amp;#x27;ladi. Agar siz computed value ga yangi qiymat bermoqchi bo&amp;#x27;lsangiz, Runtime warning chiqadi. Agar kerak bo&amp;#x27;sa siz uni ham &lt;strong&gt;getter&lt;/strong&gt;, ham &lt;strong&gt;setter&lt;/strong&gt; funksiyalarni ta&amp;#x27;minlash orqali yaratishingiz mumkin.&lt;/p&gt;
  &lt;pre id=&quot;4p9c&quot; data-lang=&quot;javascript&quot;&gt;import { ref, computed } from &amp;#x27;vue&amp;#x27;
const firstName = ref(&amp;#x27;John&amp;#x27;)
const lastName = ref(&amp;#x27;Doe&amp;#x27;)
const fullName = computed({
  // getter
  get() {
    return firstName.value + &amp;#x27; &amp;#x27; + lastName.value
  },
  // setter
  set(newValue) {
    [firstName.value, lastName.value] = newValue.split(&amp;#x27; &amp;#x27;)
  }
})&lt;/pre&gt;
  &lt;h3 id=&quot;VUpg&quot;&gt;&lt;br /&gt;Best practices&lt;/h3&gt;
  &lt;p id=&quot;BKTG&quot;&gt;Computed getter funcsiyalar faqatgina Pure computation uchun va Side-effect lardan holi bo&amp;#x27;lgan xolda ishlatilishi kerak. Masalan quyidagilarni computed bn ishlatmaslik lozim:&lt;br /&gt; - DOM ga o&amp;#x27;zgartirish kiritish&lt;br /&gt; - boshqa state ni o&amp;#x27;zgartirish&lt;br /&gt; - async request lar ishlatish&lt;/p&gt;
  &lt;p id=&quot;ZkEI&quot;&gt;Computed value ni mutate qilmang. Uni faqat source state o&amp;#x27;zgargan holda o&amp;#x27;zgaradigan va shu value orqali hisoblangan qiymat deb qabul qiling.&lt;br /&gt;&lt;br /&gt;&amp;quot;&lt;strong&gt;Writable computed&lt;/strong&gt; larchi?&amp;quot; deyishingiz mumkin. &lt;br /&gt;Writable computedlarni tepadagi Anti-patternlar sabab ishlatish tavsiya etilmaydi. Source state o&amp;#x27;zgarganda boshqa stateni o&amp;#x27;zgartirish uchun yoki async request lar uchun esa bizda &lt;strong&gt;Watcher&lt;/strong&gt; lar bor. &lt;br /&gt;&lt;br /&gt;Watcher lar uchun ham alohida post yozamiz. Siz bilmagan va kutmagan narsalar bo&amp;#x27;lishi mumkin. Stay tuned...&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;akfe&quot;&gt;&lt;a href=&quot;https://t.me/peaceofcode&quot; target=&quot;_blank&quot;&gt;@peaceofcode&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>dyusupov:loading-experience-with-suspense-component</id><link rel="alternate" type="text/html" href="https://teletype.in/@dyusupov/loading-experience-with-suspense-component?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=dyusupov"></link><title>Vue Suspense component ⏳</title><published>2024-07-18T16:15:44.036Z</published><updated>2024-07-18T16:15:44.036Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/07/cf/07cf3d92-ba71-4032-ac4d-1e246d5e0970.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/7a/2f/7a2f4d57-fe0c-47b2-9a52-eb202951bd86.jpeg&quot;&gt;Kontent yuklanishini kutish (Content loading) - bu web UX ning ajralmas qismidir. Internet tezligini o'ynashi hatto eng tezkor ilovalarni ham sekinlashtirishi mumkin, bu esa foydalanuvchining o'ylash va diqqatini buzish xavfini tug'diradi.</summary><content type="html">
  &lt;figure id=&quot;0ntz&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a3/d8/a3d883a2-698a-4250-972c-fb5e2dc3e2b0.jpeg&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Gh9J&quot;&gt;Kontent yuklanishini kutish (Content loading) - bu web UX ning ajralmas qismidir. Internet tezligini o&amp;#x27;ynashi hatto eng tezkor ilovalarni ham sekinlashtirishi mumkin, bu esa foydalanuvchining o&amp;#x27;ylash va diqqatini buzish xavfini tug&amp;#x27;diradi.&lt;/p&gt;
  &lt;p id=&quot;xxWZ&quot;&gt;Yaxshi ishlab chiqilgan loading indikatorlar foydalanuvchiga to&amp;#x27;gri feedback beradi — ularning so&amp;#x27;rovi tizim tomonidan &amp;quot;eshitilganini&amp;quot; tasdiqlaydi, Loading progress ni ko&amp;#x27;rsatadi va hatto kutilayotgan vaqt qisman kamaygandek tuyuladi. &lt;/p&gt;
  &lt;h3 id=&quot;47ac&quot;&gt;&lt;/h3&gt;
  &lt;h2 id=&quot;SCv2&quot;&gt;Vue 3’s Suspense component&lt;/h2&gt;
  &lt;p id=&quot;FCn2&quot;&gt;SPA da ayniqsa Loading experience yaxshi bo&amp;#x27;lmaydi. Sababi content ni yuklashda juda ko&amp;#x27;p Fetch request lar berilgani sababli UI da Spinner ustiga spinner va har xil progress bar larga to&amp;#x27;lib ketadi. Shu narsani oldini olish uchun Vue 3 &lt;a href=&quot;https://vuejs.org/guide/built-ins/suspense.html&quot; target=&quot;_blank&quot;&gt;Suspense Component&lt;/a&gt; ni taqdim qildi. Suspense component bizga data-fetching  qiladigan ko&amp;#x27;p componentlarni coordinate qiladigan va Loading experience ni yaxshilaydigan yangi patternni beradi. Keling chuqurroq ko&amp;#x27;rib chiqamiz.&lt;br /&gt;&lt;/p&gt;
  &lt;h2 id=&quot;fe4b&quot;&gt;Render, then fetch&lt;/h2&gt;
  &lt;p id=&quot;cwUi&quot;&gt;Odatiy SPA application larda view ko&amp;#x27;p componentlardan va nested componentlardan tashkil topgan bo&amp;#x27;ladi. Va bu componentlar o&amp;#x27;z content ini o&amp;#x27;zi yuklashi mumkin. Suspense component siz odatiy loading pattern o&amp;#x27;z ichiga mounted da data ni fetch qiladi, shuningdek loading va error ni ham ko&amp;#x27;rsatadi:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/DoniyorYusupov/45ee9f82ef796ae642796fd71f18a262.js&quot;&gt;&lt;/script&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yKjX&quot;&gt;View ni shunday componentlar bilan to&amp;#x27;ldirsak har bir component kerakmas re-render lar yoki layout shift larga olib kelishi mumkin.&lt;/p&gt;
  &lt;figure id=&quot;RBil&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/57/66/576660db-1e31-4bae-8499-b319a50816cb.gif&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Without Suspense Component&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;59d1&quot;&gt;&lt;/h3&gt;
  &lt;h2 id=&quot;s7Fk&quot;&gt;Fetch, then render&lt;/h2&gt;
  &lt;p id=&quot;4051&quot;&gt;Suspense esa hamma children component lardagi asinxron data fetching tugamaguncha Component tree ni render qilishni to&amp;#x27;xtatib turadi. Componentda data-fetching borligini Suspense u component ni &lt;code&gt;&amp;lt;script async setup&amp;gt;&lt;/code&gt; ligidan yoki &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; ning ichida &lt;code&gt;top-level await&lt;/code&gt; borligidan biladi. E&amp;#x27;tibor bering - Loading va Error logikasi individual component tomonidan boshqarilmayapti:&lt;/p&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/DoniyorYusupov/0cadb27569e6d95d616e778d04acad24.js&quot;&gt;&lt;/script&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;lxGE&quot;&gt;Endi componentlar Viewda har xil vaqtda resolve bo&amp;#x27;lmaydi. Suspence Component hamma componentlar o&amp;#x27;zining async request larini tugatmagunicha fallback ni ko&amp;#x27;rsatadi va qandaydir error chiqsa onErrorCaptured hook ni ishga tushiradi:&lt;/p&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/DoniyorYusupov/6bfab3545d4a4dc8f9581bdc73ddab91.js&quot;&gt;&lt;/script&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;uyOv&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/eb/80/eb80b61c-a588-4a5a-9983-cb5973da8dcc.gif&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;With Suspense Component&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FTnD&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Urnb&quot;&gt;Keling Suspense component ni bir nechta amaliy misollarda ko&amp;#x27;rib chiqamiz.&lt;/p&gt;
  &lt;figure id=&quot;knta&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1c/97/1c97303d-ab15-4939-84cb-b3719624a5ce.png&quot; width=&quot;720&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hqvw&quot;&gt;Chap tarafda har bir component loading ni o&amp;#x27;zi kontrol qilmoqda va content lar har xil vaqtda render bo&amp;#x27;lishmoqda.&lt;br /&gt;O&amp;#x27;ng tarafda esa birgina Suspense componentini view-level ga qo&amp;#x27;yib hamma component uchun umumiy Loading indikatorini ko&amp;#x27;rsatib, bir vaqtda render qilishimiz mumkin.&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;KYHW&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://codepen.io/ajithranka/embed/LYOBzob&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LKwY&quot;&gt;Error larni ham shunda global qilishni iloji bor:&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;xT2K&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://codepen.io/ajithranka/embed/MWOBGMG&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;dnje&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;RhAw&quot;&gt;Nested Async component lar uchun Suspense componentni ishlatish&lt;/h2&gt;
  &lt;p id=&quot;fJoX&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;ske0&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://codepen.io/ajithranka/embed/XWzBYmo&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;foX2&quot;&gt;Qachonki bir necha data-fetching component lar component tree da nested bo&amp;#x27;lsa,  sahifa keraksiz re-render lar ni amalga oshiradi. Suspense esa nested component larni ham asinxron amallarini tugatgunicha kutib turadi va content sahifada bir marotaba render boladi.&lt;/p&gt;
  &lt;p id=&quot;U1OH&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;SCLn&quot;&gt;Suspense component ni ichida nested component larni yuklanish ketma ketligini kontrol qilamiz&lt;/h2&gt;
  &lt;p id=&quot;7jLX&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;OAxO&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/01/7a/017a7410-e9f9-48ac-a7e2-fc5d1d5940a8.png&quot; width=&quot;720&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UfPe&quot;&gt;Faraz qilaylik, bizda ma&amp;#x27;lum bir component uzoq load boladi. Bu ssenariyda qolgan content ni birinchi ko&amp;#x27;rsatib, uzoq load bo&amp;#x27;ladigan component larni orqa tomonda yuklanishini kutamiz. Biz bunga shu component ni o&amp;#x27;zini alohida Suspense ga o&amp;#x27;rashimiz kerak bo&amp;#x27;ladi.&lt;/p&gt;
  &lt;figure id=&quot;0kPb&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://codepen.io/ajithranka/embed/RwjBJbr&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;91Ce&quot;&gt;Chap tarafda bitta umumiy Suspense ga o&amp;#x27;ralgan 2 ta tez yuklanadigan va 1 ta uzoq yuklanadigan component.&lt;br /&gt;O&amp;#x27;ng tarafda umumiy Suspense ga o&amp;#x27;ralgan 2 ta tez yuklanadigan va o&amp;#x27;zi alohida Suspense ga o&amp;#x27;ralgan uzoq yuklanadigan component.&lt;/p&gt;
  &lt;p id=&quot;ZLab&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Zl8c&quot;&gt;Hullas biz Suspense component bizga qanday qilib Loading experience ni yaxshilashga yordam berishini ko&amp;#x27;rib chiqdik.&lt;br /&gt;&lt;br /&gt;Qo&amp;#x27;shimcha savollaringiz bo&amp;#x27;lsa sizni o&amp;#x27;z kanalimda kutaman.&lt;br /&gt;&lt;br /&gt;Hurmat bilan Doniyor (&lt;a href=&quot;https://t.me/peaceofcode&quot; target=&quot;_blank&quot;&gt;PeaceOfCode&lt;/a&gt;)&lt;/p&gt;
  &lt;p id=&quot;eEPQ&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.s. Special thanks to &lt;a href=&quot;https://medium.com/arcana-network-blog&quot; target=&quot;_blank&quot;&gt;Arcana Network Blog&lt;/a&gt; for images and  &lt;a href=&quot;https://codepen.io/ajithranka&quot; target=&quot;_blank&quot;&gt;Ajith Ranka&lt;/a&gt; for practical examples.&lt;/p&gt;

</content></entry><entry><id>dyusupov:Vue-Async-Components-07-11</id><link rel="alternate" type="text/html" href="https://teletype.in/@dyusupov/Vue-Async-Components-07-11?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=dyusupov"></link><title>Async Components in Vue</title><published>2024-07-17T04:51:19.957Z</published><updated>2024-07-17T04:51:19.957Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/a0/36/a036815c-92ed-4941-a1c4-a7ccd1aa394f.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/6b/b3/6bb326cb-2502-4d6e-867d-a041d55cbf5b.png&quot;&gt;Katta web ilovalarni dasturlashda, ularning tez yuklanishi va interaktiv elementlarining javob berish tezligi UX ga katta ta'sir ko'rsatishi mumkin. Web-ilovalar o'lchami va murakkabligi ortib borar ekan, katta hajmdagi kodlarni faqat kerak bo'lganda yuklashni ta'minlash muhim ahamiyat kasb etadi. Shu yerda Vue dagi asinxron komponentlar yordamga keladi.</summary><content type="html">
  &lt;p id=&quot;uKM4&quot;&gt;Katta web ilovalarni dasturlashda, ularning tez yuklanishi va interaktiv elementlarining javob berish tezligi UX ga katta ta&amp;#x27;sir ko&amp;#x27;rsatishi mumkin. Web-ilovalar o&amp;#x27;lchami va murakkabligi ortib borar ekan, katta hajmdagi kodlarni faqat kerak bo&amp;#x27;lganda yuklashni ta&amp;#x27;minlash muhim ahamiyat kasb etadi. Shu yerda Vue dagi asinxron komponentlar yordamga keladi.&lt;/p&gt;
  &lt;p id=&quot;Y2Ry&quot;&gt;Faraz qiling bizda oddiy modal component bor va parent da button bosilganda shu modal component render bo&amp;#x27;lishi kerak.&lt;br /&gt;Modal component o&amp;#x27;z ichiga faqat style va modal qanday paydo bo&amp;#x27;lishini belgilaydi.&lt;/p&gt;
  &lt;figure id=&quot;2NBR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6b/b3/6bb326cb-2502-4d6e-867d-a041d55cbf5b.png&quot; /&gt;
    &lt;figcaption&gt;src/components/Modal.vue&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fBtI&quot;&gt;&lt;strong&gt;App&lt;/strong&gt; componentda Button va uni bosganda reactive boolean o&amp;#x27;zgaruvchi (&lt;code&gt;showModal&lt;/code&gt;) yordamida render bo&amp;#x27;lishi kerak bo&amp;#x27;lgan Modal component render bo&amp;#x27;ladi. Modal shu &lt;strong&gt;showModal &lt;/strong&gt;o&amp;#x27;zgaruvchisi orqali ko&amp;#x27;rsatiladi/berkitiladi.&lt;/p&gt;
  &lt;figure id=&quot;AryS&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/be/46/be463659-928d-4fe7-a5b8-a251ce1995e7.png&quot; /&gt;
    &lt;figcaption&gt;src/App.vue&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;N6DA&quot;&gt;When we click the &lt;code&gt;Show Modal&lt;/code&gt; button, the modal is shown on the page.&lt;br /&gt;&lt;code&gt;Show Modal&lt;/code&gt; tugmasi bosilganda sahifada modal paydo bo&amp;#x27;ladi.&lt;/p&gt;
  &lt;figure id=&quot;DS3u&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/91/03/91039455-98e8-4a2b-b9b9-3bf45faa43e7.png&quot; /&gt;
    &lt;figcaption&gt;Boshlang&amp;#x27;ich holati&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;4sfD&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/16/8c/168cf6ac-247c-4aa9-93aa-e41c003e4d74.png&quot; /&gt;
    &lt;figcaption&gt;Tugma bosilgandagi holat&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ISNc&quot;&gt;Ko&amp;#x27;rishingiz mumkinki Modal.vue faqat tugmani bosganimizda paydo bo&amp;#x27;lsa ham Browser Network loglarida asosiy bundle bilan birga yuklanmoqda.&lt;/p&gt;
  &lt;p id=&quot;aqKb&quot;&gt;Ho&amp;#x27;sh biz Modal.vue ni faqat tugma bosilgandagina yuklanishini xohlasak, bizga &lt;strong&gt;defineAsyncComponent() &lt;/strong&gt;funksiyasi kerak bo&amp;#x27;ladi&lt;/p&gt;
  &lt;figure id=&quot;8VzX&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b4/b7/b4b78d5f-923c-40bb-a66b-e54417eee135.png&quot; /&gt;
    &lt;figcaption&gt;src/components/AsyncModal.ts&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;j1Z8&quot;&gt;Endi App componentda AsyncModal ni import qilib, oddiy &lt;strong&gt;Modal&lt;/strong&gt; ni o&amp;#x27;rniga almashtirishimiz kerak.&lt;/p&gt;
  &lt;figure id=&quot;d66t&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/39/c8/39c8da8a-76de-49ca-b07e-b3dc7434e017.png&quot; /&gt;
    &lt;figcaption&gt;src/App.vue&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zKkz&quot;&gt;Endi shu kichik o&amp;#x27;zgarish orqali bizning modal asinxron yuklanadi. Sahifamizning boshlang&amp;#x27;ich holatida &lt;code&gt;Modal&lt;/code&gt; component asosiy bundle bilan &lt;strong&gt;yuklanmayotganini &lt;/strong&gt;ko&amp;#x27;rishimiz mumkin.&lt;/p&gt;
  &lt;figure id=&quot;B4Z3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ec/88/ec886f73-b86b-47f2-afa5-af3b3f7c3675.png&quot; /&gt;
    &lt;figcaption&gt;Boshlang&amp;#x27;ich holati&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yz0c&quot;&gt;&lt;strong&gt;Show Modal&lt;/strong&gt; tugmasini bosganimizdan keyingina &lt;strong&gt;Modal.vue &lt;/strong&gt;componenti yuklanmoqda.&lt;/p&gt;
  &lt;figure id=&quot;pdx5&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cd/5d/cd5dd374-70bf-4600-be74-a74186b23896.png&quot; /&gt;
    &lt;figcaption&gt;Tugma bosilgandan keyingi holat&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;Loading-va-Error-UI&quot;&gt;Loading va Error UI&lt;/h4&gt;
  &lt;p id=&quot;TDBz&quot;&gt;Vue bizga&lt;strong&gt; defineAsyncComponent() &lt;/strong&gt;asinxron componentni yuklashdan tashqari ushbu component yuklanish vaqtidagi loading protsessini va yuzaga kelgan xatolik haqida ma&amp;#x27;lumotni ko&amp;#x27;rsatish imkonini beradi. Bu esa bizga o&amp;#x27;z navbatida internetning har qanday holatida ham silliq UX ni ta&amp;#x27;minlashga yordam beradi.&lt;/p&gt;
  &lt;h4 id=&quot;loadingComponent&quot;&gt;loadingComponent&lt;/h4&gt;
  &lt;p id=&quot;pMtU&quot;&gt;Tepadagi tugmani bosgan paytda Modal.vue yuklangunicha bo&amp;#x27;lgan vaqtda UI da uzilish bo&amp;#x27;lmasligi uchun &lt;strong&gt;defineAsyncComponent()&lt;/strong&gt; bizga qo&amp;#x27;shimcha &lt;code&gt;loadingComponent&lt;/code&gt; optionini ham beradi. Undan foydalanishimiz uchun biz defineAsyncComponent ga import funksiyasini emas, object beramiz va import funksiyani &lt;code&gt;loader&lt;/code&gt; option iga qo&amp;#x27;yamiz:&lt;/p&gt;
  &lt;p id=&quot;eQlE&quot;&gt;Bizda oddiy Loading component bor:&lt;/p&gt;
  &lt;figure id=&quot;9eDu&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d6/74/d6747992-9d15-4c66-b562-c283c63b90a5.png&quot; /&gt;
    &lt;figcaption&gt;src/components/Loading.vue&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UdHW&quot;&gt;Biz uni &lt;strong&gt;loadingComponent&lt;/strong&gt; optioniga beramiz&lt;/p&gt;
  &lt;figure id=&quot;tOSm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/37/a8/37a87d47-84c8-4117-8a46-3a94e00f5077.png&quot; /&gt;
    &lt;figcaption&gt;src/components/AsyncModal.vue&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;S9Vs&quot;&gt;Loading ni ko&amp;#x27;rish uchun Network da internet tezligini Slow 3G ga o&amp;#x27;tkazib sekin internet holatini sun&amp;#x27;iy ko&amp;#x27;rinishda yuzaga keltiramiz (Bo&amp;#x27;lmasam Loading... chiqishini ko&amp;#x27;rishni iloji yo&amp;#x27;q).&lt;/p&gt;
  &lt;figure id=&quot;82zL&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ce/7c/ce7c841e-6413-444c-b93c-17f2161ed26a.png&quot; /&gt;
    &lt;figcaption&gt;Tugma bosilgandan keyingi holat&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;eKpP&quot;&gt;Browser Modal.vue ni yuklab bo&amp;#x27;lgach uni Loading component bilan almashtiradi.&lt;/p&gt;
  &lt;figure id=&quot;JgJb&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/38/85/388547f6-2c49-4e7f-99e7-da13a75070fd.png&quot; /&gt;
    &lt;figcaption&gt;Yuklab bo&amp;#x27;lganidan keyingi holat&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;errorComponent&quot;&gt;errorComponent&lt;/h4&gt;
  &lt;p id=&quot;mr2I&quot;&gt;Huddi loadingComponent kabi defineAsyncComponent() bizga errorComponent optionini beradi. Keling oddiy Error.vue componentini yasaymiz:&lt;/p&gt;
  &lt;figure id=&quot;jlk7&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f3/46/f3467c50-41da-4b6a-9ef9-ea6b1ba82395.png&quot; /&gt;
    &lt;figcaption&gt;src/components/Error.vue&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wZuh&quot;&gt;Endi uni errorComponent optioniga beramiz&lt;/p&gt;
  &lt;figure id=&quot;VSG7&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d1/ff/d1ff0eb3-d5f0-4f2e-b313-c99416d7fe95.png&quot; /&gt;
    &lt;figcaption&gt;src/components/AsyncModal.ts&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;62Ru&quot;&gt;Error component ni ko&amp;#x27;rish uchun browser ni Network tabida internet ni Offline qilish kerak bo&amp;#x27;ladi.&lt;/p&gt;
  &lt;figure id=&quot;KE9G&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c3/7d/c37d4d4e-90e0-4eb0-adca-702ed5567227.png&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tvfU&quot;&gt;&lt;strong&gt;defineAsyncComponent() &lt;/strong&gt;yana bir qancha optionlar ni taqdim etadi: &lt;code&gt;delay&lt;/code&gt;, &lt;code&gt;timeout&lt;/code&gt;, &lt;code&gt;suspensible&lt;/code&gt; va &lt;code&gt;onError()&lt;/code&gt;. Bu optionlar dasturchiga componentni asinxron yuklash va UX ni kontrol qilishda ko&amp;#x27;p imkoniyatlarni beradi. Ko&amp;#x27;proq detallar haqida &lt;a href=&quot;https://vuejs.org/api/general.html#defineasynccomponent&quot; target=&quot;_blank&quot;&gt;API documentation&lt;/a&gt; ga murojaat qilishingizni so&amp;#x27;rayman.&lt;/p&gt;
  &lt;p id=&quot;hPG3&quot;&gt;Darsligimiz yoqdi degan umiddamiz. &lt;a href=&quot;https://t.me/peaceofcode&quot; target=&quot;_blank&quot;&gt;https://t.me/peaceofcode&lt;/a&gt; ni kuzatib boring, yanada ko&amp;#x27;proq mavzularni O&amp;#x27;zbek tilida yoritib borishga harakat qilamiz. 🫰&lt;/p&gt;
  &lt;p id=&quot;F0Wa&quot;&gt;Hurmat bilan, Doniyor.&lt;/p&gt;

</content></entry></feed>