ToCode
Kanalga Telegram鈥檇a o鈥榯ish
讟讬驻讬诐 拽爪专讬诐 诇诪转讻谞转讬诐 诪讗转 讬谞讜谉 驻专拽
Ko'proq ko'rsatish1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
1 419
讞诪讬砖讛 讟讬驻讬诐 诇讛诪砖讱 诇讬诪讜讚 Vue
讻诇 讛讻讘讜讚! 讛爪诇讞转诐 诇讻转讜讘 讻诪讛 讚讜讙诪讗讜转 讘 Vue 讜讗转诐 诪专讙讬砖讬诐 砖讗转诐 诪讜讻谞讬诐 诇讚讘专 讛讗诪讬转讬. 诇驻谞讬 砖转爪诇诇讜 诇讻转讬讘转 讛诪注专讻转 讛讙讚讜诇讛 讛专讗砖讜谞讛 砖诇讻诐 讗谞讬 专讜爪讛 诇砖转祝 讘驻讜住讟 讝讛 5 讟讬驻讬诐 砖讬注讝专讜 诇讻诐 诇讛转拽讚诐 讘 Vue 讙诐 讗讞专讬 砖诇讘 讛诇讬诪讜讚:
讻转讘讜 谞讻讜谉
诇 Vue 讬砖 Style Guide 专砖诪讬 砖讘谞讜讬 诪-4 讞诇拽讬诐 讘住讚专 讞砖讬讘讜转 讬讜专讚 讜讗转诐 讬讻讜诇讬诐 诇诪爪讜讗 讗讜转讜 讘拽讬砖讜专 讻讗谉:
https://vuejs.org/style-guide/
讙诐 讗诐 转讘讞专讜 诇讗 诇诇讻转 诇驻讬 讻诇 讛注爪讜转 砖诐, 讞砖讜讘 诇讛讻讬专 讻诇 讗讞转 诪讛谞拽讜讚讜转 讜诇讛讘讬谉 诇诪讛 讛讬讗 砖诐. 讗诇讛 讛讚讘专讬诐 讛诪专讻讝讬讬诐 砖讗谞讬 诪砖转讚诇 诇讛讟诪讬注 讘讻诇 驻专讜讬拽讟:
1. 砖诪讜转 拽讘爪讬诐 讜拽讜诪驻讜谞谞讟讜转 - 讬砖 讛诪讜谉 讟讬驻讬诐 砖诐 注诇 讗讬讱 诇拽专讜讗 诇拽讘爪讬诐 讜诇拽讜诪驻讜谞谞讟讜转 讜讗讬讱 诇住讚专 讚讘专讬诐 讘转讬拽讬讜转. 讻砖讗谞讞谞讜 诪拽驻讬讚讬诐 注诇 住讚专 讛专讘讛 讬讜转专 拽诇 诇拽专讜讗 讜诇转讞讝拽 讗转 讛拽讜讚 讘讛诪砖讱.
2. 砖讬诪讜砖 讘 TypeScript - 诇诪专讜转 砖诇讗 讛讜讝讻专 讘诪驻讜专砖 讘诪讚专讬讱, 讛砖讬诪讜砖 讘 TypeScript 讜讘诪讬讜讞讚 讛拽驻讚讛 注诇 讛讙讚专转 讟讬驻讜住讬诐 谞讻讜谞讛 诇 Props 砖诇 拽讜诪驻讜谞谞讟讜转 诪讜讘讬诇 诇拽讜诪驻讜谞谞讟讜转 拽专讬讗讜转 讬讜转专 讜拽诇讜转 讬讜转专 诇转讞讝讜拽讛 讜砖讬诪讜砖 讞讜讝专.
3. 砖讬诪讜砖 讘诪讗驻讬讬谉 key 讘诇讜诇讗讜转.
4. 诇讗 诪注专讘讘讬诐 if 讜 for.
5. 转诪讬讚 诇讛砖转诪砖 讘 scoped 讘讛讙讚专转 讘诇讜拽 style 讜讘讘诇讜拽 script setup 讻讚讬 诇讬爪讜专 拽讜诪驻讜谞谞讟讜转.
讻转讘讜 诪讚讜讬拽
讗转 专讜讘 讛讚讘专讬诐 讘 Vue 讗驻砖专 诇诪诪砖 讘爪讜专讛 诪讚讜讬拽转 讜注诐 诪注讟 Boilerplate Code 讗诐 讘讻诇诇. 讛讚讬讜拽 讛讜讗 讞砖讜讘 砖讻谉 讛讜讗 注讜讝专 诇讛讙讬注 诇讘讬爪讜注讬诐 讬讜转专 讟讜讘讬诐 讜诇拽讜讚 砖拽诇 讬讜转专 诇转讞讝拽. 讚讜讙诪讛 诪讗讜转讜 Style Guide 讛讬讗 砖讘诪拽讜诐 诇讛讙讚讬专 诪砖转谞讛 讻讝讛:
const price = computed(() => {
const basePrice = manufactureCost.value / (1 - profitMargin.value)
return basePrice - basePrice * (discountPercent.value || 0)
})
谞注讚讬祝 诇讛讙讚讬专 砖诇讜砖讛 诪砖转谞讬诐 诪讞讜砖讘讬诐 讻讱:
const basePrice = computed(
() => manufactureCost.value / (1 - profitMargin.value)
)
const discount = computed(
() => basePrice.value * (discountPercent.value || 0)
)
const finalPrice = computed(() => basePrice.value - discount.value)
讗讜 讘讚讜讙诪讛 谞讜住驻转 讘诪拽讜诐 诇讛讙讚讬专:
<template>
<button>脳</button>
</template>
<style scoped>
button {
background-color: red;
}
</style>
谞注讚讬祝 诇讛砖转诪砖 讘讻转讬讘 讛诪讚讜讬拽 讬讜转专:
<template>
<button class="btn btn-close">脳</button>
</template>
<style scoped>
.btn-close {
background-color: red;
}
</style>
讻讬 讝讛 讙诐 转讜专诐 诇讘讬爪讜注讬诐 讜讙诐 诇讗 讬讙专讜诐 诇讛驻注诇转 讻诇诇 讛注讬爪讜讘 讘讟注讜转 注诇 拽讜讚 讞讚砖 砖谞讜住讬祝 诇拽讜诪驻讜谞谞讟讛.
讛注讘专转 诪讬讚注 诪驻讜专砖转
讬砖 讛诪讜谉 讚专讻讬诐 诇专诪讜转 讗转 讛诪谞讙谞讜谉 砖诇 Vue 讜诇讛注讘讬专 诪讬讚注 诪讻诇 诪拽讜诐 诇讻诇 诪拽讜诐. 专讜讘 讛讝诪谉 讝讛 诇讗 诪讛 砖讗谞讞谞讜 专讜爪讬诐. 讻讚讬 诇讻转讜讘 拽讜讚 砖讗驻砖专 讬讛讬讛 诇拽专讜讗 讜诇转讞讝拽 谞注讚讬祝 诇讛注讘讬专 转诪讬讚 Props 诪拽讜诪驻讜谞谞讟讛 注诇讬讜谞讛 诇讬诇讚讬诐, 讜诇讚讜讜讞 注诇 砖讬谞讜讬讬诐 诪讛讬诇讚讬诐 讘讗诪爪注讜转 讗讬专讜注讬诐.
诪讛 砖讬驻讛 讘讛拽驻讚讛 注诇 讛讻诇诇 讛讝讛, 诪注讘专 诇转讜爪讗讛 砖讛讬讗 拽讜讚 讟讜讘 讬讜转专, 讝讛 讙诐 讛转讛诇讬讱 - 讻砖讗谞讞谞讜 诪谞住讬诐 诇讛注讘讬专 诪讬讚注 讘爪讜专讛 讻讝讗转 讜讚讘专讬诐 诇讗 诪住转讚专讬诐, 讜讗讝 讘诪拽讜诐 诇讬讬砖诐 Hack 驻砖讜讟 讜诇砖谞讜转 讗讬讝讛 诪砖转谞讛 专讬讗拽讟讬讘讬 诪诪拽讜诐 诇讗 拽砖讜专 讗谞讞谞讜 诪讗专讙谞讬诐 诪讞讚砖 讗转 讛讬讞住讬诐 讘讬谉 讛拽讜诪驻讜谞谞讟讜转 讻讚讬 砖讚讘专讬诐 讬注讘讚讜 讘爪讜专讛 诪住讜讚专转. 诇讗讜专讱 讝诪谉 讝讛 讘讚讬讜拽 讛转讛诇讬讱 砖讬注讝讜专 诇谞讜 诇诇诪讜讚 讗讬讱 诇讞诇拽 诪注专讻转 诇拽讜诪驻讜谞谞讟讜转 讘爪讜专讛 驻砖讜讟讛.
砖讬诪讜 诇讘 诇注讚讻讜谞讬诐 讘拽讜诪驻讜谞谞讟讜转
讘驻讜拽谞爪讬讜转 诪讞讝讜专 讛讞讬讬诐 砖诇 拽讜诪驻讜谞谞讟讛 讗驻砖专 诇讛驻注讬诇 onUpdated 讻讚讬 诇讛驻注讬诇 拽讜讚 讻诇 驻注诐 砖拽讜诪驻讜谞谞讟讛 诪转注讚讻谞转. 讟专讬拽 驻砖讜讟 讻讚讬 诇讝讛讜转 讘注讬讜转 讗专讻讬讟拽讟讜专讛 讛讜讗 诇讛讜住讬祝 讛讜讚注转 讛讚驻住讛 诇讗讬专讜注 讝讛 讜诇专讗讜转 讗诐 讬砖 诇讻诐 注讚讻讜谞讬诐 砖诇讗 讛转讻讜讜谞转诐 砖讬拽专讜. 讗诐 讝讬讛讬转诐 注讚讻讜谞讬诐 讻讗诇讛 转讜讻诇讜 诇讗专讙谉 诪讞讚砖 讗转 讛诪砖转谞讬诐 讛专讬讗拽讟讬讘讬讬诐 砖诇讻诐 讜诇讞诇拽 讗讞专转 讗转 讛诪注专讻转 诇拽讜诪驻讜谞谞讟讜转 讻讚讬 诇爪诪爪诐 讗讜转诐.
诇讗讜专讱 讝诪谉 诪注拽讘 讗讞专讬 updates 讜诪讜讚注讜转 诇砖讗诇讛 "诪转讬 讛拽讜诪驻讜谞谞讟讛 诪转注讚讻谞转" 讬注讝讜专 诇讻诐 诇讻转讜讘 诪注专讻讜转 讟讜讘讜转 讜讬注讬诇讜转 讬讜转专.
诇讻讜 诇诇诪讜讚 住驻专讬讜转
讬砖 讛诪讜谉 住驻专讬讜转 砖讛讜驻讻讜转 讗转 讛驻讬转讜讞 讘 Vue 诇拽诇 讬讜转专 讜讞讜住讻讜转 诇谞讜 讻转讬讘转 拽讜讚 砖讗谞砖讬诐 讻讘专 讻转讘讜 诇驻谞讬谞讜. 讬讜转专 诪讝讛, 拽专讬讗转 讛拽讜讚 砖诇 讛住驻专讬讜转 讗讜 讞诇拽讬诐 诪诪谞讜 讬讻讜诇讛 诇诇诪讚 讗讜转谞讜 讗讬讱 爪专讬讱 诇讘谞讜转 诪谞讙谞讜谞讬诐 讙谞专讬讬诐 讘注讘讜讚讛 注诐 Vue, 讜砖讬诪讜砖 讘住驻专讬讜转 诪诇诪讚 讗讜转谞讜 讗讬讱 诪诪砖拽 砖诇 拽讜讚 讙谞专讬 爪专讬讱 诇讛讬专讗讜转, 讜讻讱 注讜讝专 诇谞讜 诇拽讘诇 讛砖专讗讛 讻砖讗谞讞谞讜 爪专讬讻讬诐 诇讻转讜讘 拽讜讚 讙谞专讬 诇诪注专讻讜转 砖诇谞讜.
讗谞讬 诪诪诇讬抓 诇诇诪讜讚 诇注讜诪拽 诇驻讞讜转 讗转 讛住驻专讬讜转 讛讘讗讜转:
1. 讛住驻专讬讬讛 nuxt 砖讛讬讗 驻专讬讬诪讜讜专拽 诇驻讬转讜讞 讬讬砖讜诪讬 Full Stack 讘 Vue 讜转转谉 诇讻诐 讛转讞诇讛 诪爪讜讬谞转 诇驻专讜讬拽讟 Vue 讛讘讗 砖诇讻诐.
2. 讛住驻专讬讛 Vue Router 砖诪讗驻砖专转 驻讬转讜讞 Single Page Apps 讘爪讚 诇拽讜讞.1 419
讗谞讬 讞讬讬讘 诇讛讜讚讜转 砖讗谞讬 注讚讬讬谉 诇讗 专讜讗讛 讗讬讱 驻拽讜讚转
use 转讛驻讜讱 诇诪砖讛讜 砖讗谞砖讬诐 讬专爪讜 诇讛砖转诪砖 讘讜 讘诇讬 注讟讬驻讛 诪住讜讚专转 砖诇 住驻专讬讛 讗讘诇 讬诪讬诐 讬讙讬讚讜. 讘砖讘讬诇 讛诪砖讞拽 诪讜讝诪谞讬诐 诇讛砖讜讜转 讘讬谉 讛拽讜讚 讛讝讛 诇诪谞讙谞讜谉 讛诪拽讘讬诇 砖诇 vue 注诇讬讜 讻转讘转讬 讻讗谉:
https://www.tocode.co.il/blog/2024-10-vue-async-fetch
讚注转讬 讛讗讬砖讬转 砖讛诪谞讙谞讜谉 砖诇 vue 讛专讘讛 讬讜转专 驻砖讜讟 讜讛专讘讛 驻讞讜转 诪讘诇讘诇.1 419
拽讜诪驻讜谞谞讟讜转 讗住讬谞讻专讜谞讬讜转 讘专讬讗拽讟 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.1 419
谞讬住讜讬 专讬讬诇住 - 砖讬诪讜砖 讘 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-demo1 419
讬爪讬专转讬 讗讜 讬爪专谞讬
砖转讬 诪讬诇讬诐 诪讗讜讚 讚讜诪讜转 讘注讘专讬转 注诐 诪砖诪注讜转 砖诇驻注诪讬诐 谞专讗讬转 讛驻讜讻讛. 讗谞砖讬诐 "驻专讜讚讜拽讟讬讘讬讬诐" 诪讬讬爪专讬诐 讚讘专讬诐 讜讙讜专诪讬诐 诇讞讘专讛 诇驻注讜诇. 讗谞砖讬诐 "拽专讬讗讬讬讟讬讘讬讬诐" 诪诪爪讬讗讬诐 专注讬讜谞讜转 讞讚砖讬诐, 住讬驻讜专讬诐, 讗讜诪谞讜转, 砖讬专讬诐. 讘讟讞 砖讻讚讗讬 诇讛讬讜转 讬爪讬专转讬 讗讘诇 讝讛 讛驻专讜讚讜拽讟讬讘讬 砖诪砖诇诐 讗转 讛讞砖讘讜谉. 讗讜 诇驻讞讜转 讻讻讛 讞砖讘谞讜.
讘注讜诇诐 砖诇 讛讬讜诐 讗诇讛 砖转讬 诪讬诇讬诐 砖讛讜诇讻讜转 讬讞讚 讬讚 讘讬讚. 讗谞讞谞讜 诇讗 爪专讬讻讬诐 注讜讚 诪讻讜谞讬讜转, 注讜讚 讟诇讜讜讬讝讬讜转 讗讜 注讜讚 谞讬讬专 讟讜讗诇讟, 讗驻讬诇讜 讗诐 转爪诇讬讞讜 诇讬讬爪专 讗讜转讜 拽爪转 讬讜转专 讬注讬诇 讗讜 拽爪转 讬讜转专 讝讜诇. 讛驻专讜讚讜拽讟讬讘讬讜转 讛讬讜诐 讛讬讗 拽讜讚诐 讻诇 讛讬讻讜诇转 诇专讗讜转 诪讛 讗谞砖讬诐 爪专讬讻讬诐 讜诇讛诪爪讬讗 驻讬转专讜谞讜转 诇讘注讬讜转 砖讗讞专讬诐 注讜讚 诇讗 专讗讜. 拽专讬讗讬讬讟讬讘讬讜转 讛讬讗 讛讘住讬住 诇驻专讜讚讜拽讟讬讘讬讜转.
1 419
砖转讬 讚专讻讬诐 诇讛专讙讬注 讗转 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 诪拽讜诪驻讜谞谞讟讛 注诇讬讜谞讛 讬讜转专 诇讗 谞专讗讛 砖讙讬讗讛 讘拽讜谞住讜诇 讗诇讗 专拽 讟拽住讟讬诐 专讬拽讬诐. 讻谞专讗讛 砖讙诐 讝讛 诇讗 谞讜专讗 讻讬 讝讗转 砖讙讬讗讛 砖诪讗讜讚 拽诇 诇讝讛讜转.
讗讬讝讛 诪砖转讬 讛讙讬砖讜转 讗转诐 诪注讚讬驻讬诐? 讗讜 砖讗讜诇讬 讬砖 诇讻诐 讟讻谞讬拽讛 讗讞专转? 诪讜讝诪谞讬诐 诇住驻专 讘转讙讜讘讜转 讗讜 讘讟诇讙专诐.1 419
注讜讚 讻诪讛 讘注讬讜转 注诐 注讘讜讚讛 诪讬讜转专转
讛驻讜住讟 讻讗谉 谞讜讙注 讘谞拽讜讚讛 讟讜讘讛 诇讙讘讬 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, 讻讬 讛诐 讗祝 驻注诐 诇讗 专讗讜 讗讜转讜 讘拽讜讚 砖诇讛诐.
讜驻讛 讛讞砖讬讘讜转 砖诇 讛讬讻专讜转 讟讜讘讛 注诐 讛砖驻讛: 讻讻诇 砖讗谞讬 诪讻讬专 讟讜讘 讬讜转专 讗转 讻诇 讛驻拽讜讚讜转 讘砖驻讛 拽诇 诇讬 讬讜转专 诇诪爪讜讗 讗转 讛驻拽讜讚讛 砖驻讜转专转 诇讬 讗转 讛讘注讬讛 讘爪讜专讛 诪讚讜讬拽转, 讬注讬诇讛 讜诪注讘讬专讛 讗转 讛诪住专 讛谞讻讜谉 诇讗诇讛 砖讬拽专讗讜 讗转 讛拽讜讚.1 419
讛爪注讛 诇驻专讜讬拽讟 - 诪讬砖讛讜 诇诇诪讜讚 讗讬转讜
诇讬诪讜讚 讬讞讚 注诐 讞讘专讬诐 讬讻讜诇 诇讛讬讜转 讛专讘讛 讬讜转专 讗驻拽讟讬讘讬 诪诇讬诪讜讚 诇讘讚: 讛诪讞讜讬讘讜转 讛讞讘专转讬转 诪讙讘讬专讛 讗转 讛诪讜讟讬讘爪讬讛, 讞讘专讬诐 讬讻讜诇讬诐 诇注讝讜专 讻砖讗谞讞谞讜 谞转拽注讬诐 讜诇讛注诇讜转 砖讗诇讜转 砖诇讗 讞砖讘谞讜 注诇讬讛谉.
注讻砖讬讜 注诐 讛 AI 讗驻讬诇讜 诇讗 爪专讬讱 诪讜专讛 砖讬诇讜讜讛 讗讜转谞讜. 讘讛讬谞转谉 谞讜砖讗, 讞讜诪专讬 诇讬诪讜讚 讜专砖讬诪转 诪砖讬诪讜转 诪转讻谞转讬诐 讘注诇讬 诪讜讟讬讘爪讬讛 讬讻讜诇讬诐 诇讛讙讬注 诪讗讜讚 专讞讜拽. 讜讛谞讛 专注讬讜谉 诇驻专讜讬拽讟 爪讚 谞讞诪讚 讜诇讗 拽砖讛 诪讚讬, 诪注专讻转 诇讛拽诪讛 讜转驻注讜诇 拽讘讜爪讜转 诇讬诪讜讚. 讘讙讚讜诇:
1. 诪砖转诪砖讬诐 讬讻讜诇讬诐 诇讛讬讻谞住 讜诇讛拽讬诐 诪住诇讜诇讬 诇讬诪讜讚. 诪住诇讜诇讬 讛诇讬诪讜讚 讬讜讻诇讜 诇讛讬讜转 讘转砖诇讜诐 讗讜 讘讞讬谞诐, 讜讛诐 讻讜诇诇讬诐 住讬诇讘讜住 诪住讜讚专, 诪砖讬诪讜转 讜讗讜诇讬 驻讬转专讜谞讜转 注诐 讛住讘专讬诐.
2. 诪砖转诪砖讬诐 讗讞专讬诐 讬讻讜诇讬诐 诇讛讬讻谞住 讜诇讛拽讬诐 拽讘讜爪讜转 诇讬诪讜讚. 讻砖讗谞讬 诪拽讬诐 拽讘讜爪转 诇讬诪讜讚 讗谞讬 讘讜讞专 讗转 讛砖注讜转 讜讛讬诪讬诐 讘讛诐 诪住转讚专 诇讬 诇诇诪讜讚, 诪住驻专 注诇 注爪诪讬 讜诪讛 讛专诪讛 砖诇讬 讜注诐 讗讬讝讛 住讜讙 诪驻转讞讬诐 讛讬讬转讬 专讜爪讛 诇诇诪讜讚. 讘讛拽诪转 拽讘讜爪转 诇讬诪讜讚 讗谞讬 讙诐 讘讜讞专 讗转 诪住诇讜诇 讛诇讬诪讜讚 砖诇 讛拽讘讜爪讛.
3. 诪砖转诪砖讬诐 讗讞专讬诐 讬讻讜诇讬诐 诇讛讬讻谞住, 诇讞驻砖 拽讘讜爪讜转 诇讬诪讜讚 讜诇讛爪讟专祝.
讗谞讬 讞讜砖讘 砖讛诪砖讞拽 砖诇 拽讘讜爪讜转 诇讬诪讜讚 讬讜爪讗 诪讛转讘谞讬转 砖诇 讗转专讬 拽讜专住讬诐 讜诪砖谞讛 讗转 讛驻讜拽讜住, 讘诪拽讜诐 诇讘讞讜专 拽讜专住 诇驻讬 讘讬拽讜专讜转 讗讜 住讬诇讘讜住, 讗谞讬 讘讜讞专 诇驻讬 讛讗谞砖讬诐 讗讬转诐 讗谞讬 专讜爪讛 诇诇诪讜讚. 讛专讘讛 驻注诪讬诐 讛转讜爪讗讛 转讛讬讛 诇讬诪讜讚 讬讜转专 讗驻拽讟讬讘讬.
讞讜砖讘讬诐 诇讘谞讜转 讗转 讛驻专讜讬拽讟 讜专讜爪讬诐 诇讛转讬讬注抓 注诇 讟讻谞讜诇讜讙讬讛 讗讜 讗专讻讬讟拽讟讜专讛? 讗诇 转转讘讬讬砖讜 诇讛砖讗讬专 讛讜讚注讛. 讘谞讬转诐 讗讜转讜 讗讜 诪砖讛讜 讚讜诪讛? 住驻专讜 诇讬 注诇 讝讛 讜讗砖诪讞 诇讛砖转诪砖 讜诇注讝讜专 诇讻诐 诇拽讚诐.
1 419
讗讬讱 诇注谞讜转 注诇 砖讗诇转 专讗讬讜谉 注讘讜讚讛
诪讬砖讛讜 驻专住诐 砖讗诇转 专讗讬讜谞讜转 注讘讜讚讛 讟驻砖讬转 注诇 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 讻转讘 讗转 砖诪讜转 讛谞讜砖讗讬诐 讗讜转诐 讛砖讗诇讛 讘讗讛 诇讘讞讜谉. 砖讬诪讜砖 讘砖诪讜转 讛谞讻讜谞讬诐 诪专讗讛 诇讬 砖讛转砖讜讘讛 诪转讬讞住转 讘讚讬讜拽 诇讚讘专讬诐 砖专爪讬转讬 诇讘讚讜拽 讜诪谞讬讞 讗转 讛讬住讜讚讜转 诇转拽砖讜专转 讟讜讘讛 注诇 谞讜砖讗讬诐 讗诇讛.1 419
住讬驻讜专, 诪砖驻讟讬诐, 诪讬诇讬诐.
诇住讬驻讜专 讬砖 讛转讞诇讛, 讗诪爪注 讜住讜祝. 诇驻注诪讬诐 讙诐 注诇讬诇讛 讜讻砖讬砖 诇谞讜 诪讝诇 讛讜讗 诪注讜专专 诪讞砖讘讛 讜诪注讘讬专 诪住专. 讗转 讻诇 讛讗诇诪谞讟讬诐 讛讗诇讛 住讜驻专讬诐 讘讜谞讬诐 讘讗诪爪注讜转 诪砖驻讟讬诐 讛诪讜专讻讘讬诐 诪诪讬诇讬诐. 住讜驻专讬诐 砖讜谞讬诐 讬讻讜诇讬诐 诇讻转讜讘 注诇讬诇讜转 讚讜诪讜转 讜诪住专讬诐 讚讜诪讬诐 讜诇讛砖转诪砖 讘诪讬诇讬诐 讗讞专讜转 诇讙诪专讬 - 讜诇诪专讜转 讛注诇讬诇讛 讛讝讛讛 讘专讜专 砖讝讛 诇讗 讬讛讬讛 讗讜转讜 住讬驻讜专. 讛驻专讟讬诐 讞砖讜讘讬诐.
讙诐 讛拽讜讚 砖诇谞讜 诪住驻专 住讬驻讜专, 讜讙诐 讗转 讛拽讜讚 讗谞讞谞讜 讘讜谞讬诐 诪讞讬讘讜专 砖诇 拽讟注讬 拽讜讚 拽讟谞讬诐 讬讜转专 讚专讱 转讘谞讬讜转. 讜讗驻讬诇讜 讗诐 Chat GPT 诪住讜讙诇 诇拽讘诇 诪砖讬诪讛 讜诇讛爪讬注 诪讬诪讜砖 诪住讜讬诐, 讛讜讗 诇注讜诇诐 诇讗 讬讞诇讬祝 讗转 讛诪转讻谞转讬诐 砖讬讻讜诇讬诐 诇讻转讜讘 诪住驻专 诪讬诪讜砖讬诐 讜诇谞讜讜讟 讘讬谞讬讛诐, 讻诪讜 讗讜转诐 住讜驻专讬诐 诪讬讜诪谞讬诐 砖讬讻讜诇讬诐 诇谞住讞 讘讚专讻讬诐 砖讜谞讜转 讗转 讗讜转诐 专注讬讜谞讜转. 讜讻谉 转讻谞讜转 讝讜 注讘讜讚讛 讬爪讬专转讬转, 讜讛讬爪讬专转讬讜转 讚讜专砖转 讛讬讻专讜转 诪注讜诇讛 注诐 转讘谞讬讜转 讻讚讬 砖讗驻砖专 讬讛讬讛 诇砖诇讘 讗讜转谉 (讜诇砖讘讜专 讗讜转谉) 讘讚专讻讬诐 砖诪转讗讬诪讜转 诇诪注专讻转 注诇讬讛 讗谞讞谞讜 注讜讘讚讬诐.
诪转讻谞转讬诐 诪砖转驻专讬诐 讻讻诇 砖讻讜转讘讬诐 讬讜转专 驻专讜讬拽讟讬诐 讜转讜讻谞讬讜转, 讻砖诐 砖住讜驻专讬诐 诪砖转驻专讬诐 讻讻诇 砖讬讻转讘讜 讬讜转专 住讬驻讜专讬诐. 讗讘诇 讘注讘讜讚讛 专拽 注诇 驻专讜讬拽讟讬诐 诪诇讗讬诐 讬砖 转诪讬讚 讗转 讛住讻谞讛 诇讚诇讙 注诇 讚讘专讬诐 拽讟谞讬诐, 诇讞讝讜专 砖讜讘 讜砖讜讘 注诇 讟讻谞讬拽讜转 诇讗 诪住驻讬拽 讟讜讘讜转, 专拽 讘讙诇诇 砖讗谞讞谞讜 讻讘专 专讙讬诇讬诐 讗诇讬讛谉. 诇讻谉 讘谞讜住祝 诇注讘讜讚讛 注诇 驻专讜讬拽讟讬诐 讙讚讜诇讬诐 诪转讻谞转讬诐 讟讜讘讬诐 诪砖拽讬注讬诐 讙诐 讝诪谉 讘砖讬驻讜专 讗讜转谉 转讘谞讬讜转 拽讟谞讜转 砖诪专讻讬讘讜转 讗转 讛拽讜讚 砖诇谞讜 - 转讜讻谞讬讜转 砖诇 注砖专讜转 砖讜专讜转 诇讻诇 讛讬讜转专 砖驻讜转专讜转 讘注讬讛 住驻爪讬驻讬转, 诪注讘专 注诇 诪住驻专 驻讬转专讜谞讜转, 讛砖讜讜讗讛 讘讬谞讬讛诐 讜讞讬驻讜砖 讛驻讬转专讜谉 讛驻砖讜讟 讜讛讟讜讘 讘讬讜转专. 讜讻谉 讙诐 讛讛讘谞讛 砖诇驻注诪讬诐 专注讬讜谉 讟讜讘 谞砖讘专 讻砖讛讚专讬砖讜转 诪砖转谞讜转, 讜讛讛讬诪讜专 讗讬讝讛 讚专讬砖讜转 讛讜诇讻讜转 诇讛砖转谞讜转.
讗转 讻诇 讛注讘讜讚讛 讛讝讗转 诪砖诇讘 讘爪讜专讛 诪讜驻诇讗讛 讗专讬拽 讜讜住讟诇 讻诇 砖谞讛 讘驻专讜讬拽讟 Advent Of Code 砖诇讜, 砖诐 讛讜讗 诪砖转祝 讻诇 讬讜诐 讘诪讛诇讱 讚爪诪讘专 讞讬讚转 转讻谞讜转 拽讟谞讛 讛诪讜专讻讘转 诪砖谞讬 讞诇拽讬诐, 讜专拽 讗讞专讬 驻讬转专讜谉 讛讞诇拽 讛专讗砖讜谉 诪讜驻讬注 讛讞诇拽 讛砖谞讬. 讛讞讬讚讜转 诪诪讜拽讚讜转 讘讻讜讜谞讛 讜诪讗驻砖专讜转 诇讛转讗诪谉 注诇 讛讞诇拽讬诐 讛拽讟谞讬诐 讜讛住驻爪讬驻讬讬诐 讘讬讜转专 讘拽讜讚: 诇讛讘讬谉 讗转 讛讚专讬砖讜转, 诇驻转讜专 讘注讬讜转, 诇讚诪讬讬谉 讗讬讝讛 砖讬谞讜讬讬诐 讘讚专讬砖讜转 讻谞专讗讛 讬讙讬注讜 讜讗讝 诇专讗讜转 讗转 讛砖讬谞讜讬讬诐 讘讚专讬砖讜转 砖诇 讗专讬拽 讜诇讛转讗讬诐 讗转 讛驻讬转专讜谉 砖诇谞讜 诇讚专讬砖讜转 讛讞讚砖讜转.
讛讬讜诐 讛讜讗 讛讬讜诐 讛专讗砖讜谉 砖诇 讚爪诪讘专 讜讛讞讬讚讛 讛专讗砖讜谞讛 砖诇 Advent Of Code 讘讚讬讜拽 讛转驻专住诪讛. 讘讛爪诇讞讛.
https://adventofcode.com
1 419
专讗讜讟专讬诐 谞讛讬讜 诪讗讜讚 诪住讜讘讻讬诐 讘砖谞讬诐 讛讗讞专讜谞讜转 讜讟讗谞住讟讗拽 专讗讜讟专, 诇诪专讜转 讛讬讜转讜 注讚讬讬谉 讬讜转专 驻砖讜讟 诪 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 讜注诇 驻拽讜讚讜转 谞讬转讜讘 诪转讜讱 讛拽讜讚.