uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 418
Obunachilar
+124 soatlar
-27 kunlar
-530 kunlar
Postlar arxiv
ToCode
1 418
ืื ื™ ื—ื™ื™ื‘ ืœื”ื•ื“ื•ืช ืฉืื ื™ ืขื“ื™ื™ืŸ ืœื ืจื•ืื” ืื™ืš ืคืงื•ื“ืช use ืชื”ืคื•ืš ืœืžืฉื”ื• ืฉืื ืฉื™ื ื™ืจืฆื• ืœื”ืฉืชืžืฉ ื‘ื• ื‘ืœื™ ืขื˜ื™ืคื” ืžืกื•ื“ืจืช ืฉืœ ืกืคืจื™ื” ืื‘ืœ ื™ืžื™ื ื™ื’ื™ื“ื•. ื‘ืฉื‘ื™ืœ ื”ืžืฉื—ืง ืžื•ื–ืžื ื™ื ืœื”ืฉื•ื•ืช ื‘ื™ืŸ ื”ืงื•ื“ ื”ื–ื” ืœืžื ื’ื ื•ืŸ ื”ืžืงื‘ื™ืœ ืฉืœ vue ืขืœื™ื• ื›ืชื‘ืชื™ ื›ืืŸ: https://www.tocode.co.il/blog/2024-10-vue-async-fetch ื“ืขืชื™ ื”ืื™ืฉื™ืช ืฉื”ืžื ื’ื ื•ืŸ ืฉืœ vue ื”ืจื‘ื” ื™ื•ืชืจ ืคืฉื•ื˜ ื•ื”ืจื‘ื” ืคื—ื•ืช ืžื‘ืœื‘ืœ.

ToCode
1 418
ืงื•ืžืคื•ื ื ื˜ื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช ื‘ืจื™ืืงื˜ 19 ืจื™ืืงื˜ 19 ืฉื•ื—ืจืจ ืžืžืฉ ืœืคื ื™ ื›ืžื” ื™ืžื™ื ื•ื”ืคื™ืฆ'ืจ ื”ื›ื™ ืžืจื’ืฉ ืฉื”ื•ื ืžื‘ื™ื ืœืฉื•ืœื—ืŸ ื”ื•ื ื”ืชืžื™ื›ื” ื‘ืงื•ืžืคื•ื ื ื˜ื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช. ื‘ืคื•ืกื˜ ื–ื” ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“ ื•ืœืžื” ื—ืฉื•ื‘ ืœืฉื™ื ืœื‘. ืื™ืš ืœื™ืฆื•ืจ ืชื•ื›ื ื™ืช ืจื™ืืงื˜ 19 ืขื Vite ื‘ื’ืœืœ ืฉื”ื›ืœ ื—ื“ืฉ ืชื•ื›ื ื™ืช ืจื™ืืงื˜ ื—ื“ืฉื” ืฉื ื™ืฆื•ืจ ื‘ vite ืขื“ื™ื™ืŸ ืขื•ื‘ื“ืช ืขื ืจื™ืืงื˜ 18. ื›ื“ื™ ืœืฉื“ืจื’ ืœืจื™ืืงื˜ 19 ื™ืฉ ืœืฉื ื•ืช ืืช ื’ื™ืจืกืื•ืช ื”ืกืคืจื™ื•ืช ืž 18 ืœ 19 ื‘ืงื•ื‘ืฅ package.json. ื–ืืช ื”ืจืฉื™ืžื” ืืฆืœื™ ื‘ืคืจื•ื™ืงื˜ ื—ื“ืฉ ืฉืฉื•ื“ืจื’ ืœืจื™ืืงื˜ 19:
{
  "name": "react-19-async-components",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc -b && vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": ">=19",
    "react-dom": ">=19"
  },
  "devDependencies": {
    "@eslint/js": "^9.15.0",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "@vitejs/plugin-react": "^4.3.4",
    "eslint": "^9.15.0",
    "eslint-plugin-react-hooks": "^5.0.0",
    "eslint-plugin-react-refresh": "^0.4.14",
    "globals": "^15.12.0",
    "typescript": "~5.6.2",
    "typescript-eslint": "^8.15.0",
    "vite": "^6.0.1"
  }
}
ื™ืฆื™ืจืช ืงื•ืžืคื•ื ื ื˜ื” ืืกื™ื ื›ืจื•ื ื™ืช ื”ื’ื“ืจืช ืงื•ืžืคื•ื ื ื˜ื” ืืกื™ื ื›ืจื•ื ื™ืช ื‘ืจื™ืืงื˜ ืœืฆืขืจื ื• ืœื ืงื•ืจื™ืช ืขื ืคืงื•ื“ืช async ื›ืžื• ื”ื’ื“ืจื” ืฉืœ ืคื•ื ืงืฆื™ื” ืืกื™ื ื›ืจื•ื ื™ืช ืจื’ื™ืœื” ืืœื ื‘ืืžืฆืขื•ืช ืฉื™ืžื•ืฉ ื‘ Hook ื—ื“ืฉ ืฉื ืงืจื use. ื”ืคื•ื ืงืฆื™ื” use ื™ื•ื“ืขืช ืœืงื‘ืœ Promise, ื•ื”ืงื•ืžืคื•ื ื ื˜ื” "ืชื•ืคืขืœ" ืจืง ื›ืฉื” Promise ืžืชืžืžืฉ. ื ืฉื™ื ืœื‘ ืฉืœืคื ื™ ืฉื ื•ื›ืœ ืœื”ืคืขื™ืœ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืืกื™ื ื›ืจื•ื ื™ืช ืขืœื™ื ื• ืœืขื˜ื•ืฃ ืืช ื”ืขืฅ ืฉื™ื•ืฆืจ ืื•ืชื” ื‘ืืœืžื ื˜ Suspense ืฉืœ ืจื™ืืงื˜, ื›ืœื•ืžืจ ื”ืงื•ื“ ื”ืจืืฉื™ ื‘ App.tsx ื”ื•ื:
import { Suspense } from 'react'
import AsyncData from './AsyncData';
import './App.css'

function App() {
  return (
    <main>
    <h1>Async Component Demo</h1>
    <Suspense fallback={<p>Loading, please wait ...</p>}>
      <AsyncData />
    </Suspense>
  </main>
  )
}

export default App
ื‘ืฆื“ ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื” ืขืœื™ื ื• ืœื™ืฆื•ืจ Promise ืžื—ื•ืฅ ืœืงื•ืžืคื•ื ื ื˜ื”, ืœื”ืขื‘ื™ืจ ืื•ืชื• ืคื ื™ืžื” ืœืชื•ืš ืคืงื•ื“ืช use ื•ืœื”ืฉืชืžืฉ ื‘ืžื™ื“ืข ืฉื—ื•ื–ืจ ืžืžื ื•:
import {use} from 'react';

const dataPromise = fetch(\https://swapi.dev/api/people/1\).then(r => r.json());

export default function() {
  const data = use(dataPromise);
  return (
    <div>
      <p>Ready!</p>
      <p>Received Data for: {data.name}</p>
    </div>
  )
}
ืฉื™ืžื• ืœื‘ ืฉื” Promise ื ื•ืฆืจ ืžื—ื•ืฅ ืœืคื•ื ืงืฆื™ื™ืช ื”ืงื•ืžืคื•ื ื ื˜ื”. ื™ืฆื™ืจืช Promise ื”ื™ื Side Effect ื•ืœื›ืŸ ืื ื ืงืจื ืœ fetch ื‘ืชื•ืš ืคื•ื ืงืฆื™ื™ืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื›ืœ ืคืขื ืฉืจื™ืืงื˜ ื™ืฆื˜ืจืš ืœืจื ื“ืจ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืžื—ื“ืฉ ื”ื•ื ื™ืคืขื™ืœ ืืช ื” fetch ืžื—ื“ืฉ ื•ื ื™ื›ื ืก ืœืœื•ืœืื” ืื™ื ืกื•ืคื™ืช ืฉืœ ืžืฉื™ื›ืช ืžื™ื“ืข ื•ืื– ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื™ืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื›ื“ื™ ืœืงื‘ืœ ืืช ื” JSX, ืžื” ืฉื™ื’ืจื•ื ืœื”ืคืขืœื” ื—ื“ืฉื” ืฉืœ ื” fetch ื•ืžืฉื™ื›ืช ื”ืžื™ื“ืข ืžื—ื“ืฉ ื•ื›ืŸ ื”ืœืื”. ืื ืืชื ืฆืจื™ื›ื™ื ืœืžืฉื•ืš ืžื™ื“ืข ื›ืคื•ื ืงืฆื™ื” ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื” (ืœืžืฉืœ ืœืคื™ id ืฉืขื•ื‘ืจ ื‘ props) ื”ืชื‘ื ื™ืช ื”ื›ื™ ื˜ื•ื‘ื” ืฉืžืฆืืชื™ ื‘ื™ื ืชื™ื™ื ื”ื™ื ืœืคืฆืœ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืœ-2 ื•ืœืฉื™ื ื‘ืœื•ืง Suspense ื ื•ืกืฃ ื‘ืงื•ืžืคื•ื ื ื˜ื” ื”ืขื•ื˜ืคืช, ื›ืœื•ืžืจ ืงื•ื“ ื›ื–ื”:
import {Suspense, use, useState, useEffect} from 'react';

export default function(props: {id: number}) {
  const {id} = props;
  const [activeFetch, setActiveFetch] = useState(Promise.resolve({} as Record<string, string>));
  
  useEffect(() => {
    setActiveFetch(fetch(\https://swapi.dev/api/people/${id}\).then(r => r.json()))
  }, [id])

  return <Suspense>
      <ShowAsyncData dataPromise={activeFetch} />
    </Suspense>
}

function ShowAsyncData(props: {dataPromise: Promise<Record<string, string>>}) {
  const {dataPromise} = props;
  const data = use(dataPromise);
  return (
    <div>
      <p>Ready!</p>
      <p>Received Data for: {data.name}</p>
    </div>
  )
}
ื”ืกื™ื‘ื” ืฉ useEffect ืœื‘ื“ ืœื ืžืกืคื™ืง ื”ื™ื ืฉื” Suspense ืžื—ืœื™ืฃ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืฉื‘ืชื•ื›ื• ื‘ืชื•ืฆืื” ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืืกื™ื ื›ืจื•ื ื™ืช, ื”ื—ืœืคื” ืฉืฉืงื•ืœื” ืœืฉื™ื ื•ื™ key, ื›ืœื•ืžืจ ืžืžืฉ ื™ื•ืฆืจื™ื ืžื—ื“ืฉ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” - ื•ืœื›ืŸ ื”ืืคืงื˜ ื™ื•ืคืขืœ ืžื—ื“ืฉ, ืืคื™ืœื• ืฉ id ืœื ื”ืฉืชื ื”. ืœื›ืŸ ื—ื™ื™ื‘ื™ื ืœื™ืฆื•ืจ ืืช ื” Promise ืžื—ื•ืฅ ืœื‘ืœื•ืง ื” Suspense ืฉื™ื•ืฉืคืข ืžื” use.

ToCode
1 418
ื ื™ืกื•ื™ ืจื™ื™ืœืก - ืฉื™ืžื•ืฉ ื‘ Vue ื‘ืœื™ Build Step ืื—ื“ ื”ื˜ืจื ื“ื™ื ืฉืœ ืจื™ื™ืœืก ื”ื™ื•ื ื”ื•ื ืœื•ื•ืชืจ ืขืœ ื” Build Step ื•ืœื”ืฉืชืžืฉ ืจืง ื‘ JavaScript. ื‘ื ื™ืกื•ื™ ื”ื™ื•ื ื›ืชื‘ืชื™ ืคืจื•ื™ืงื˜ ืจื™ื™ืœืก ืฉืžืฉืœื‘ ืืช vue ื›ื“ื™ ืœืจืื•ืช ืื™ืš ื–ื” ืขื•ื‘ื“ ื•ื‘ืžื” ื–ื” ืฉื•ื ื” ืžืคืจื•ื™ืงื˜ ืฆื“-ืœืงื•ื— ืจื’ื™ืœ. ืื™ืš Vue ืขื•ื‘ื“ ื‘ JavaScript ืื ื—ื ื• ืจื’ื™ืœื™ื ืœื›ืชื•ื‘ vue ื‘ืงื‘ืฆื™ vue ื•ืœื”ืจื™ืฅ ืืช vite ื›ื“ื™ ืœื”ืคื•ืš ืืช ื”ื›ืœ ืœ JavaScript ืจื’ื™ืœ. ืื ืจื•ืฆื™ื ืœื•ื•ืชืจ ืขืœ ื” Build Step ื–ื” ืื•ืžืจ ืœื•ื•ืชืจ ืขืœ ืงื‘ืฆื™ ื” vue ื•ืœืขื‘ื•ืจ ืœื›ืชื•ื‘ ืงื‘ืฆื™ js ื• HTML. ื™ืฆืจืชื™ ืคืจื•ื™ืงื˜ ืจื™ื™ืœืก ื•ื‘ืชื•ื›ื• ืงื•ื ื˜ืจื•ืœืจ ื‘ืฉื HelloWorld ื•ื›ืชื‘ืชื™ ืืช ื”ืงื•ื“ ื”ื‘ื ื‘ืงื•ื‘ืฅ ื”ืชื‘ื ื™ืช viesws/hello_world/index.html.erb:
<div id='app'>
  <h1>HelloWorld#index</h1>
  <p>{{message}}</p>
  <Counter />
  <p>The end</p>
</div>

<script type="module">
  import { createApp, ref } from 'vue'
  import Counter from 'controllers/counter';

  createApp({
    setup() {
      const message = ref('Hello Vue!')
      return {
        message
      }
    }
  })
  .component('counter', Counter)
  .mount('#app')
</script>
ื™ืฉ ืœื ื• ืงื•ื‘ืฅ HTML ืขื ืชื’ื™ืช div ื‘ืฉื app ื•ื‘ืชื•ื›ื” ื”ืชื‘ื ื™ืช ืฉื”ื™ื™ืชื™ ืจื’ื™ืœ ืœืจืฉื•ื ื‘ืชื’ื™ืช template ื‘ืงื•ื‘ืฅ vue. ืžืชื—ืชื™ื• ื‘ื‘ืœื•ืง ื”ืกืงืจื™ืคื˜ ืื ื—ื ื• ืจื•ืื™ื ืืช ื”ืงื•ื“ ืฉืžื™ื™ืฆืจ ืืช ื”"ืืคืœื™ืงืฆื™ื”", ืฉื–ื” ื‘ืขืฆื ืงื•ื“ ื” vue ืฉืžืชืœื‘ืฉ ืœืชื•ืš ื”ืชื‘ื ื™ืช. ื”ืžืฉืชื ื” message ืฉืžื•ื’ื“ืจ ื‘ืกืงืจื™ืคื˜ ื™ื•ื–ืจืง ืœืขืžื•ื“ ื‘ืžืงื•ื ื”ืžื—ืจื•ื–ืช {{message}} ืฉื ืžืฆืืช ื‘ HTML. ื•ื›ืŸ ื‘ื’ืœืœ ืฉืื ื—ื ื• ื‘ Rails ืืคืฉืจ ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ื›ืœ ื”ืžื ื’ื ื•ื ื™ื ืฉืœ ERB ื›ื“ื™ ืœื™ืฆื•ืจ ืืช ื”ืชื‘ื ื™ืช ืื• ืœืฉืชื•ืœ ืžืฉืชื ื™ื ืžืงื•ื“ ืฆื“ ื”ืฉืจืช ืœืชื•ืš ืงื•ื“ ื”ืกืงืจื™ืคื˜ ืฉื‘ืชื‘ื ื™ืช. ืคื™ืชื•ื— ืงื•ืžืคื•ื ื ื˜ื” ื‘ vue ื—ืœืงื™ื ืžื”ืงื•ื“ ืฉืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ื”ื ื‘ื›ืžื” ืžืงื•ืžื•ืช ื ืงืจืื™ื ืงื•ืžืคื•ื ื ื˜ื•ืช. ื‘ื“ื•ื’ืžื” ืฉืœื ื• ืฉื™ืžื• ืœื‘ ืœืงื•ืžืคื•ื ื ื˜ื” counter ืฉื ืฉืชืœืช ื‘ืชื•ืš ื”ืชื‘ื ื™ืช ืื‘ืœ ืœื ืžื•ื’ื“ืจืช ื‘ืงื•ื‘ืฅ ื”ื“ื•ื’ืžื”. ื”ืงื•ืžืคื•ื ื ื˜ื” ืžื•ื’ื“ืจืช ื‘ืงื•ื‘ืฅ JavaScript ืจื’ื™ืœ ื‘ืฉื app/javascript/controllers/counter.js ื•ืžื™ื•ื‘ืืช ื‘ืขื–ืจืช ืคืงื•ื“ืช import. ื–ื” ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ:
import { ref } from 'vue';

export default {
  template: \
    <button @click="count++">{{count}}</button>
  \,
  setup() {
    const count = ref(0)
    return {
      count,
    }
  }
}
ืžื“ื•ื‘ืจ ื‘ืงื•ื“ vue ื›ืžืขื˜ ืจื’ื™ืœ, ืจืง ืฉื‘ืžืงื•ื ืœื”ืฉืชืžืฉ ื‘ืคื•ืจืžื˜ ืงื•ื‘ืฅ vue ื•ืชื’ื™ืช template ืื ื™ ืžื™ื™ืฆื ืื•ื‘ื™ืงื˜ ืฉื™ืฉ ืœื• ืžืคืชื— ื‘ืฉื template. ืื™ืŸ ื‘ืขื™ื” ืžืชื•ืš ืงื•ืžืคื•ื ื ื˜ื” ื›ื–ื• ืœืงืจื•ื ืœืขื•ื“ ืงื•ืžืคื•ื ื ื˜ื•ืช ืื• ืœื”ืขื‘ื™ืจ ืคืจืžื˜ืจื™ื ืœืงื•ืžืคื•ื ื ื˜ื•ืช ื‘ื“ื™ื•ืง ื›ืžื• ื‘ vue ืจื’ื™ืœ. ืœืžืขืฉื” ืจื•ื‘ ื”ืงื•ื“ ืฉืœ ื”ืžืขืจื›ืช ื™ื”ื™ื” ื›ื ืจืื” ื›ืชื•ื‘ ื‘ืงื•ืžืคื•ื ื ื˜ื•ืช ืงื˜ื ื•ืช ื‘ืงื‘ืฆื™ื ื›ืืœื”, ื•ื‘ืชื•ืš ืกืงืจื™ืคื˜ ืฉืœ ื›ืœ ื“ืฃ (ื›ืœ view) ืชื”ื™ื” ืืคืœื™ืงืฆื™ื™ืช vue ืฉืชื˜ืขืŸ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืื• ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ื”ืžืจื›ื–ื™ื•ืช ืœืื•ืชื• ื“ืฃ. ืžื” ืขื•ื“ ืฆืจื™ืš ื”ืงื•ื‘ืฅ ื”ืื—ืจื•ืŸ ืฉืžืฉื—ืง ืชืคืงื™ื“ ื‘ื ื™ืกื•ื™ ื”ื•ื ื”ืงื•ื‘ืฅ config/importmap.rb ืฉืžื’ื“ื™ืจ ืืช ื” Import Maps, ื›ืœื•ืžืจ ืืช ื”ืžื™ืคื•ื™ ื‘ื™ืŸ ื“ื‘ืจื™ื ืฉืื ื™ ืขื•ืฉื” ืœื”ื import ืžืชื•ืš ื” JavaScript ืœืงื‘ืฆื™ js ืืžื™ืชื™ื™ื ืขืœ ื”ื“ื™ืกืง. ื”ื•ื ื ืจืื” ื›ื›ื”:
* Pin npm packages by running ./bin/importmap *

pin "application"
pin "@hotwired/turbo-rails", to: "turbo.min.js"
pin "@hotwired/stimulus", to: "stimulus.min.js"
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"
pin "vue", to: "https://unpkg.com/vue@3/dist/vue.esm-browser.js"
pin_all_from "app/javascript/controllers", under: "controllers"
ื•ื›ืืŸ ืื ื—ื ื• ืจื•ืื™ื ืืช ืฉื ื”ืกืคืจื™ื” controllers ื•ืžื‘ื™ื ื™ื ืžืื™ืคื” ื–ื” ื”ื’ื™ืข (ื›ืŸ ืชื‘ื ื™ืช ืฉืœ ืคืจื•ื™ืงื˜ ืจื™ื™ืœืก ื—ื“ืฉ ืžืฉืชืžืฉืช ื‘ Stimulus ื• controllers ื–ื” ืฉื ื”ืกืคืจื™ื” ืฉื‘ื ืžืฉื). ืกืš ื”ื›ืœ ื”ืงื•ื“ ืขื•ื‘ื“ ื•ื ืจืื” ืœื ืจืข. ื™ื›ื•ืœ ืœืชืช ืคื™ืชืจื•ืŸ ื˜ื•ื‘ ื›ืฉืจื•ืฆื™ื ืœืฉืœื‘ ืกืคืจื™ื™ืช Vue ื‘ืคืจื•ื™ืงื˜ ืจื™ื™ืœืก ืื• ื›ืฉืจื•ืฆื™ื ืœื’ื•ื•ืŸ ืงืฆืช ืž Stimulus. ืžื•ื–ืžื ื™ื ืœืžืฆื•ื ืืช ื”ืงื•ื“ ื”ืžืœื ืฉืœ ืคืจื•ื™ืงื˜ ื”ื“ื•ื’ืžื” ื‘ื’ื™ื˜ื”ืื‘ ื›ืืŸ: https://github.com/ynonp/rails-vue-demo

ToCode
1 418
ื™ืฆื™ืจืชื™ ืื• ื™ืฆืจื ื™ ืฉืชื™ ืžื™ืœื™ื ืžืื•ื“ ื“ื•ืžื•ืช ื‘ืขื‘ืจื™ืช ืขื ืžืฉืžืขื•ืช ืฉืœืคืขืžื™ื ื ืจืื™ืช ื”ืคื•ื›ื”. ืื ืฉื™ื "ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ื™ื" ืžื™ื™ืฆืจื™ื ื“ื‘ืจื™ื ื•ื’ื•ืจืžื™ื ืœื—ื‘ืจื” ืœืคืขื•ืœ. ืื ืฉื™ื "ืงืจื™ืื™ื™ื˜ื™ื‘ื™ื™ื" ืžืžืฆื™ืื™ื ืจืขื™ื•ื ื•ืช ื—ื“ืฉื™ื, ืกื™ืคื•ืจื™ื, ืื•ืžื ื•ืช, ืฉื™ืจื™ื. ื‘ื˜ื— ืฉื›ื“ืื™ ืœื”ื™ื•ืช ื™ืฆื™ืจืชื™ ืื‘ืœ ื–ื” ื”ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ ืฉืžืฉืœื ืืช ื”ื—ืฉื‘ื•ืŸ. ืื• ืœืคื—ื•ืช ื›ื›ื” ื—ืฉื‘ื ื•. ื‘ืขื•ืœื ืฉืœ ื”ื™ื•ื ืืœื” ืฉืชื™ ืžื™ืœื™ื ืฉื”ื•ืœื›ื•ืช ื™ื—ื“ ื™ื“ ื‘ื™ื“. ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืขื•ื“ ืžื›ื•ื ื™ื•ืช, ืขื•ื“ ื˜ืœื•ื•ื™ื–ื™ื•ืช ืื• ืขื•ื“ ื ื™ื™ืจ ื˜ื•ืืœื˜, ืืคื™ืœื• ืื ืชืฆืœื™ื—ื• ืœื™ื™ืฆืจ ืื•ืชื• ืงืฆืช ื™ื•ืชืจ ื™ืขื™ืœ ืื• ืงืฆืช ื™ื•ืชืจ ื–ื•ืœ. ื”ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ื•ืช ื”ื™ื•ื ื”ื™ื ืงื•ื“ื ื›ืœ ื”ื™ื›ื•ืœืช ืœืจืื•ืช ืžื” ืื ืฉื™ื ืฆืจื™ื›ื™ื ื•ืœื”ืžืฆื™ื ืคื™ืชืจื•ื ื•ืช ืœื‘ืขื™ื•ืช ืฉืื—ืจื™ื ืขื•ื“ ืœื ืจืื•. ืงืจื™ืื™ื™ื˜ื™ื‘ื™ื•ืช ื”ื™ื ื”ื‘ืกื™ืก ืœืคืจื•ื“ื•ืงื˜ื™ื‘ื™ื•ืช.

ToCode
1 418
ืฉืชื™ ื“ืจื›ื™ื ืœื”ืจื’ื™ืข ืืช TypeScript ื›ืฉืžืฉืชืžืฉื™ื ื‘ inject ื‘ vue ื”ืงื•ื“ ื”ื–ื” ืขื•ื‘ื“, ืื‘ืœ ื’ื•ืจื ืœื˜ื™ื™ืคืกืงืจื™ืคื˜ ืœื›ืขื•ืก:
<script setup lang="ts">
import { inject } from 'vue';
import { translations } from './InjectionKeys';

const texts = inject(translations);
</script>

<template>
  <button>{{ texts['click-here'] }}</button>
</template>
ื”ืงื•ืžืคื•ื ื ื˜ื” ืœื•ืงื—ืช ืžื”ืงื•ื ื˜ืงืกื˜ ืืช ื”ืขืจืš ื”ื›ื™ ืงืจื•ื‘ ืฉืœ ื”ืžืฉืชื ื” translations ื•ืื– ืžื•ืฉื›ืช ืžืžื ื• ืืช ื”ืชืจื’ื•ื ืฉืœ ื”ื˜ืงืกื˜ click-here. ืื™ืŸ ืฉื’ื™ืื•ืช ื‘ืงื•ื ืกื•ืœ ื•ืขืœ ื”ืžืกืš ื”ื›ืœ ื ืจืื” ืชืงื™ืŸ. ื™ื•ืชืจ ืžื–ื”, ืื ื‘ื˜ืขื•ืช ืžื™ืฉื”ื• ืฉื›ื— ืœืขืฉื•ืช provide ืœ texts ืžื™ื“ ื ืจืื” ืืช ื”ืฉื’ื™ืื” ื‘ืงื•ื ืกื•ืœ ื›ื™ ื ื ืกื” ืœืงืจื•ื ืžืคืชื— ืžืชื•ืš null. ืื ื™ ื‘ืกื“ืจ ืขื ื”ื”ืชื ื”ื’ื•ืช ื”ื–ืืช ื›ื™ ืื™ืŸ ืœื™ ืžื” ืœืขืฉื•ืช ืขื ื”ืžืขืจื›ืช ืื ืืคื™ืœื• ื”ื˜ืงืกื˜ื™ื ืœื ื ื˜ืขื ื•. ื”ื‘ืขื™ื” ืฉื˜ื™ื™ืคืกืงืจื™ืคื˜ ืœื ื™ื•ื“ืข ืืช ื›ืœ ืžื” ืฉืื ื™ ื™ื•ื“ืข ื•ืžืกืžืŸ ืืช ืฉื•ืจืช ื”ื›ืคืชื•ืจ ื‘ template ื‘ืื“ื•ื. ืžื” ืขื•ืฉื™ื? ืฉืชื™ ื”ืฆืขื•ืช- ื“ืจืš ืื—ืช ื”ื™ื ืœื”ื•ืกื™ืฃ ื‘ื“ื™ืงื” ื‘ืงื•ื“ ื”ืกืงืจื™ืคื˜ ืื—ืจื™ inject:
<script setup lang="ts">
import { inject, ref } from 'vue';
import { translations } from './InjectionKeys';

const texts = inject(translations);
if (!texts) {
  throw new Error("Missing texts in parent component");
}
</script>

<template>
  <button>{{ texts['click-here'] }}</button>
</template>
ืงื™ื‘ืœื ื• ื”ื•ื“ืขืช ืฉื’ื™ืื” ืงืฆืช ื™ื•ืชืจ ื˜ื•ื‘ื” ื•ื˜ื™ื™ืคืกืงืจื™ืคื˜ ืจื’ื•ืข. ื“ืจืš ืฉื ื™ื” ื”ื™ื ืœื”ืขื‘ื™ืจ ืคืจืžื˜ืจ ืฉื ื™ ืœ inject ืฉื”ื•ื ืขืจืš ื‘ืจื™ืจืช ื”ืžื—ื“ืœ:
<script setup lang="ts">
import { inject, ref } from 'vue';
import { translations } from './InjectionKeys';

const texts = inject(translations, ref<Record<string, string>>({}));
</script>

<template>
  <button>{{ texts['click-here'] }}</button>
</template>
ืคื” ื”ืงื•ื“ ื™ื•ืชืจ ืงืฆืจ ืฉื–ื” ื ื—ืžื“, ืื‘ืœ ื”ื—ื™ืกืจื•ืŸ ื”ื•ื ืฉืขื›ืฉื™ื• ืื ืžื™ืฉื”ื• ืฉื•ื›ื— ืœื”ืขื‘ื™ืจ ืืช texts ืžืงื•ืžืคื•ื ื ื˜ื” ืขืœื™ื•ื ื” ื™ื•ืชืจ ืœื ื ืจืื” ืฉื’ื™ืื” ื‘ืงื•ื ืกื•ืœ ืืœื ืจืง ื˜ืงืกื˜ื™ื ืจื™ืงื™ื. ื›ื ืจืื” ืฉื’ื ื–ื” ืœื ื ื•ืจื ื›ื™ ื–ืืช ืฉื’ื™ืื” ืฉืžืื•ื“ ืงืœ ืœื–ื”ื•ืช. ืื™ื–ื” ืžืฉืชื™ ื”ื’ื™ืฉื•ืช ืืชื ืžืขื“ื™ืคื™ื? ืื• ืฉืื•ืœื™ ื™ืฉ ืœื›ื ื˜ื›ื ื™ืงื” ืื—ืจืช? ืžื•ื–ืžื ื™ื ืœืกืคืจ ื‘ืชื’ื•ื‘ื•ืช ืื• ื‘ื˜ืœื’ืจื.

ToCode
1 418
ืขื•ื“ ื›ืžื” ื‘ืขื™ื•ืช ืขื ืขื‘ื•ื“ื” ืžื™ื•ืชืจืช ื”ืคื•ืกื˜ ื›ืืŸ ื ื•ื’ืข ื‘ื ืงื•ื“ื” ื˜ื•ื‘ื” ืœื’ื‘ื™ SQL: https://www.depesz.com/2024/12/01/sql-best-practices-dont-compare-count-with-0/ ื‘ืงืฆืจื” ื”ื•ื ืžืกื‘ื™ืจ ืœืžื” ืœื ื›ื“ืื™ ืœื›ืชื•ื‘ ืืช ื–ื”:
SELECT u.* FROM users u
WHERE 0 = (SELECT COUNT(*) FROM addresses a WHERE a.user_id = u.id);
ื›ืฉื‘ืขืฆื ื”ื™ื” ืฆืจื™ืš ืœื›ืชื•ื‘ ืืช ื–ื”:
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT FROM addresses a WHERE a.user_id = u.id);
ืื‘ืœ ืื ื™ ื—ื•ืฉื‘ ืฉื”ื ืงื•ื“ื” ืคื” ื™ื•ืชืจ ื’ื“ื•ืœื” ืž SQL ื•ื™ื•ืชืจ ื’ื“ื•ืœื” ืžื‘ืขื™ื™ืช ื‘ื™ืฆื•ืขื™ื ืื—ืช ืคื—ื•ืช: 1. ืงื•ื“ ืจืข ืžืฉืชื›ืคืœ - ื›ืฉืื ื™ ื‘ื•ื“ืง ืื count ืฉืœ ืžืฉื”ื• ืฉื•ื•ื” 0, ื’ื ืื ื‘ืžืงืจื” ื”ืกืคืฆื™ืคื™ ืฉืœื™ ื–ื” ืœื ืฉื‘ืจ ืืช ื”ืžืขืจื›ืช, ืžื™ืฉื”ื• ืื—ืจ ื™ืขืชื™ืง ืืช ื–ื” ื‘ืžืงื•ื ืื—ืจ ื•ืฉื ืื•ืœื™ ื–ื” ื™ื™ืฉื‘ืจ. ืžื‘ื˜ ืงื“ื™ืžื” ืขืœ ืขื•ืœื ื‘ื• AI ื™ื›ืชื•ื‘ ืงื•ื“, ืชื‘ื ื™ื•ืช ืจืขื•ืช ื‘ืงื•ื“ ืฉืœื ื• ื”ื•ืœื›ื•ืช ืœื”ืฉืชื›ืคืœ ื”ืจื‘ื” ื™ื•ืชืจ. 2. ืงื•ื“ ืจืข ื”ื•ื ืžื•ืจื” ืจืข - ืžืชื›ื ืชื™ื ืฆืขื™ืจื™ื ืฉื™ืขื‘ื“ื• ืขืœ ืžืขืจื›ืช ืขื ื”ืจื’ืœื™ื ืจืขื™ื ื™ืืžืฆื• ืืช ืื•ืชื ื”ืจื’ืœื™ื ืจืขื™ื ื•ืืคื™ืœื• ืœื ื™ื“ืขื• ืฉืงื™ื™ืžืช ื“ืจืš ื™ื•ืชืจ ื˜ื•ื‘ื”. ื•ื›ื›ื” ืื ื—ื ื• ืžืงื‘ืœื™ื ืžืคืชื—ื™ื ืขื 5 ืฉื ื™ื ื ื™ืกื™ื•ืŸ ื‘ SQL ืฉืขื“ื™ื™ืŸ ื™ื”ื™ื• ืžื•ืคืชืขื™ื ืœื’ืœื•ืช ืฉื™ืฉ ื“ื‘ืจ ื›ื–ื” EXISTS, ื›ื™ ื”ื ืืฃ ืคืขื ืœื ืจืื• ืื•ืชื• ื‘ืงื•ื“ ืฉืœื”ื. ื•ืคื” ื”ื—ืฉื™ื‘ื•ืช ืฉืœ ื”ื™ื›ืจื•ืช ื˜ื•ื‘ื” ืขื ื”ืฉืคื”: ื›ื›ืœ ืฉืื ื™ ืžื›ื™ืจ ื˜ื•ื‘ ื™ื•ืชืจ ืืช ื›ืœ ื”ืคืงื•ื“ื•ืช ื‘ืฉืคื” ืงืœ ืœื™ ื™ื•ืชืจ ืœืžืฆื•ื ืืช ื”ืคืงื•ื“ื” ืฉืคื•ืชืจืช ืœื™ ืืช ื”ื‘ืขื™ื” ื‘ืฆื•ืจื” ืžื“ื•ื™ืงืช, ื™ืขื™ืœื” ื•ืžืขื‘ื™ืจื” ืืช ื”ืžืกืจ ื”ื ื›ื•ืŸ ืœืืœื” ืฉื™ืงืจืื• ืืช ื”ืงื•ื“.

ToCode
1 418
ื”ืฆืขื” ืœืคืจื•ื™ืงื˜ - ืžื™ืฉื”ื• ืœืœืžื•ื“ ืื™ืชื• ืœื™ืžื•ื“ ื™ื—ื“ ืขื ื—ื‘ืจื™ื ื™ื›ื•ืœ ืœื”ื™ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ืืคืงื˜ื™ื‘ื™ ืžืœื™ืžื•ื“ ืœื‘ื“: ื”ืžื—ื•ื™ื‘ื•ืช ื”ื—ื‘ืจืชื™ืช ืžื’ื‘ื™ืจื” ืืช ื”ืžื•ื˜ื™ื‘ืฆื™ื”, ื—ื‘ืจื™ื ื™ื›ื•ืœื™ื ืœืขื–ื•ืจ ื›ืฉืื ื—ื ื• ื ืชืงืขื™ื ื•ืœื”ืขืœื•ืช ืฉืืœื•ืช ืฉืœื ื—ืฉื‘ื ื• ืขืœื™ื”ืŸ. ืขื›ืฉื™ื• ืขื ื” AI ืืคื™ืœื• ืœื ืฆืจื™ืš ืžื•ืจื” ืฉื™ืœื•ื•ื” ืื•ืชื ื•. ื‘ื”ื™ื ืชืŸ ื ื•ืฉื, ื—ื•ืžืจื™ ืœื™ืžื•ื“ ื•ืจืฉื™ืžืช ืžืฉื™ืžื•ืช ืžืชื›ื ืชื™ื ื‘ืขืœื™ ืžื•ื˜ื™ื‘ืฆื™ื” ื™ื›ื•ืœื™ื ืœื”ื’ื™ืข ืžืื•ื“ ืจื—ื•ืง. ื•ื”ื ื” ืจืขื™ื•ืŸ ืœืคืจื•ื™ืงื˜ ืฆื“ ื ื—ืžื“ ื•ืœื ืงืฉื” ืžื“ื™, ืžืขืจื›ืช ืœื”ืงืžื” ื•ืชืคืขื•ืœ ืงื‘ื•ืฆื•ืช ืœื™ืžื•ื“. ื‘ื’ื“ื•ืœ: 1. ืžืฉืชืžืฉื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื›ื ืก ื•ืœื”ืงื™ื ืžืกืœื•ืœื™ ืœื™ืžื•ื“. ืžืกืœื•ืœื™ ื”ืœื™ืžื•ื“ ื™ื•ื›ืœื• ืœื”ื™ื•ืช ื‘ืชืฉืœื•ื ืื• ื‘ื—ื™ื ื, ื•ื”ื ื›ื•ืœืœื™ื ืกื™ืœื‘ื•ืก ืžืกื•ื“ืจ, ืžืฉื™ืžื•ืช ื•ืื•ืœื™ ืคื™ืชืจื•ื ื•ืช ืขื ื”ืกื‘ืจื™ื. 2. ืžืฉืชืžืฉื™ื ืื—ืจื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื›ื ืก ื•ืœื”ืงื™ื ืงื‘ื•ืฆื•ืช ืœื™ืžื•ื“. ื›ืฉืื ื™ ืžืงื™ื ืงื‘ื•ืฆืช ืœื™ืžื•ื“ ืื ื™ ื‘ื•ื—ืจ ืืช ื”ืฉืขื•ืช ื•ื”ื™ืžื™ื ื‘ื”ื ืžืกืชื“ืจ ืœื™ ืœืœืžื•ื“, ืžืกืคืจ ืขืœ ืขืฆืžื™ ื•ืžื” ื”ืจืžื” ืฉืœื™ ื•ืขื ืื™ื–ื” ืกื•ื’ ืžืคืชื—ื™ื ื”ื™ื™ืชื™ ืจื•ืฆื” ืœืœืžื•ื“. ื‘ื”ืงืžืช ืงื‘ื•ืฆืช ืœื™ืžื•ื“ ืื ื™ ื’ื ื‘ื•ื—ืจ ืืช ืžืกืœื•ืœ ื”ืœื™ืžื•ื“ ืฉืœ ื”ืงื‘ื•ืฆื”. 3. ืžืฉืชืžืฉื™ื ืื—ืจื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื›ื ืก, ืœื—ืคืฉ ืงื‘ื•ืฆื•ืช ืœื™ืžื•ื“ ื•ืœื”ืฆื˜ืจืฃ. ืื ื™ ื—ื•ืฉื‘ ืฉื”ืžืฉื—ืง ืฉืœ ืงื‘ื•ืฆื•ืช ืœื™ืžื•ื“ ื™ื•ืฆื ืžื”ืชื‘ื ื™ืช ืฉืœ ืืชืจื™ ืงื•ืจืกื™ื ื•ืžืฉื ื” ืืช ื”ืคื•ืงื•ืก, ื‘ืžืงื•ื ืœื‘ื—ื•ืจ ืงื•ืจืก ืœืคื™ ื‘ื™ืงื•ืจื•ืช ืื• ืกื™ืœื‘ื•ืก, ืื ื™ ื‘ื•ื—ืจ ืœืคื™ ื”ืื ืฉื™ื ืื™ืชื ืื ื™ ืจื•ืฆื” ืœืœืžื•ื“. ื”ืจื‘ื” ืคืขืžื™ื ื”ืชื•ืฆืื” ืชื”ื™ื” ืœื™ืžื•ื“ ื™ื•ืชืจ ืืคืงื˜ื™ื‘ื™. ื—ื•ืฉื‘ื™ื ืœื‘ื ื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ื•ืจื•ืฆื™ื ืœื”ืชื™ื™ืขืฅ ืขืœ ื˜ื›ื ื•ืœื•ื’ื™ื” ืื• ืืจื›ื™ื˜ืงื˜ื•ืจื”? ืืœ ืชืชื‘ื™ื™ืฉื• ืœื”ืฉืื™ืจ ื”ื•ื“ืขื”. ื‘ื ื™ืชื ืื•ืชื• ืื• ืžืฉื”ื• ื“ื•ืžื”? ืกืคืจื• ืœื™ ืขืœ ื–ื” ื•ืืฉืžื— ืœื”ืฉืชืžืฉ ื•ืœืขื–ื•ืจ ืœื›ื ืœืงื“ื.

ToCode
1 418
ืื™ืš ืœืขื ื•ืช ืขืœ ืฉืืœืช ืจืื™ื•ืŸ ืขื‘ื•ื“ื” ืžื™ืฉื”ื• ืคืจืกื ืฉืืœืช ืจืื™ื•ื ื•ืช ืขื‘ื•ื“ื” ื˜ืคืฉื™ืช ืขืœ JavaScript ื•ืฉืืœ ืžื” ื™ื”ื™ื” ื”ืคืœื˜ ืฉืœ ื”ืชื•ื›ื ื™ืช ื”ื‘ืื”:
function sayHi() {
  console.log(name);
  console.log(age);
  var name = 'Lydia';
  let age = 21;
}

sayHi();
ื–ื” ืœื ื—ืฉื•ื‘ ืขื›ืฉื™ื• ืžื” ื”ืชืฉื•ื‘ื”. ืืชื ื™ื›ื•ืœื™ื ืœืœื›ืช ืœ Chat GPT ืœื‘ืจืจ. ืžื” ืฉื™ื•ืชืจ ืžืขื ื™ื™ืŸ ื–ื” ืžื‘ื ื” ื”ืชืฉื•ื‘ื” ืฉืœ ืื•ืชื• Chat GPT: 1. ื”ืžืฉืคื˜ ื”ืจืืฉื•ืŸ ืžืกื‘ื™ืจ ืืช ื”ืžื˜ืจื” ืฉืœ ื”ืฉืืœื” - ื–ื• ืฉืืœื” ืฉื‘ื•ื“ืงืช ืืช ื”ื”ื™ื›ืจื•ืช ืฉืœืš ืขื ื”ืจืขื™ื•ื ื•ืช ืฉืœ Variable Hoisting ื• Block Scoping ื‘ JavaScript. ื•ื–ืืช ื‘ื“ื™ื•ืง ื”ื“ืจืš ืฉื›ื“ืื™ ืœื”ืชื—ื™ืœ ืชืฉื•ื‘ื” ืœืฉืืœื•ืช ื’ื ื‘ืจืื™ื•ืŸ ืืžื™ืชื™. 2. ืื—ืจื™ ื–ื” Chat GPT ืžืกื‘ื™ืจ ืขืœ ื”ืจืขื™ื•ื ื•ืช ื•ืžืกืคืจ ืžื” ื”ื”ื‘ื“ืœ ื‘ื™ืŸ var ื• let ื‘ื”ืงืฉืจ ืฉืœ ื’ื™ืฉื” ืœืžืฉืชื ื” ืœืคื ื™ ืฉื•ืจืช ื”ื”ื’ื“ืจื” ืฉืœื•. 3. ืœืื—ืจ ืžื›ืŸ ื”ื•ื ืขื•ื‘ืจ ืฉื•ืจื” ืฉื•ืจื” ื•ืžืกื‘ื™ืจ ืžื” ื”ื™ื ืขื•ืฉื” ื•ืœืžื” (ื–ื” ืงืฆืช ืžื™ื•ืชืจ ื‘ืขื™ื ื™ื™). 4. ื•ื‘ืกื•ืฃ ืžืจืื” ืืช ืคืœื˜ ื”ืชื•ื›ื ื™ืช. ืฉืžืชื™ ืœื‘ ืฉื”ื“ื‘ืจ ืฉื”ื›ื™ ื”ืจืฉื™ื ืื•ืชื™ ื‘ืžื ื’ื ื•ืŸ ื”ื™ื” ื›ืฉื”ื“ื‘ืงืชื™ ืืช ื”ืฉืืœื” ื• Chat GPT ื›ืชื‘ ืืช ืฉืžื•ืช ื”ื ื•ืฉืื™ื ืื•ืชื ื”ืฉืืœื” ื‘ืื” ืœื‘ื—ื•ืŸ. ืฉื™ืžื•ืฉ ื‘ืฉืžื•ืช ื”ื ื›ื•ื ื™ื ืžืจืื” ืœื™ ืฉื”ืชืฉื•ื‘ื” ืžืชื™ื—ืกืช ื‘ื“ื™ื•ืง ืœื“ื‘ืจื™ื ืฉืจืฆื™ืชื™ ืœื‘ื“ื•ืง ื•ืžื ื™ื— ืืช ื”ื™ืกื•ื“ื•ืช ืœืชืงืฉื•ืจืช ื˜ื•ื‘ื” ืขืœ ื ื•ืฉืื™ื ืืœื”.

ToCode
1 418
ืกื™ืคื•ืจ, ืžืฉืคื˜ื™ื, ืžื™ืœื™ื. ืœืกื™ืคื•ืจ ื™ืฉ ื”ืชื—ืœื”, ืืžืฆืข ื•ืกื•ืฃ. ืœืคืขืžื™ื ื’ื ืขืœื™ืœื” ื•ื›ืฉื™ืฉ ืœื ื• ืžื–ืœ ื”ื•ื ืžืขื•ืจืจ ืžื—ืฉื‘ื” ื•ืžืขื‘ื™ืจ ืžืกืจ. ืืช ื›ืœ ื”ืืœืžื ื˜ื™ื ื”ืืœื” ืกื•ืคืจื™ื ื‘ื•ื ื™ื ื‘ืืžืฆืขื•ืช ืžืฉืคื˜ื™ื ื”ืžื•ืจื›ื‘ื™ื ืžืžื™ืœื™ื. ืกื•ืคืจื™ื ืฉื•ื ื™ื ื™ื›ื•ืœื™ื ืœื›ืชื•ื‘ ืขืœื™ืœื•ืช ื“ื•ืžื•ืช ื•ืžืกืจื™ื ื“ื•ืžื™ื ื•ืœื”ืฉืชืžืฉ ื‘ืžื™ืœื™ื ืื—ืจื•ืช ืœื’ืžืจื™ - ื•ืœืžืจื•ืช ื”ืขืœื™ืœื” ื”ื–ื”ื” ื‘ืจื•ืจ ืฉื–ื” ืœื ื™ื”ื™ื” ืื•ืชื• ืกื™ืคื•ืจ. ื”ืคืจื˜ื™ื ื—ืฉื•ื‘ื™ื. ื’ื ื”ืงื•ื“ ืฉืœื ื• ืžืกืคืจ ืกื™ืคื•ืจ, ื•ื’ื ืืช ื”ืงื•ื“ ืื ื—ื ื• ื‘ื•ื ื™ื ืžื—ื™ื‘ื•ืจ ืฉืœ ืงื˜ืขื™ ืงื•ื“ ืงื˜ื ื™ื ื™ื•ืชืจ ื“ืจืš ืชื‘ื ื™ื•ืช. ื•ืืคื™ืœื• ืื Chat GPT ืžืกื•ื’ืœ ืœืงื‘ืœ ืžืฉื™ืžื” ื•ืœื”ืฆื™ืข ืžื™ืžื•ืฉ ืžืกื•ื™ื, ื”ื•ื ืœืขื•ืœื ืœื ื™ื—ืœื™ืฃ ืืช ื”ืžืชื›ื ืชื™ื ืฉื™ื›ื•ืœื™ื ืœื›ืชื•ื‘ ืžืกืคืจ ืžื™ืžื•ืฉื™ื ื•ืœื ื•ื•ื˜ ื‘ื™ื ื™ื”ื, ื›ืžื• ืื•ืชื ืกื•ืคืจื™ื ืžื™ื•ืžื ื™ื ืฉื™ื›ื•ืœื™ื ืœื ืกื— ื‘ื“ืจื›ื™ื ืฉื•ื ื•ืช ืืช ืื•ืชื ืจืขื™ื•ื ื•ืช. ื•ื›ืŸ ืชื›ื ื•ืช ื–ื• ืขื‘ื•ื“ื” ื™ืฆื™ืจืชื™ืช, ื•ื”ื™ืฆื™ืจืชื™ื•ืช ื“ื•ืจืฉืช ื”ื™ื›ืจื•ืช ืžืขื•ืœื” ืขื ืชื‘ื ื™ื•ืช ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœืฉืœื‘ ืื•ืชืŸ (ื•ืœืฉื‘ื•ืจ ืื•ืชืŸ) ื‘ื“ืจื›ื™ื ืฉืžืชืื™ืžื•ืช ืœืžืขืจื›ืช ืขืœื™ื” ืื ื—ื ื• ืขื•ื‘ื“ื™ื. ืžืชื›ื ืชื™ื ืžืฉืชืคืจื™ื ื›ื›ืœ ืฉื›ื•ืชื‘ื™ื ื™ื•ืชืจ ืคืจื•ื™ืงื˜ื™ื ื•ืชื•ื›ื ื™ื•ืช, ื›ืฉื ืฉืกื•ืคืจื™ื ืžืฉืชืคืจื™ื ื›ื›ืœ ืฉื™ื›ืชื‘ื• ื™ื•ืชืจ ืกื™ืคื•ืจื™ื. ืื‘ืœ ื‘ืขื‘ื•ื“ื” ืจืง ืขืœ ืคืจื•ื™ืงื˜ื™ื ืžืœืื™ื ื™ืฉ ืชืžื™ื“ ืืช ื”ืกื›ื ื” ืœื“ืœื’ ืขืœ ื“ื‘ืจื™ื ืงื˜ื ื™ื, ืœื—ื–ื•ืจ ืฉื•ื‘ ื•ืฉื•ื‘ ืขืœ ื˜ื›ื ื™ืงื•ืช ืœื ืžืกืคื™ืง ื˜ื•ื‘ื•ืช, ืจืง ื‘ื’ืœืœ ืฉืื ื—ื ื• ื›ื‘ืจ ืจื’ื™ืœื™ื ืืœื™ื”ืŸ. ืœื›ืŸ ื‘ื ื•ืกืฃ ืœืขื‘ื•ื“ื” ืขืœ ืคืจื•ื™ืงื˜ื™ื ื’ื“ื•ืœื™ื ืžืชื›ื ืชื™ื ื˜ื•ื‘ื™ื ืžืฉืงื™ืขื™ื ื’ื ื–ืžืŸ ื‘ืฉื™ืคื•ืจ ืื•ืชืŸ ืชื‘ื ื™ื•ืช ืงื˜ื ื•ืช ืฉืžืจื›ื™ื‘ื•ืช ืืช ื”ืงื•ื“ ืฉืœื ื• - ืชื•ื›ื ื™ื•ืช ืฉืœ ืขืฉืจื•ืช ืฉื•ืจื•ืช ืœื›ืœ ื”ื™ื•ืชืจ ืฉืคื•ืชืจื•ืช ื‘ืขื™ื” ืกืคืฆื™ืคื™ืช, ืžืขื‘ืจ ืขืœ ืžืกืคืจ ืคื™ืชืจื•ื ื•ืช, ื”ืฉื•ื•ืื” ื‘ื™ื ื™ื”ื ื•ื—ื™ืคื•ืฉ ื”ืคื™ืชืจื•ืŸ ื”ืคืฉื•ื˜ ื•ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ. ื•ื›ืŸ ื’ื ื”ื”ื‘ื ื” ืฉืœืคืขืžื™ื ืจืขื™ื•ืŸ ื˜ื•ื‘ ื ืฉื‘ืจ ื›ืฉื”ื“ืจื™ืฉื•ืช ืžืฉืชื ื•ืช, ื•ื”ื”ื™ืžื•ืจ ืื™ื–ื” ื“ืจื™ืฉื•ืช ื”ื•ืœื›ื•ืช ืœื”ืฉืชื ื•ืช. ืืช ื›ืœ ื”ืขื‘ื•ื“ื” ื”ื–ืืช ืžืฉืœื‘ ื‘ืฆื•ืจื” ืžื•ืคืœืื” ืืจื™ืง ื•ื•ืกื˜ืœ ื›ืœ ืฉื ื” ื‘ืคืจื•ื™ืงื˜ Advent Of Code ืฉืœื•, ืฉื ื”ื•ื ืžืฉืชืฃ ื›ืœ ื™ื•ื ื‘ืžื”ืœืš ื“ืฆืžื‘ืจ ื—ื™ื“ืช ืชื›ื ื•ืช ืงื˜ื ื” ื”ืžื•ืจื›ื‘ืช ืžืฉื ื™ ื—ืœืงื™ื, ื•ืจืง ืื—ืจื™ ืคื™ืชืจื•ืŸ ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืžื•ืคื™ืข ื”ื—ืœืง ื”ืฉื ื™. ื”ื—ื™ื“ื•ืช ืžืžื•ืงื“ื•ืช ื‘ื›ื•ื•ื ื” ื•ืžืืคืฉืจื•ืช ืœื”ืชืืžืŸ ืขืœ ื”ื—ืœืงื™ื ื”ืงื˜ื ื™ื ื•ื”ืกืคืฆื™ืคื™ื™ื ื‘ื™ื•ืชืจ ื‘ืงื•ื“: ืœื”ื‘ื™ืŸ ืืช ื”ื“ืจื™ืฉื•ืช, ืœืคืชื•ืจ ื‘ืขื™ื•ืช, ืœื“ืžื™ื™ืŸ ืื™ื–ื” ืฉื™ื ื•ื™ื™ื ื‘ื“ืจื™ืฉื•ืช ื›ื ืจืื” ื™ื’ื™ืขื• ื•ืื– ืœืจืื•ืช ืืช ื”ืฉื™ื ื•ื™ื™ื ื‘ื“ืจื™ืฉื•ืช ืฉืœ ืืจื™ืง ื•ืœื”ืชืื™ื ืืช ื”ืคื™ืชืจื•ืŸ ืฉืœื ื• ืœื“ืจื™ืฉื•ืช ื”ื—ื“ืฉื•ืช. ื”ื™ื•ื ื”ื•ื ื”ื™ื•ื ื”ืจืืฉื•ืŸ ืฉืœ ื“ืฆืžื‘ืจ ื•ื”ื—ื™ื“ื” ื”ืจืืฉื•ื ื” ืฉืœ Advent Of Code ื‘ื“ื™ื•ืง ื”ืชืคืจืกืžื”. ื‘ื”ืฆืœื—ื”. https://adventofcode.com

ToCode
1 418
ืจืื•ื˜ืจื™ื ื ื”ื™ื• ืžืื•ื“ ืžืกื•ื‘ื›ื™ื ื‘ืฉื ื™ื ื”ืื—ืจื•ื ื•ืช ื•ื˜ืื ืกื˜ืืง ืจืื•ื˜ืจ, ืœืžืจื•ืช ื”ื™ื•ืชื• ืขื“ื™ื™ืŸ ื™ื•ืชืจ ืคืฉื•ื˜ ืž React Router, ืขื“ื™ื™ืŸ ื ืฉืืจ ื‘ืžื’ืจืฉ ืฉืœ ื”ืจืื•ื˜ืจื™ื ื”ืžืกื•ื‘ื›ื™ื. ืžื” ืฉืžืกื‘ืš ืื•ืชื• ืœื“ืขืชื™ ื–ื” ืžื ื’ื ื•ืŸ ื” Data Fetching ื”ืžื•ื‘ื ื”, ืฉืžื›ืจื™ื— ืืช ื”ืจืื•ื˜ืจ ืœื›ืœื•ืœ ื›ืœื™ื ืœื ื™ื”ื•ืœ ื” Cache ืฉืœ ื”ืžื™ื“ืข ืฉืžื’ื™ืข ืžื”ืฉืจืช. ืื™ืฉื™ืช ื”ืขื“ืคืชื™ ืืช ื”ื™ืžื™ื ืฉืฉื ื™ ื”ืžื ื’ื ื•ื ื™ื ื”ืืœื” ื”ื™ื• ื‘ืื—ืจื™ื•ืช ืกืคืจื™ื•ืช ืฉื•ื ื•ืช - ื›ืœื•ืžืจ ืืคืฉืจ ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ react-query ืื• RTK Query ื‘ืฉื‘ื™ืœ ืฉืœื™ืคืช ืžื™ื“ืข ื•ื‘ืกืคืจื™ื” ืื—ืจืช ื‘ืฉื‘ื™ืœ ื”ื ื™ืชื•ื‘. ื‘ื›ืœ ืžืงืจื” ื–ื” ื‘ืกืš ื”ื›ืœ ื—ืœื•ืžื•ืช ื ื•ืกื˜ืœื’ื™ื™ื ืฉืœื™ ื›ื™ ืœื ื ืจืื” ืฉืชื”ื™ื” ื“ืจืš ื—ื–ืจื”. ืกืคืฆื™ืคื™ืช ืœื’ื‘ื™ Tanstack Router ื”ืชืœื•ื ื” ื”ื™ื—ื™ื“ื” ืฉืœื™ ื”ื™ื ืฉื‘ื’ืœืœ ื”ื˜ื™ื™ืคืกืงืจื™ืคื˜ ื”ื•ื ื™ื›ื•ืœ ืœื”ื™ื•ืช ืงืฆืช ื ื•ื“ื ื™ืง. ืงื•ื“ื ื›ืœ ื‘ืฉื‘ื™ืœ ืฉืงื•ื‘ืฅ ื” routeTree.gen.ts ื™ืชืขื“ื›ืŸ ื”ืคืจื•ื™ืงื˜ ืฆืจื™ืš ืœืจื•ืฅ ื‘ืžืฆื‘ ืคื™ืชื•ื—, ื›ืœื•ืžืจ npm run dev ืฆืจื™ืš ืœืขื‘ื•ื“. ื ื›ื•ืŸ ืจื•ื‘ ื”ื–ืžืŸ ืื ื™ ืžืฉืื™ืจ ืื•ืชื• ื“ื•ืœืง ืื‘ืœ ืœืคืขืžื™ื ืื ื™ ื’ื ื›ื•ืชื‘ ืงื•ื“ ื›ืฉื”ื•ื ืกื’ื•ืจ ื•ืื– ืฆืจื™ืš ืœื”ืชืขืฆื‘ืŸ ืฉื”ื˜ื™ื™ืคืกืงืจื™ืคื˜ ืœื ืžื–ื”ื” ืืช ื”ื ืชื™ื‘ื™ื ืฉื™ืฆืจืชื™. ื“ื•ื’ืžื” ืฉื ื™ื” ื”ื™ื ื ืชื™ื‘ื™ื ืขื ืคืจืžื˜ืจื™ื, ืฉื“ื•ืจืฉื™ื ืชื—ื‘ื™ืจ ืžื™ื•ื—ื“ ื‘ Link:
<Link to="/posts/$postId" params={{postId: "7"}}>Post 7</Link>
ื ื™ืกื™ื•ืŸ ืœื›ืชื•ื‘ ืืช ื–ื” ื‘ืชื•ืจ ืžื—ืจื•ื–ืช ืคืฉื•ื˜ื” ืฉื•ื‘ืจ ืืช ื˜ื™ื™ืคืกืงืจื™ืคื˜, ื›ืœื•ืžืจ ื–ื” ืœื ืขื•ื‘ื“:
<Link to="/posts/7">Post 7</Link>
ืื‘ืœ ืžืœื‘ื“ ื”ื‘ืขื™ื•ืช ืขื ื”ื˜ื™ื™ืคืกืงืจื™ืคื˜ ื”ืขื‘ื•ื“ื” ืขื ื˜ื ืกื˜ืืง ื‘ื”ื—ืœื˜ ื ืขื™ืžื”. ื ื™ืชื•ื‘ ื‘ืขื–ืจืช ืžืขืจื›ืช ืงื‘ืฆื™ื ืขื•ื–ืจ ืœืฉืžื•ืจ ืขืœ ืกื“ืจ ื‘ืคืจื•ื™ืงื˜ ื•ื’ื ื“ืจืš ื”ื˜ื™ืคื•ืœ ืฉืœื”ื ื‘ืคืจืžื˜ืจื™ื ืžืื•ื“ ื‘ืจื•ืจื” ืจืง ืžื”ืกืชื›ืœื•ืช ืขืœ ืžืขืจื›ืช ื”ืงื‘ืฆื™ื. ื‘ืคื•ืกื˜ื™ื ื”ื‘ืื™ื ืื ื™ ืžืงื•ื•ื” ืœื”ืžืฉื™ืš ืœื—ืงื•ืจ ืื•ืชื• ื•ืœื›ืชื•ื‘ ื™ื•ืชืจ ืœืขื•ืžืง ืขืœ Data API, ืขืœ ื”ื˜ื™ืคื•ืœ ื‘ Redirects ื•ืขืœ ืคืงื•ื“ื•ืช ื ื™ืชื•ื‘ ืžืชื•ืš ื”ืงื•ื“.

ToCode
1 418
ืขืฉืจ ื“ืงื•ืช ืขื Tanstack Router ืขื›ืฉื™ื• ืฉ React Router ืขื“ื›ื ื• ืฉื•ื‘ ืืช ื”ื’ื™ืจืกื”, ื”ืคืขื ื›ื“ื™ ืœื”ืคื•ืš ืœืคืจื™ื™ืžื•ื•ืจืง ื‘ืžื™ื–ื•ื’ ืขื Remix, ืื ื™ ื—ื•ืฉื‘ ืฉื”ื’ื™ืข ื”ื–ืžืŸ ืœื‘ื—ื•ืŸ ืืคืฉืจื•ื™ื•ืช ืื—ืจื•ืช, ื•ื”ืืคืฉืจื•ืช ื”ืคื•ืคื•ืœืจื™ืช ื‘ื™ื•ืชืจ ื”ื™ื•ื ืžืœื‘ื“ React Router ื”ื™ื Tanstack Router. ื‘ื•ืื• ื ืจืื” ืงืฆืช ืงื•ื“ ืœื“ื•ื’ืžื” ื›ื“ื™ ืœื”ื‘ื™ืŸ ืื™ืš ื–ื” ืขื•ื‘ื“. ืงื•ื“ ื”ื“ื•ื’ืžื” ืฉืœ ื”ืคื•ืกื˜ ื–ืžื™ืŸ ื‘ื’ื™ื˜ื”ืื‘ ื‘ืงื™ืฉื•ืจ: https://github.com/ynonp/tanstack-router-simple-demo ืงื•ื‘ืฅ ื” Layout ื˜ื ืกื˜ืืง ืจืื•ื˜ืจ, ื‘ื“ื•ืžื” ืœ next.js, ืขื•ื‘ื“ ืœืคื™ ืฉืžื•ืช ืงื‘ืฆื™ื. ื”ื•ื ืžืชื—ื‘ืจ ืœ vite ื•ื›ืœ ืคืขื ืฉืื ื—ื ื• ืจืฆื™ื ื‘ืžืฆื‘ ืคื™ืชื•ื— ืื• ื‘ื ื™ื™ื” ื”ื•ื ืžื—ืคืฉ ืืช ื”ืงื‘ืฆื™ื ืฉื ืจืื™ื ื›ืžื• ื ืชื™ื‘ื™ื ื‘ืชื™ืงื™ื™ื” ื•ื™ื•ืฆืจ ืžื›ื•ืœื ื™ื—ื“ ืงื•ื‘ืฅ ืžื™ื“ืข ืžืจื•ื›ื– ืขืœ ื ืชื™ื‘ื™ื, ื‘ื• ื”ื•ื ื™ืฉืชืžืฉ ื‘ืงื•ื“ ื›ื“ื™ ืœืกืคืง Type Safety, ื›ืœื•ืžืจ ืืœืžื ื˜ Link ื™ื•ื›ืœ ืœื“ืขืช ืื ื”ื•ื ืžื•ื‘ื™ืœ ืœืžืงื•ื ืฉื‘ืืžืช ืžืชืื™ื ืœื ืชื™ื‘ ืžืชื•ืš ื” Router ื•ืื ื”ื™ืชื” ืฉื’ื™ืืช ื›ืชื™ื‘ ืื– ื ื•ื›ืœ ืœืจืื•ืช ืืช ื–ื” ื›ื‘ืจ ื‘ื–ืžืŸ ื›ืชื™ื‘ืช ื”ืงื•ื“. ื‘ืฉื‘ื™ืœ ืœื”ืชืงื™ืŸ ืืช Tanstack Router ื™ืฉ ืชื”ืœื™ืš ื“ื™ ืžืกื•ืจื‘ืœ ืฉืžืคื•ืจื˜ ื‘ื“ืฃ ื”ื”ืชืงื ื” ืฉืœื”ื: https://tanstack.com/router/latest/docs/framework/react/installation ื‘ื’ื“ื•ืœ ืžื•ืกื™ืคื™ื ืื•ืชื• ืœ vite, ื•ื˜ื•ืขื ื™ื ืื•ืชื• ืžื”ืงื•ื‘ืฅ ื”ืจืืฉื™ ื‘ื™ื™ืฉื•ื. ืื—ืจื™ ื”ื”ืชืงื ื” ืืคืฉืจ ืœื™ืฆื•ืจ ืืช ืงื‘ืฆื™ ื”ื ืชื™ื‘ื™ื ื•ืงื•ื‘ืฅ ื”ื ืชื™ื‘ ื”ืจืืฉื™ ื‘ื“ื•ื’ืžื” ืฉืœื”ื ื ืงืจื __root.tsx. ื–ื” ื”ืงื•ื“ ืฉื”ื ื›ืชื‘ื• ืขื ืงืฆืช ืฉื™ื ื•ื™ื™ื ืฉืœื™:
import { createRootRoute, Link, Outlet } from '@tanstack/react-router'
import { TanStackRouterDevtools } from '@tanstack/router-devtools'

export const Route = createRootRoute({
  component: () => (
    <>
      <div className="p-2 flex gap-2">
        <Link to="/" className="[&.active]:font-bold">
          Home
        </Link>{' '}
        <Link to="/about" className="[&.active]:font-bold ">
          About
        </Link>
        <Link
          to="/posts/$postId"
          params={{postId: "7"}}
          className="[&.active]:font-bold ">
          Read Post
        </Link>
      </div>      
      <hr />
      <Outlet />
      <TanStackRouterDevtools />
    </>
  ),
})
ื”ืคืงื•ื“ื” createRootRoute ืื•ืžืจืช ืฉืžื“ื•ื‘ืจ ื‘ื ืชื™ื‘ ืจืืฉื™ ื›ืœื•ืžืจ ืงื•ื‘ืฅ Layout. ืื•ื‘ื™ืงื˜ ื” component ืฉืœื” ื”ื•ื ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืจืืฉื™ืช ืฉืœ ื”ืขืžื•ื“ ื•ื‘ืชื•ื›ื• ืงื•ืžืคื•ื ื ื˜ืช Outlet ืชืฆื™ื’ ืืช ื”ืชื•ื›ืŸ ื”ืืžื™ืชื™ ื›ืœื•ืžืจ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืฉืžืชืื™ืžื” ืœื ืชื™ื‘ ื”ื ื•ื›ื—ื™. ืžืขืœ ื” Outlet ื™ืฉ ืœื ื• ืชืคืจื™ื˜ ื ื™ื•ื•ื˜ ื•ืžืชื—ืช ื™ืฉ ืœื ื• ืงื•ืžืคื•ื ื ื˜ื” ืฉืœ ื›ืœื™ ืคื™ืชื•ื—. ื›ืœื™ ื”ืคื™ืชื•ื— ื–ื” ื‘ืขืฆื ื—ืœื•ืŸ ืฆืฃ ืงื˜ืŸ ืฉื ื•ืชืŸ ื”ืžื•ืŸ ืžื™ื“ืข ืขืœ ื” Router ื•ื”ื ืชื™ื‘ื™ื ื”ืฉื•ื ื™ื ื‘ื•. ืงื‘ืฆื™ ื”ื ืชื™ื‘ื™ื ืฉื ื™ ื”ืงื‘ืฆื™ื ื”ืื—ืจื™ื ื‘ืชื•ื›ื ื™ืช ื”ื“ื•ื’ืžื” ืฉื”ื•ืฆืขื” ื‘ืชื™ืขื•ื“ ื”ื about.lazy.tsx ื• index.lazy.tsx. ื”ืฉื ืฉืœื”ื ื›ื‘ืจ ืžืกืžืŸ ืœื ื• ืฉืžื“ื•ื‘ืจ ื‘ื ืชื™ื‘ื™ื ืขืฆืœื™ื, ื›ืœื•ืžืจ ืฉื”ืงื•ื“ ืฉืœื”ื ื™ื™ื˜ืขืŸ ืจืง ื›ืฉืžืฉืชืžืฉ ื™ื™ื›ื ืก ืืœื™ื”ื ื‘ืคืขื ื”ืจืืฉื•ื ื”. ื›ืš ื ืจืื” ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ about.tsx:
import { createLazyFileRoute, Link } from '@tanstack/react-router'

export const Route = createLazyFileRoute('/about')({
  component: About,
})

function About() {
  return <div className="p-2">
    Hello from About!
    <Link to='/'>Type Safe?</Link>
  </div>
}
ืœื ืžืกื•ื‘ืš: ื”ืคืงื•ื“ื” createLazyFileRoute ืžืงื‘ืœืช ืืช ื”ื ืชื™ื‘ ื•ืงื•ืžืคื•ื ื ื˜ื” ื•ืžื•ืกื™ืคื” ืื•ืชื• ืœืจืฉื™ืžืช ื”ื ืชื™ื‘ื™ื (ื–ืืช ืฉื ื•ืฆืจืช ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช ื‘ืงื•ื‘ืฅ routeTree.gen.ts). ื” Link ืฉืžื•ืคื™ืข ืฉื ื”ื•ื Type Safe, ื›ืœื•ืžืจ ืื ืื ื™ ืžื ืกื” ืœื›ืชื•ื‘ ืžืฉื”ื• ืฉืœื ืžืชืื™ื ืœืฉื•ื ื ืชื™ื‘ ืžื•ืคื™ืข ืฉื ืงื• ืื“ื•ื ื‘ื’ืœืœ ื”ื˜ื™ื™ืคืกืงืจื™ืคื˜. ื ืชื™ื‘ ื“ื™ื ืžื™ ื‘ืฉื‘ื™ืœ ื”ืžืฉื—ืง ื™ืฆืจืชื™ ืงื•ื‘ืฅ ื ื•ืกืฃ ื‘ืฉื posts/$postId.lazy.tsx ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
import { createLazyFileRoute } from '@tanstack/react-router'

export const Route = createLazyFileRoute('/posts/$postId')({
  component: Post,
})

function Post() {
  const { postId } = Route.useParams()
  return <div className="p-2">This is post number: {postId}</div>
}
ืฉื ื”ืงื•ื‘ืฅ ื›ื‘ืจ ืžืจืžื– ืœื ื• ืฉื™ืฉ ืคื” ืžืฉื”ื• ืžื™ื•ื—ื“. ื”ื“ื•ืœืจ ื‘ืชื—ื™ืœืช ืฉื ื”ืงื•ื‘ืฅ ืื•ืžืจ ืฉ postId ื–ื” ืฉื ืฉืœ ืคืจืžื˜ืจ ื•ื‘ืืžืช ื‘ืชื•ืš ื’ื•ืฃ ื”ืงื•ืžืคื•ื ื ื˜ื” ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ useParams ื›ื“ื™ ืœื’ืฉืช ืœืขืจืš ืฉืœ ืื•ืชื• ืคืจืžื˜ืจ. ืคื” ืืคืฉืจ ืœื”ื•ืฆื™ื ื‘ืงืฉืช ืจืฉืช ื›ื“ื™ ืœืžืฉื•ืš ืžื™ื“ืข ืœื’ื‘ื™ ืื•ืชื• ืคื•ืกื˜ ืœืคื™ ื”ืžื–ื”ื” ืฉืœื•, ืื• ืœื”ื™ืขื–ืจ ื‘ืžื ื’ื ื•ืŸ ื” Data Fetching ื”ืžื•ื‘ื ื” ืฉืœ Tanstack Router (ืขืœื™ื• ืื•ืœื™ ืื›ืชื•ื‘ ื‘ืคื•ืกื˜ ืื—ืจ) ื›ื“ื™ ืœืฉืœื‘ ืืช ื”ืจืื•ื˜ืจ ืขื ืžื ื’ื ื•ืŸ ืฉืœื™ืคืช ื”ืžื™ื“ืข. ืขืœ ืžื” ืืคืฉืจ ืœื”ืชืœื•ื ืŸ?