ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
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
# ืืืจืื ืงืื: ืฉืืืคื ืืืกืืก ื ืชืื ืื ื Node.JS ืืืฆืืช ืืืืืข ืืืืื ื HTML
ืืคืืกื ืื ืืืืื ืืื ืืืชืื ืืคืืืงืฆืืืช Node.JS ื Express ืคืฉืืื, ืฉืฉืืืคืช ืืืืข ืืืกืืก ื ืชืื ืื ืืืืฆืขืืช ืกืคืจืืืช Knex.JS ืืืฆืืื ืืืชื ืืชืืจ ืืืื ื HTML. ืืกืจื ืืกืืื ืืช ืืื ืืื ืืืืื ืื ืืืื ืขื ืืืกืืจ ืืืงืคืืฅ ืืฉืจ ืืงืื ืืืืืจ:
https://github.com/ynonp/node-knex-ejs-demo
ืืื ืืฉืืจ - ืืืื ื ืจืื ืืื ืื ืขืืื.
## ืื ืื ืื ื ืืื ืื
ืืืฉืืื ืืืืจืื ืืื ืืืื ืคืฉืืื - ืืฉ ืื ื ืืคืืืงืฆืืืช Node.JS ืฉืืฉืชืืฉืช ื Express ืื EJS. ืื ื ืืืืข ืืืื ืจืืืืื ืืจืืืช ืจืืืงื ื Ajax ืืคืจืืืืืืจืงืก ืืชืืืืืื ืฉื ืคืจืื ื ืื ื, ืืื ืืืืช ืฉืืฉ ืืจืื ืืคืืืงืฆืืืช ืืขืืื ืฉืขืืืื ืืชืืืืช ืืืืฉื ืืงืืืกืืช ืฉื ืืฆืืจืช HTML ืืฆื ืฉืจืช, ืืืื ืืคืืืงืฆืืืช ืืืฉืืช.
ืืื ืืงืจื ืืืขืจืืช ืืืืืื ืฉืื ื ืืื ืืืืช - ืืฉ ืื EJS View ืฉื ืจืื ืืขืจื ืื:
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
</body>
</html>
ืืขืืฉืื ืื ืื ื ืจืืฆืื ืืืืจ ืืืชื ืืืกืืก ื ืชืื ืื. ืืฉืืื ืืืืืื ืืฆืจืชื ืืกืืก ื ืชืื ืื ืืกืื SQLite3 ืขื ืืืื ืืืช ืืฉื users ืืืชืืื ืื ืชืื ืื ืืืืื:
sqlite> select * from users;
user|user@mysite.com
admin|admin@mysite.com
info|info@mysite.com
sales|sales@mysite.com
ืืขืืืื ืืจืืฉืื ื ืงืืจืืื name ืืืฉ ืื ืืช ืฉื ืืืฉืชืืฉ ืืืขืืืื ืืฉื ืื ืงืืจืืื email ืืืื ืืืืื ืืช ืืชืืืช ืืืืื ืฉื ืืืฉืชืืฉ.
## ืืงืืืฅ lib/db.js
ืื ื ืืืื ืืืชืืื ืืงืืืฅ ืืืืืจ ืืืกืืก ื ืชืื ืื. ืื ืืฉืืืคืืช ืืชืืืืืืช ืื ืืืขืจืืช ืืืืื ืืืื ืื ื ืื ืืืชืื ืืงืืืฅ ืืื ืื ืคืื ืงืฆืืืช ืขืืจ ืืฉืืืคืืช, ืืื ืืืืืื ืฉืื ื ืืื ืขืืืื ืคืฉืื ืืืื ืืกืคืืง ืืืชืื ืื ืืช ืงืื ืืืืืืจ ืืืกืืก ืื ืชืื ืื ืืืืืฆื ืืื ื ืืช ืืืืืืงื knex, ืืืชื ืงืื ืืืฆืื ื ืืืื ืืืชืื ืืช ืืฉืืืคืืช:
const knex = require('knex')({
client: 'sqlite3', // or 'better-sqlite3'
connection: {
filename: "./mydb.sqlite"
},
useNullAsDefault: true,
});
module.exports = knex;
## ืืงืืืฅ routes/index.js
ืืชืื ื ืืฉื ืื ืืื ืงืื ืืืืคืื ืืืงืฉื ืืงืืืฅ routes/index.js. ืงืื ืื ืฆืจืื ืืฉืืืฃ ืืช ืืืืืข ืืืกืืก ืื ืชืื ืื. ืื ืขืื ืื ืื ื ืืืืขืื ืฉืืื ืืจืื ืืืืข ืืคืฉืจ ืืืฉืชืืฉ ื:
router.get('/', async function(req, res, next) {
const users = await knex('users').select('*');
res.render('index', { title: 'Express', users: users });
});
ืืื ืฉืืืื ืืืชืจ ืืื ื ืฆืืจื ืืฉืืืฃ ืจืง "ืืฃ" ืืื ืืื ื ืืืืฆืขืืช ืืืกืคืช limit. ื ืจืฆื ืื ืืชืช ืืืฉืชืืฉืื ืืคืฉืจืืช ืืืขืืืจ ืคืจืืืจืื ืืื ืืงืืืข ืืื ืจืฉืืืืช ืืืื ืืืฃ ืืืืืื ืืฃ ืืฆืคืืช, ืืืืขืจืืืช ืขืื ืืืชืจ ืืืจืืืืช ื ืจืฆื ืืงืื ืื ืคืจืืืจืื ืขืืืจ ืกืื ืื ืื - ืืืืืื ืคืจืืืจ ืฉืืืืข ืืืืฉืชืืฉ ืฉืืืืจ ืฉืฆืจืื ืืืฆืื ืจืง ืืช ืืืฉืชืืฉืื ืฉืืจืืข ืืืืืจืื ืืืขืจืืช. ืฉืื ืืืื ืืื ืืฉืคืืขืื ืขื ืฉืืจืช ืืฉืืืคื, ืื ืฉืื ืื ืืฉื ื ืืืืจืื ืืืฉืืืื ืืคืื ืงืฆืื ืืงืื ื ืืื:
1. ืื ื ืืฉืชืืฉ ื await ืืื ืืงืื ืืช ืืชืืฆืืืช ืืืฉ ืฉื ืืฉืืืคื, ืืื ืืช ืืฉืืืคื ืขืฆืื.
2. ืื ื ืืขืืืจ ืืช ืืชืืฆืืืช ื View.
## ืืฆืืช ืืืืืข ืืืืื ืืงืืืฅ views/index.ejs
ืืงืืืฅ ืืืืจืื ืืื ื View. ืงืืืฅ ืื ืจืฅ ืืืืืื ืขื ืืจืฉืืืืช ืืืฉืชื ื users ืืืื ื ืืื ืืืืช HTML:
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<p>All users = <%= JSON.stringify(users) %></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<% for (user of users) { %>
<tr>
<td><%= user.name %></td>
<td><%= user.email %></td>
</tr>
<% } %>
</tbody>
</table>
</body>
</html>
ืื ื ืืืกืคืชื ืื ืืืคืกื ืฉื ืื ืื ืชืื ืื ืืคืืจืื JSON ืืฉืืื ืฉื ืืื ืืืืืช ืืืืืื ืฉืืืืื ืืฆืืื ืืช ืื ืืืืืข. ืืืืื ืฉืืืขืจืืช ืืืืชืืช ืื ืืฉืื ืฉื ืจืฆื ืืืืจืื.
## ืื ืืืื
ืจืืื ื ืืคืืกื ืืช ืืืกืืื ืฉืขืืืจ ืืืืข ืืืกืืก ืื ืชืื ืื, ืืจื ืงืื ืฆื ืฉืจืช ืืขื ืฉืืืคื ื HTML. ืืืจืืื ืืืจืืืืช ืืืืืื ืืืืช ืชืืื ืงืืืช ืคืจืืืจืื ืืืืฉืชืืฉ ืืื ืืืฆืื ืจืง ืืืง ืืืืืืข ืืืฉืจ ืืฉ ืืืืื ืืืกืืก ืื ืชืื ืื ืืืชืจ ืืื ืืืืข.
ืกืคืจืื ืืขื ืืื ืช ืืืงืฉืจ ืืื ืืื knex-paginate, ืฉืชืชื ืืื ืืืชืื ืงืื ืืื:
const result = await knex('persons')1 419
# ืืืื ืืืืชื: ืืกืืื ื ืงืืืืชืืื ืกืืืฉ ืืืื
ืืืืื ืคืกื, ืงืืื ืืืค ืืื ืงืฆืจ ืฉืื ื ืืืืืชื ืืืืจืื ื ืืืืื ืืขืืืจ ืื ืืื - ืืืื ืืกืืื ื ืงืืืืชืืื ืืืืจืื ืืืืกื.
ืืฉืืขืืช ืืกืืื ืืื ืืชืืงืื ืืจืืฉืืช ืืคืจืืืงื, ืืืื ืืืคืฉืจ ืื ื ืืืจืืฅ ืคืงืืืช ืืื ืขื ืืชืืงืื ืืจืืฉืืช ืื ืื ืืจืืข ืื ืื ื ืืชืื ืืืืืฉืื ืชืช ืชืืงืื.
ืืืืืืืช? ืืื-
ื ื ืื ืฉืืชื ืจืืฆืื ืืจืืืช ืืช ืื ืืงืืฆืื ืฉืืื ืขืืงื ืืืจืืื ืืืืืจ, ืืื ืืชื ืืจืืข ืืชืื ืชืืงืื ืคื ืืืืช. ืืชื ืืืชืืื:
$ git ls-files
ืืื ืืงืืืื ืืืื ืื ืืงืืืื ืจืง ืืช ืืงืืฆืื ืฉื ืืฆืืื ืืฆืืื ืืชืืงืื ืืคื ืืืืช. ืืืงืื ืื, ืชืืืื ืืืชืื:
$ git ls-files :/
ืืชืงืืื ืืช ืจืฉืืืช ืื ืืงืืฆืื ืฉืืืขืงื.
ืื, ื ื ืื ืฉืืชื ืืืืชื ืชืืงืื ืคื ืืืืช ืืืืคืขืืช ืกืืืืก ืืชื ืืงืืืื:
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ../agenda.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
./
../react-list/
no changes added to commit (use "git add" and/or "git commit -a")
ืื ืฉืืืืจ ืฉืื ืืชืืงืื ืฉืื ื ื ืืฆื ืื ืืื ื ืฉืืืจื ืืืื, ืื ืืงืืืฅ agenda.md ืฉื ืืฆื ืืชืืงืื ืืขืืื ืืฉืชื ื ืืื ืืชืืงืื react-list ืฉื ืืฆืืช ืืชืืงืื ืืขืืื ืืื ื ืฉืืืจื ืืืื.
ืืืฆื ืืื ืื ื ืืืืข ืฉืื ื ืืืื ืืืคืขืื add ืขื ืืชืืงืื ืฉืืืืืง ืืขืืื ืืื ืืืืกืืฃ ืืช ืฉืืืฉืช ืืงืืฆืื, ืืื ืืื ืฉืืฉืื ืืืื ืืืื ืืคืืืจืื ืืืืชืจ ืชืืงืืืช ืื ืืืื ืืืื ืืกืืื. ืืืงืื ืื ืื ื ืืคืขืื:
$ git add :/
ืืืืกืืฃ ืืืื ืืงืก ืืช ืื ืืงืืฆืื ืฉืืฉืชื ื ืืื ืืคืจืืืงื.1 419
ืืืชืจืื ืจืืฉืื ืฉืื ืื ื ืจืืืื ืืืชืงื ืช git-lfs ืืื ืฉืคืขืืืืช add ื commit ืืืคืืืช ืืืจืื ืืจืื ืืืชืจ ืืืืจืืช. ืืกืืื ืืื ืฉืืื ืื ืกื ืืืืืฅ ืงืืฆืื ืฉืืื ืืื ืืก ืืืืืจ, ืืืืืืฅ ืงืืืฅ ืืื ืืจื ืขื ืง ืืื ืคืฉืื ืืืืื ืืื. ืขื git lfs ืื ืื ื ืืืกืืื ืืช ืืืืืื ืืื.
ืืืชืจืื ืฉื ื ืืืืื ืืืชืจ ืืืืื ืืื ืืืคืฉืจืืช ืืขืฉืืช clone ืืืืืจ ืืื ืืงืืฆืื ืืืืืืื. ืืคืงืืื:
$ GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/ynonp/large-files-with-lfs.git skip-smudg
e
ืืฉืืคืืช ืืช ืืืืืจ ืชืื ืืืืื ืขื ืืฉืืืช ืืงืืฆืื ืืืืืืื ืืืฉืืจืช ืจืง ืืืืืข ืืื ืืืชื ืขืืืื. ืืืจื ืืคืขืื ืื ื ืืืื ืืจืืืช ืฉืชืืงืืืช ืืขืืืื ืฉืื ื ืฉืืจื ืงืื ืืื ืช (ืืืืืื ืคืขืืืช ื clone ืืืชื ืืืื ืืืืจื):
$ cd skip-smudge
$ du -sh .
140K .
ืื ื ื ืกื ืืืกืชืื ืขื ืชืืื ืืงืืืฅ ื ืงืื ืืช ืืืชื ืืืจืกื ืฉืืืชื ืฉืืืจื ืืืืืจ:
$ cat myfile.bin
version https://git-lfs.github.com/spec/v1
oid sha256:fc4d5fa4f28329049cb1c1bdda562a7e6aa3472efbf94cc280f1f2aa9c6790a5
size 104857600
ืืืชื ืฉืืฆืืจื ืื ื ืืืื ืืืืจืื ืืช ืืงืืฆืื ืืืืืืื ืืืืจืกื ืฉืืจืืข ื ืืฆืืช ืืฆืื ืขื ืืคืงืืื:
$ git lfs pull
ืืืืืื ืฉืื ื ืืคืงืืื ืืืจืืื ืจืง ืขืืชืง ืืื ืฉื ืืงืืืฅ myfile.bin ืืื ืืช ืฉื ื ืืขืืชืงืื ืฉืืฉ ืืืืืจ.1 419
# ืืืจืื: ืืืืกืื ืงืืฆืื ืืืืืื ืืืื ืขื git lfs
ืืืื ืืืืจืื ืฉืืื ืื ืืื ืืืืืกืื ืงืืฆืื ืืื ืืจืืื. ืืคืืกื ืื ืื ื ืจืืฆื ืืืกืืืจ ืงืฆืช ืื ืืืขืื ืฉื ืืื ืขื ืงืืฆืื ืืื ืืจืืื ืืืืืื, ืืืืจืืืช ืืช ืืชืืกืฃ git lfs ืฉืคืืชืจ ืืืง ืืืื ืืืืชื ืืขืื.
## ืืืืื ืขื ืงืืฆืื ืืืืืื
ืืืจื ืืื ืงืื (ืืืจืืื ื ืืื ื) ืืืฉืื ืขื ื ืืืื ืืืืืข ืฉื ืืื ืืื ืฉืื ืงืืืื ืืืื ืืื ืขืืชืง ืฉื ืื ืชืืงืืืช ืืขืืืื ืืจืืข ืืกืืื. ืืชืื ืืืงืฉืจ ืืื ืืจืืจื ืืืขืื ืขื ืงืืฆืื ืืืืืื - ืื ื ืฉืืจืื ืฉืื ืืฉืื ืืื ืคืืื ืืช ืืืืืจ.
ื ืืฆืืจ ืืฉืืื ืืืืืื ืืืืจ ืขื ืงืืืฅ ืืืื. ืื ื ืืคืขืื ืืช ืืคืงืืื:
$ dd if=/dev/random of=myfile.bin bs=1m count=100
ืืืงืื ืงืืืฅ ืืฉื myfile.bin ืืืืื 100 ืืื. ืืืจื ืื ืื ื ืืืฆืจ ืืืืจ ืืื ืืืืกืืฃ ืืช ืืงืืืฅ ืืืืืจ ื-ืืืค, ืืคืจืืืงื ืฉืื ืชืืคืก ืืืจ 200 ืืื - ืื ืืฉ ืื ืขืืชืง ืืื ืฉื ืืงืืืฅ ืืืืื ืืชืืงืืืช ืืขืืืื ืืขืืชืง ื ืืกืฃ ืืืืืจ ืืชืืงืืืช .git. ืื ืื ื ืืืฆืจ ืืืจืกื ื ืืกืคืช ืฉื ืืงืืืฅ ืืืืกืืฃ ืื ืืืชื ืืืืืจ ืืชืืงืื ืชืขืืืจ ืืืจ ืืช ื 300 ืืื.
ืื ืืืืจ ืฉืืฉืื ื ืืืืฃ ืืช ืืืืืจ ืืืืืืื ืื ื ืฆืจืื ืืืขืืืช 300 ืืื. ืืฉืืืฉืื ืืืจ ืืืจืื ืขืืชืง ืฉื ืืืืืจ ืืื ืฆืจืื ืืืืจืื 300 ืืื. ืืืื ืฉืืืื ืืืชืจ ืืืจืกืืืช ืืงืืืฅ ืืืืื, ืื ืืืืื ืฉื ืืืืืจ ืืืื ืืื ืืคืขืืืืช ืืืื ืืืืืืช ืืฆืืจื ืืืจืืฉืช.
## ืื ืื ืื git lfs
ืืชืืกืฃ git lfs ืขืืฉื ืืืจ ืืืื - ืืืงืื ืืฉืืืจ ืืช ืืงืืฆืื ืืืืืืื ืืืืืจ, ืืื ืืืื ืืืชื ืืืืืง ืืคื ื ืฉืื ื ืื ืกืื ืืืืืจ ืืืขืืืจ ืืืชื ืืชืืงืื ืืืจืช, ืฉืืื ื ืืืง ืืืืืืจ. ืืชืื ืืจืืคื ืืืฉืืจื ืจืง ืืฆืืืขืื ืืืืชื ืงืืฆืื, ืืื ืฉืืจืฆื ืืช ืืงืืฆืื ืืืืืืื ืืฆืืจื ืืืืจืื ืืืชื ืื ืคืจื.
ืืชืืงืื ืืืืจืช ืืืจื ืืื ืชืฉื ืืชืื ืชืืงืืืช .git ืืืฉืืื ืืืืื ืืช ืืงืืฆืื ืืืืืืื ืืชืืงืื ืืืืืืืช git lfs ืืฉืชืืฉ ื filter, ืฉืื ืื ืื ืื ืฉื ืืื ืฉืืืคืฉืจ ืืืจืืฅ ืคืงืืื ืืคื ื ืฉืงืืืฅ ื ืื ืก ืืจืืคื ืืคืงืืื ืืืจืช ืืฉืืงืืืฅ ืฆืจืื ืืฆืืช ืืืจืืคื ืืชืืงืืืช ืืขืืืื.
ืืฉืืื ืืขืืื ืขื git lfs ืืชื ืฆืจืืืื ืืืชืงืื ืืช ืืชืืกืฃ ืืื ืืืขืจืืช ืฉืืื ืืืืชืจ ืฉืืื:
https://git-lfs.github.com/
ืืืืจื ืื ืืื ืจืืคื ืฉืจืืฆืื ืืขืืื ืืืชื ืฆืจืื ืืืคืขืื ืืชืื ืชืืงืืืช ืืจืืคื:
$ git lfs install
## ืืื ืื ืขืืื
ืืืืื? ืืจืืจ. ืืฆืจืชื ืจืืคื ืฉืืฉ ืื ืงืืืฅ ืืืื ืืืคืขืืชื ืืชืืื ืืช:
$ git lfs install
ืืฉืืื ืฉ git lfs ืืืื ืืขืฉืืช ืืช ืืงืกื ืฉืื.
ืืคืงืืื ืืจืืฉืื ื ืฉืฆืจืื ืืืืืจ ืืื git lfs track. ืืงืืืฅ ืฉืื ืงืืจืืื myfile.bin ืืืื ืื ื ืืคืขืื:
$ git lfs track -f myfile.bin
ืืื ืืกืื ื git lfs ืฉืืงืืืฅ myfile.bin ืืื ืงืืืฅ ืืืื ืืฆืจืื ืืืคื ืื ืืืชืื. ืืคืฉืจ ืื ืืืขืืืจ ื track ืชืื ืืืช ืืงืืฆืื (ืืื ืืืืชืจืื ืขื ื -f) ืืืฉื:
$ git lfs track "*.bin"
ืืืืจ ืืื ืืืฆืจ ืงืืืฅ .gitattributes ืื ืื ืงืืื ืืฆืืื ืืชืืงืื (ืื ืืืกืืฃ ืฉืืจื ืืงืืืฅ ืื ืืืจ ืงืืื), ืืฉื ืืื ืืกืื ืฉืืงืืืฅ ืื ืืชืื ืืช ื ืื ืกืื ืืืขืงื:
$ cat .gitattributes
myfile.bin filter=lfs diff=lfs merge=lfs -text
ืขืืฉืื ืืคืฉืจ ืืืืกืืฃ ืืช ืืงืืืฅ ืืืืืจ:
$ git add myfile.bin
$ git commit -m 'initial commit'
ืืืคืืื ืืืื ืืก ืืืจืกื ื ืืกืคืช ืฉืื:
$ dd if=/dev/random of=myfile.bin bs=1m count=100
$ git commit -a -m 'commit 2'
ืืืื ืืื ืืื ืชืืฆืืืช ืืขื ืืื ืืช. ืืจืืฉืื ื ืืื ืฉืชืืงืืืช .git/objects ืฉืื ืืืฉ ืงืื ื:
$ du -sh .git/objects
32K .git/objects
ืืื ืืืื ืฉืืงืืฆืื ืขืฆืื ื ืฉืืจืื ืืชืืงืื ืืืจืช:
$ du -sh .git/lfs/objects
200M .git/lfs/objects
ืืืฉืื ื ืืกืชืื ืืชืื ืืจืืคืืืืืืจื ืขื ืืงืืืฅ:
$ git ls-files --stage -- myfile.bin
100644 e0ffbeb5780cceeeef67522f4bc092751c4e7409 0 myfile.bin
$ git cat-file blob e0ffbeb5780cceeeef67522f4bc092751c4e7409
version https://git-lfs.github.com/spec/v1
oid sha256:fc4d5fa4f28329049cb1c1bdda562a7e6aa3472efbf94cc280f1f2aa9c6790a5
size 104857600
ืื ื ืจืืื ืฉืื ื ืื ืืงืื ืืช ืชืืื ืืงืืืฅ ืืื ืจืง ืฉืืืฉ ืฉืืจืืช ืฉืืกืคืจืืช ืืฉืื ืขื ืืงืืืฅ ืืืงืืจื. ืื ืื ืื ืฉ git lfs ืฆืจืื ืืฉืืื ืืืืื ืืช ืืงืืืฅ ืืืืื ืืืงืืจื ืื ื ืืงืฉ ืืื ื.
ืืจืืข ืืงืืฆืื ืืืืืืื ื ืืฆืืื ืืฆืื ืืชืืงืืืช ืืขืืืื ืืื ืืฉืื ื ืืืืฃ ืืช ืืคืจืืืงื ืฉืื ืืืืืืื ืื ืืืฉืืื ืืฉื. ืืคืจืืืงื ืืืืืื ื ืืฆื ืืื:
https://github.com/ynonp/large-files-with-lfs
## ืื ืืจืืืื ื1 419
# ืคืืืืช ืืืคืืืืื ืืืคืื
ืืืชืื ืชืื ืฆืขืืจืื ืจืืื ืืื ืืขืื ืืืื ืืืฆืขืืช ืืจืืืงืืช ืืืช, ืืืื ืืก ืืืื ืืืฉืื ืืคืจืืืืืืจืงืื ืืืฉืื ืืืขืจืืช ืืืคืืื ืืืืื ืืืืขืืืจ ืืจืฆืืืช ืขื ื ืืฉืืื ืฉืื ืืืขื ืื ืืืืจืื. ืืืชื ืืชืื ืชืื ืืืื ืื ืืช ืืคืืื ืฆืืื ืืืื ืืืื ืฉืืืืื ืืฆืืืจ, ืืืืืขืื ืฉืืืืื ืืื ืืื ืืจืื ืืื ืืืื ืืืื.
ืืื ืฉืื ืื ื ืืืืื ืืืืื ืืช "ืืงืืช ืกืืืื ืื" ื ืืืฉืช. ืืจืืื ืฉืืฆื ืื ืืืืื ืืก ืืื ืืืฉ ืืืขืจืืช ืืื ืื ืจืื ืื ืืืื, ืืืกืืืื ืืฉืืขืืชื. ืืชืื ืชืช ืืืชืืงื ืขืฉืืื ืืืจืืืฉ ืฉืืฆืคืื ืืื ื ืืืืืจ ืืขืืืง ืืื ืืกืืื ืืคื ื ืฉืืื ืืืืืฆื ืขืืื ืืฆืืืช; ืืื ืืืืขืช ืืืืืง ืื ืื ืืืืจ "ืืืืืจ ืืขืืืง" ืื ืืื ืืืืจื ืืขืืืง ืืช ืืืืื ืฉืขืืฉืื ืขืืืืื ืืืชื, ืืืืืขืช ืฉืืจืืข (ืื ืืขืชืื ืื ืจืื ืืขืื) ืืื ืื ืืื ืืืืื ืืขืืืง ืืช ืืืชื ืืื ืืืฉ.
ืืคืื ืืืคืืืืื ืืืคืื ืืื ืื ืฉืขืฆืจ ืืืชื ืืฉืืืื ืขืืจื ื perl ื python: ืืืขืชื ืฉืืฉืื ื ืืืืข ืืืงืื ืืขืืืจ ืืืขืืืช ืคืจื ืื ืืฉื ื ืื ืืืื ืื ื ืืืื ืืืฆืื ืื ืคืืชืจืื ืืื, ืื ืืืจ ืจืืืชื ืืื ืกืืฃ ืืขืืืช ืคืจื ืืคืืชืจืื ืืช ืฉืืื ืืืืชื ืชืงืืคื. ื python ืืกืืคืืจ ืืื ืฉืื ื ืืืืจื - ืืืืืจืืช ืฉืื ืขื ืคืืืชืื ืืืชื ืืืืืืช, ืืืคื ื ืฉืจืืืื ืคืจืืืงืืื ืืคืืชืจืื ืืขืืืช ืื ืืคืฉืจ ืืืืช ืืงืื ืืืืืื. ืคืจืืืื ืกืจืื ืฆืขืืจืื ืืื ื ื ืื ืกื ืืื ืืืชืืืื ืืคืจืืืงืืื ืืคืืืชืื, ืืื ื ืืกืชืืืชื ืืืฆื ืืืืืืชื, ืืืื ืฉืืืืืชื ืืงืคืืฆื ืจืง ื ืจืืชื ืืืชืจ ืงืฉื.
ืืืขืื ืขื ืืคืื ืืืคืืืืื ืืื ืฉืืื ืืงืจื ืกืคืฆืืคื ืืืืืื ืืงืืช ืกืืืื ืืื ืืืืช ืืืืื ืืืชืจ ืงืฉื. ืื ืืื ืืืจ ืืฆื ืื ืืืงืืช ืคืจืืืงื ืืืขืืฅ ืืคืืืชืื ืืฉืื ื ืื ืืืืข ืืกืคืืง ืืื ืคืืืชืื? ืื ื ืจืง ืืฉื ืืืื ืฉืขืืช ืขื ืื ืืขืื ืงืื ื, ืืืกืืฃ ืืชื ืืืงืื ืงืื ืืื ืื ื. ืืื, ืืฉืืกืชืืืื ืขื ืืชืืื ื ืืืืืื, ืืจืืจ ืฉืืืจื 3-4 ืคืจืืืงืืื ืื ื ืืืจ ืืืืจ ืืช ืืฉืคื ืืืฉ ืืื ืืืืื ืืืืืช ืืืขืื ืืขืฆืื ืืืกืืืื.
ืืืฉืืืืจืื ืืขืืืื ืืืื ืืืืืช ืืืชืื ืชืช ืืฆืืืช - ืืืืืืฅ ืขื ืืื ืืืื ืฉืืืื ืื ืืขืืื ืืื ืื ืืกืืื, ืืื ืืืืืช ืืืช ืฉืืืืืฆื ืขื ืืื ืืืืืืืช ืืืฉืืช ืื ืืืจ ืืฉืื ืฉืฉืืื ืืฉืืืฃ ืืืื. ืืขื ืืื ืฉืืืจื ืชืืื ืขืืืจืช ืืจื ืืคืืืืื, ืืจื ืืคืขื ืืจืืฉืื ื, ืืจื ืื ืคืืื.
ืืืงืื ืืคืื ืืืคืืืืื ืืืคืื - ืืืื ืืืชืจืื ืคืฉืื ืืืคืื. ืืืคืื ืืช ืื ืคืืื ืืืืง ืืืืืื ืืืืืื ืฉืืืืื ืืจืืืง, ืืฉืื ืื ื ืืื ืื ืกืื ืื ืืืื ืฉืื ืื ืคืืื ืืื ืื ืคืืืืื ืืื ืืืง ืืืืื ืืื ืฉืื ื, ืื ืื ื ืจืง ืืจืืืืืื.
1 419
# ืื ืื ืื ืืืืื ื Tailwind CSS
ืืคื ื ืืื ืฉื ืื ืืงืืชื ืคืจืืืื ืกืจ ืืขืืืจ ืืื ืืืช HTML ื CSS ืืืชืจ ืฉืืืืชื ืฆืจืื ืืืงืื. ืืคืจืืืื ืกืจ ืขืื ืืขืืื ืืืฆืจ ืงืื ืฉืืชืืื ืืืืืืง ืืขืืฆืื ืฉืืื ืื ื, ืืื ื ืืืืชื ืืืื ืฉืืฆืืชื ืืช ืืืจื ืื ืืืืฉืจ.
ืขื ืฉืืืื ื ืฆืจืืืื ืืฉื ืืช ืืฉืื.
ืื ืืืขืื ืขื CSS ืืื ืฉืืื ืชืืื ืฉื ืืืื: ืืืคืืื ืฉื ืืืื ืืืคื ืขื ืืืื ื ืืกืืื ืืฉืคืืข ืขื ืืืืคื ืืฆื ืืืืืื ืฉืื, ืืืคืืื position ืืืืื ื ืืกืืื ืืฉืคืืข ืขื ืืืชื ืืืืช ืฉื ืืืคืืื ื top ื left ืืฆื ืืืืืื ืฉืื. ืืงืืฆืืจ CSS ืืจืืืฉ ืืื ืืืื ืงืืคืื - ืื ืขืืื, ืืื ืฉืื ืื ืืื ืงืื ืืืืจืื ืืืฆืืื ืืืืงืื.
ื ืฉืืื ืืช ืื ื Tailwind CSS, ืฉืืื, ืืืืืช ืื ืืืงืืจืืื ืฉืื ืืืืจืื, ืคืจืืืืืืจืง ืฉืืขืืืจ ืืช ื CSS ืืชืื ื HTML, ืื ืืืื ืืืชืจ ื ืืื ืื ืกื ืืช ืื ืืชืืจ ืคืจืืืืืืจืง ืฉืืืฆืจ ืืื ืืืช ืืืืจืืช CSS ืฉืืชืืืืืช ืืงืืืกืื ืขื ืฉืืืช ืืืื ืืกืืืืื ื HTML.
ืื ื Tailwind CSS ืื ื ืืืื ืืืชืื ืฉืืจืช HTML ืืืืช:
<img
src="http://placekitten.com/100/100"
alt="cat"
class="py-4 pl-4 aspect-square"
/>
ืืื ื ืืงืื ืชืืื ื ืฉื ืืชืืชืื ืขื ืจืืคืื ืขืืืื ืืจืืคืื ืืฉืืื ืฉื 16 ืคืืงืกืืื ืื ืืื ืืืืคืืื aspect-ratio ืขื ืขืจื ืฉื 1/1.
ืืื ืื ืื ืืืืื ืืืืขืืืจ ืืช ืื ืืืื ืืขืืฆืื ื HTML? ืื ื ืืืืจ ืืกืืคืืจ ืฉื ืืคืจืืืื ืกืจ, ืืชืืืง ืงืื Tailwind CSS ืฉื ืืืฉืื ืืืจ (ืืื ืื ืฉืื ืื ื ืืืืจืื ืืืืืืืื ื) ืื ืืจืื ืืืชืจ ืงื ืืืชืืืง ืงืื CSS ืฉื ืืืฉืื ืืืจ. ืื ื ืื ืฆืจืื ืืืืื ืก ืืืืืื ืืืื ืงืืืกืื ืืื ืืืจ ืืื ืืืื ื ื HTML ืฉืืชืืื ืืงืื ื CSS ืืงืืื; ืืื ืคืฉืื ืืืคืืข ืืื ืืขืื ืืื.
ืจืืฆืื ืืืขืช ืขืื ืขื ืืืืืืืื ื ืืืงืืืกืื ืฉืื? ืืคืืกื ืืื ืืื ืืงืื ืืื ืืืชืืื ืื:
https://codingthesmartway.com/tailwind-css-for-absolute-beginners/
ืืืืืื ืืชืืขืื ืืืขืืื ืฉืืื ืืงืืฉืืจ:
https://tailwindcss.com/docs/installation1 419
# ืงืื ืืืืืื
ืืื ืืื ืืืื ืืืืจ ืขื ืงืื ื ืงื - ืงืื ืฉืืื ืื ืืืจืืช, ืฉืืกืืืจ ื ืืื, ืฉืงื ืืืจืืื ืืืชื, ืฉืงื ืืงืจืื ืืืชื, ืฉืขืืฉื ืืืืืง ืืช ืื ืฉืฆืจืื ืืื ืขืืฉื ืืืจืื ืฉืื ืฆืจืื. ืื ืืื ืืื ืจืืฆื ืืืชืื ืจืง ืงืื ื ืงื ืื ืืืื.
ืืื ืื ื ืืงื ืืช ืืืืืคืืจื ืฉื ืงืื ื ืงื ืืจืฆืื ืืช, ื ืฉืื ืื ืฉืฉืื ืืืจ ืื ืืืฆื ื ืงื ืืืืคืขื, ืืฉืขื ืืืื ืื ืืืจืื ื ืงืืื ืืชืืืืืื.
ืืื ืื ืงืื: ืื ืืกืืื ืืจืืฉืื ืืคืืชืจืื ืืขืื ืื ืืืฆื ื ืงื. ืืืจื ืืงืืืื ืฆืจืื ืื ืงืืช, ืืืืืจ ืืขืฉืืช Refactoring, ืืืืกืืฃ ืชืืขืื ืืืืชืื ืืืืงืืช. ืื ืืืจื ืฉืขืฉืื ื ืืช ืืื ืืื ืืกืคืจ, ืชืื ืืื ืฉืืืขืืช ืื ืืืืฉืื ืืงืื ืืชืืืื ืฉืื, ืืืืืง ืืื ืื ืืืจ ืืืจ ืืขืืื.
ืงืื ื ืงื ืืื ืื ืชืืฆืื ืฉื ืืชืื ืชืื ืืืื ืื ืฉืืืืขืื ืืื ืืืชืื ืงืื, ืืืื ืื ืชืืฆืื ืฉื ืฉืื ืื ืืืืืื ืื ืืกืืื ืืืืช ืืคื ืืกืคืจ. ืงืื ื ืงื ืืื ืชืืฆืื ืฉื ืืืฉื ืืฉืืืช ืขืืืื. ืฉืืื ืฉืืฉืืืจื ืืื ืื ืืชื ืช ืขืืืคืืช ืื ืื ืืงืืื ืืื ืจืง ืืคืืชืื ืืจืืฉืื ื. ืงืื ื ืงื ืืื ืื ืืฆื ืงืืื ืืื ืชืืืื, ืชืืืื ืฉืืชืืื ืืงืื ืืืืืื.
1 419
ืืขืื ืขืฉืจ ืืงืืช ืืชืืืืื ืืืืื ืจ ืขื Solid.JS, ืืืืื ืื ืืืืื ืก ืืงืืฉืืจ:
1 419
ืื ืืืงืจ ืืื ืืืืื ืืืืืจ ืฉืืืื ืืขืฉืจ ื ืงืืื ืืืืื ืจ ืขื Solid Js
ืชืืฃ ืืฉืื ืคื ืืช ืืืื ืง ืืื ืืกื
1 419
ืืชืืงืืืช
src/app ืฉื ืืคืจืืืงื ืชืืืื ืืืฆืื ืงืืืฅ ืืฉื store.js ืฉืืืืืง ืืช ืืชืืื ืืื:
import { configureStore } from '@reduxjs/toolkit';
import memoryReducer from '../features/memory/memorySlice';
import memory from '../features/memory/memoryMiddleware';
export const store = configureStore({
reducer: {
memory: memoryReducer,
},
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(memory),
});
ืชืืฃ ื ืืืจ ืขื ืืืืืืืืจ, ืืื ืืื ืชืืื ืืืื ื ืชืืงื ื Reducer - ืืคืื ืงืฆืื configureStore, ืื ืืื ื Redux Toolkit, ืืืืืจื Redux Store ืืคื ืจืฉืืืช ื Reducers ืฉืชืขืืืจื ืื, ืืืช ื Reducer ืื ื ืืืืื ืืืงืืืฅ ืืงืืื ืฉืืชืื ื.
## ืงืืืคืื ื ืืช ืจืืืงื
ืืืืง ืืื ืืื ืืขืืืื ืขื ืจืืืืงืก ืืื ืฉืื ืืืืืืงื ืืืจ ืงืืืืช ืืื ืงืฉืจ ืืืืฉืง, ืืืื ืืฉืื ื ืืืืข ืืืชืื ืงืืืคืื ื ืืช ืจืืืงื ืื ื ืืกื ืืื ืฆืจืื ืืืืื ืืืื "ืืืืข" ืืฉืคืืข ืขื ืืงืืืคืื ื ืื ืืืืื ืคืขืืืืช ืืื ืืืืื ืืขืฉืืช.
ืืืงืจื ืฉื ืืฉืืง ืืืืืจืื ืืืืืข ืืื ืจืฉืืืช ืืงืืคืื ืืืคืขืืื ืืืืืื ืืื ืืืืืฅ ืขื ืงืืฃ. ืื ื ืืงืื ืฉื ืืงืืืคืื ื ืื:
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import {
play,
selectCards,
} from './memorySlice';
import './memory.css';
export function MemoryGame() {
const cards = useSelector(selectCards);
const dispatch = useDispatch();
return (
<div>
{cards.map((c, i) => (
<div
className={c.hidden
? "card hidden" : c.found
? "card found" : "card"
}
onClick={() => dispatch(play(i))}
key={i}
>
{c.value}
</div>
))}
</div>
);
}
## ืืืืืืืืจ
ืขื ืืคื ืืื ืืืื ืืืืืช ืื ื ืงืื ืฉืืจืื ืจืฉืืืช ืงืืคืื ืืืืฉืฃ ืงืืคืื ืืฉืื ืื ื ืืืืฆืื ืขืืืื, ืืื ืฆืืืข ืืฆืืื ืงืืคืื ืืืื ืฉืืฆืื ื. ืืฉืืื ืืฉืืง ืืืืชื ืื ืื ื ืฆืจืืืื ืื ืืืกืชืืจ ืืืืจื ืืช ืืงืืคืื ืืืื Redux Middleware ืืื ืคืืชืจืื ืฉืืชืืื ืืื ืืคืคื ืืื:
1. ืื ืคืขื ืฉืื ื ืฉืืื ืคืงืืืช play ืืืืืืืืจ ืืืื ืืืจืืฅ ืืช ืืคืงืืื ืืืืืืง ืื ืืืจื ืฉืืกืชืืืื ืืฉ ืฉื ื ืงืืคืื ืืืืืื ืฉืขืืืื ืื ืืฆืื ื ืืช ืืืื ืฉืืื. ืื ืื, ืืื ืืฉืื ืืืืืจ ืฉื ืฉืชื ืฉื ืืืช ืืืขืื ืฉืชื ืฉื ืืืช ืืฉืื ืืงืฉื ืืืคืื ืืืชื.
2. ืื ืคืขื ืฉืื ื ืืงืื ืคืงืืืช play ืืคื ื ืืจืฆืช ืืคืงืืื ืืืืืืืืจ ืืืืืง ืื ืืฉ ืืืื ืืืืืจ ืคืขืื, ืืื ืื ืืื ืืืื ืืืชื ืืคืฉืื ืืจืืฅ ืืื ืืช ืืืืคืืก. ืืืืฉืื ืืื ืืื ืฉืื ืืืฉืื ืืืืฅ ืขื ืงืืฃ "ืฉืืืฉื" ืฆืจืื ืืื ืืืกืชืืจ ืืช ืฉื ื ืืืืืืื ืืืชืืจ ืืงืืื.
ืืงืื ืฉืืชืืื ืืชืืืืจ ืืืืืืื ืฉืื ืืื ืืกื ืืื:
const gameMiddleware = ({ dispatch, getState }) => next => action => {
// before play, if we're waiting for a "check" we'll
// cancel the timer, check immediately and then continue
// to play
if (action.type === play.type && activeTimer) {
clearTimeout(activeTimer);
activeTimer = null;
dispatch(check());
}
let result = next(action)
// after play we count 2 seconds and check the status
if (action.type === play.type) {
if (selectVisibleCards(getState()).length === 2) {
activeTimer = setTimeout(() => {
dispatch(check());
}, 2000);
}
}
return result
};
ืืื ืืขืฆื ืื ืืฉืืง ืืืืืจืื ืฉืื ื. ืื ื ืื ืฉืืจืืืื ื ืืขืืืื ืขื Redux Toolkit:
1. ืื ืืืืืืงื ืืจืืืืช ืืคืื ืงืฆืืืช ืคืฉืืืืช, ืฉืืงืืืืช ืืืืืงื ืกืืืื ืืืืืืงื action ืืืฉื ืืช ืืช ืืกืืืื ืืคื ืืืงืฉื ื action.
2. ืื ืืขืชืื ื ืจืฆื ืืืืกืืฃ ืื ืื ืื ืื, ืืืื ืืจืืจ ืื ื ืืื ืืขืฉืืช ืืช ืื ืืื "ืืงืืงื" ืื ืืฉื ืืช ืืช ืืงืื ืืงืืื. ืคืฉืื ืฆืจืื ืืืืกืืฃ ืขืื ืกืืืืก. ืืงืื ืืืืื ืฉืืฆืืจื ืืฉื ืืช ืืื ืืงืืืฅ store.js, ืืื ืืืืกืืฃ ืฉื ืืชืืืกืืช ืืกืืืืก ืืืืฉ.
3. ืงืืืคืื ื ืืช ืจืืืงื ืฉืืฆืจืชื ืืฆืื ืืืื ืคืฉืืื. ืืืืืืงื ืืืืืื ืฉืื ืืื ืืืืืงื ืฉืงืฉืืจื ืืชืฆืืื.
4. ืืืจืืช ืฉืื ืืจืืืชื ืืื, ืืืื ืงื ืืืื ืืืชืื ืงืื ืืืืงื ืืืืืืงื ืื ืืืื ืืืจืืืช ืืคืื ืงืฆืืืช ืืืืจืืช.
5. ืืืจืืช ืฉืื ืืจืืืชื ืืื, ืจืืืืงืก ืืืืงืื ืืืืข ืขื ืื ืืื ื debug ืฉื ืจืืืืงืก ืื ืืฉ ืืื ืืช ืื ืืคืื ืืงืื ืฉื ืืกืข ืืืืจื ืืืื ืืฆืคืื ืืื ื actions ืฉืขืืืจืืช ืืืขืจืืช.
ืกื ืืื ืืชืืืช ืจืืืืงืก ืืืื ืืื ืืจืื ืืืชืจ ืคืฉืืื ืืื ืฉืืืชื ืืขืืจ ืืืจืื ืืืืืช redux toolkit.
ืืช ืงืื ืืืฉืืง ืืืื ืืชื ืืืืืื ืืืฆืื ืืืืืจ ืืื:
https://github.com/ynonp/redux-memory-game1 419
# ืืืจืื ืงืื: ืืืื ื ืืชืื ืืฉืืง ืืืืจืื ื Redux ื React
ืืคื ื ืฉื ืชืืื ืืชืืชื ืืื ืืฉืืง ืืืืจืื ืขื ืจืืืงื ืืขืืจืช ืืคืื ืงืฆืื useReducer. ืืืื ืื ื ืจืืฆื ืื ืกืืช ืืฉืืง ืืืื ืขื Redux ืืื ืืจืืืช ืื ืืชืืืฉ ืืจืืืืงืก ืืฉื ืื ืืืืจืื ืืช ืืืืืืื ืืื ืืฉืืง ืขื Redux Toolkit, ืกืคืจืื ืฉืืืคืืช ืืช ืืืชืืื ืืจืืืืงืก ืืืฉืืง ืืจืื ืืืชืจ ืืื ื.
## ืืกืื ืฉื ืจืืืืงืก ืืืืงืื ืืื ืืืื Immer
ืืืืช ืืืืืช ืืืืืืจ, ืืชืืืช ืงืื JavaScript ืฉืืชืขืกืง ืขื Immutable Data ืื ืื ืชืขื ืื. ืื ืื ื ืฆืจืื ืืงืืช ืืืืืงื ืกืืืื ืฉืืืจืื ืืืืืืงืืื ืคื ืืืืื ืืืฉื ืืช ืืฉืื ืืืื ืืืืืืงืืื ืืคื ืืืืื ืฉืื ืื ื ืืืจ ืืืื ืืืฆื ืืช ืขืฆืื ืืืชื ืืืจืื ืืืื:
function handwrittenReducer(state, action) {
return {
...state,
first: {
...state.first,
second: {
...state.first.second,
[action.someId]: {
...state.first.second[action.someId],
fourth: action.someValue,
},
},
},
}
}
ืืืคื ืืืจื ืืืืืื ืงืฆืจื.
ืืืจืืง ืืื ืืืืื ืขื Redux Toolkit ืื ืืืืืืจ ืืืืื ื ืฉืื ืขื Immer. ืืืืจ, ืืื ืฉืื ืืืืจ, ืื ืกืคืจืืืช JavaScript ืฉืืืคืฉืจืช ืื ืืืชืื ืงืื ืฉืืฉื ื ืืืืข ืืืืคืืช ืืืชื ืืืืืืืืช ืืงืื ืฉืืฉืืคื ืืช ืืืืืข ืืืงืื ืืฉื ืืช ืืืชื.
ืืคืื ืงืฆืื ืืื ืืฉืืื ืฉื Redux Toolkit ื ืงืจืืช createSlice ืืืื ืืขืฆื ืืืฆืจืช ืื Reducer ืืื Action Creators, ืืฉืืืืช ืขื Immer ืื ืฉืืงืื ืฉืื ื ืืืชื ืื "ืืืืื" ืืฉื ื ืืช ืืืืืืงืืื.
ืืืื ื ืฆืืื ืืืฉืืง ืืืืืจืื ืืื ืืจืืืช ืืช ืืกืืคืืจ ืืื ืืคืขืืื. ืื ืืงืื ืฉืื ื ืืืชื ืขืืื ืืืื ืืจืืคื ืืื:
https://github.com/ynonp/redux-memory-game
ืื ืืืฉืืง ืืืืจืื ืืฉ ืื ืืืืื ืฉื ืงืืคืื ืฉืื ื ืืืื ืืืฆืืจ ืขื:
const initialState = {
cards: _.shuffle(_.range(10).map(i => ({
value: Math.floor(i / 2),
hidden: true,
found: false,
}))),
};
ืืืืคืืื value ืฉื ืงืืฃ ืืืืฆื ืืช ืืืกืคืจ ืฉืขืืื, hidden ืืืืจ ืื ืืื ืืคืื ื found ืืืืจ ืื ืืฆืื ื ืืืชื ืืื ืขื ืืืื ืฉืื.
ืืคืื ืงืฆืื ืืจืืฉืื ื ืฉืื ื ืฆืจืื ืืืฉืืง ืืืืจืื ืืื ืคืื ืงืฆืื ืฉื ืงืจืืช ืืฉืืฉืชืืฉ ืืืืฅ ืขื ืงืืฃ. ืื ื ืืืืืืฉ ืืืคืชืืข ืฉืื:
function onPlay(state, action) {
const index = action.payload;
if (state.cards[index].hidden) {
state.cards[index].hidden = false;
}
const visibleCards = state.cards.filter(c => !c.found && !c.hidden);
if (visibleCards.length === 2) {
if (visibleCards[0].value === visibleCards[1].value) {
visibleCards[0].found = true;
visibleCards[1].found = true;
}
}
}
ืืืื ืื ืืคืชืืข? ืื ืื ืื ื ืืืืขืื ืฉื Redux ืื Reducer ืฆืจืื ืืงืื state ื action ืืืืืืืจ state ืืืฉ. ืคื ืื ื ืคืฉืื ืืฉื ื ืืช ื state ืืื ืฉื ืจืื ืืื ืฉืื ืื ืืืงืื:
state.cards[index].hidden = false;
ืืืืคื ืืืืืืื ืกืคืจืืืช immer ืืืคืืช ืืช ืืงืื ืืื ืืงืื ืฉืื ืืืืช ืืฉื ื ืืช ืืกืืืื ืืื ืืืฆืจ ืกืืืื ืืืฉ ืืืืืืจ ืืืชื.
ืืื ืคืื ืงืฆืื ืฉื ืื ืฉืชืขืืืจ ืื ืืืฉืืง ืืืืจืื ืชืืคืขื ืืื ืฉื ืืืช ืืืจื ืืชืืจ ืืฉื ื ืืฉืืื ืืืคืื ืืช ืื ืืงืืคืื ืฉืฆืจืื ืืืกืชืืจ:
function onCheck(state) {
for (let c of state.cards) {
if (!c.found) {
c.hidden = true;
}
}
}
ืืช ืื ืืงืื ืืื ืืชืืชื ืืงืืืฅ ืฉื ืงืจื memorySlice.js ืืขื ืขืืฉืื ืื ืืื ืฉืื ืืืจ ืฉืงืฉืืจ ืืจืืืืงืก ืื ื redux-toolkit ืืงืืืฅ. ืืืืง ืืืืจืื ืืื ืืืจ ื ืงืืืช ืืื ืืกื ื Redux:
export const memorySlice = createSlice({
name: 'memory',
initialState,
// The `reducers` field lets us define reducers and generate associated actions
reducers: { play: onPlay, check: onCheck },
});
ืืคืื ืงืฆืื createSlice ืืงืืืช ืืช ืฉืชื ืืคืื ืงืฆืืืช ืฉืืชืืชื ืืชืื ืืคืชื reducer ืฉื ืืืืืืงื ืืคืจืืืจืื ืฉืื ืืืืฆืจืช ืื Reducer ืืกืืืจ ืืื Action Creators. ืขืืฉืื ืื ื ืืืื ืืืฉืชืืฉ ืืขืจื ืืืืืจ ืฉืื ืืื ืืืืฆื ืืช ืืชืืฆืืืช:
export const { play, check } = memorySlice.actions;
export default memorySlice.reducer;
ืืกืืื ืืงืืืฅ ืื ื ืืืฆืจ ืืืืืฆื ืขืื ืฉืชื ืคืื ืงืฆืืืช ืขืืจ ืืืชื ืงืื ืืงืืฆืื ืืืจืื ืืืื ืืงืจืื ืืืืข ืื State:
export const selectVisibleCards = (state) => state.memory.cards.filter(c => !c.hidden && !c.found);
export const selectCards = (state) => state.memory.cards;
## ืืื ืืฉืชืืฉืื ื Reducers1 419
# ืฉืืื ืฉื ืืืฉื
ืื ืืืื ืืืืจืชื ืขื ืืชืื ืช ืจืืืงื ืืืื ืืืืฉืจ, ืฉืฉืืื ืข ืืืชื ืื ืืืืื ืืืฆืื ืืืืืช ืฉืืืจื ืื ืืื ื ืืืชืื ืงืื ืจืืืงื ืืื ืืืฉืชืืฉ ื useEffect ืื Custom Hooks ืืื ืืืขืืืจ ืืื ืฉืืืชืจ ืืืืืงื, ืืืื ืืืืืงื ืฉื ืชืงืฉืืจืช, ืืชืื ืืงืืืคืื ื ืืืช. ืืจืื ืืืชืจ ืงื, ืืื ืืขื, ืื ืื ืืช ืืืืืืงื ืฉื ืืฉืืืคืืช ืืฉืืฉืืืคื ืงืจืืื ืืงืื ืฉืืฆืื ืืช ืืชืืฆืื ืฉืื. ืื ืืกืฃ, ืืฉืืชื ืืืืง ืืช ืืงืืืคืื ื ืื ืืืืืืืืช ืืชื ืืืืง ืืช ืงืื ืืฉืืืคื ืฉืงืฉืืจ ืืืื, ืืื ื ืฉืืจ ืขื ืื ืื ืื ื ืฉืืืคื ืฉืืฃ ืืื ืื ืืฉืชืืฉ ืืื.
ืืื ืืฆืืชื ืืช ืืืฉืคื ืืื ืืชืืขืื ืฉื Redux Toolkit:
> With RTK Query, you usually define your entire API definition in one place. This is most likely different from what you see with other libraries such as swr or react-query, and there are several reasons for that. Our perspective is that it's much easier to keep track of how requests, cache invalidation, and general app configuration behave when they're all in one central location in comparison to having X number of custom hooks in different files throughout your application.
ืืชืจืืื ืืงืืฆืืจ ืื ืืืืจืื ืฉืื ืื ื ืืช RTK Query ืื ืืจืื ืืืชืจ ืงื ืื ืื ืชืงืฉืืจืช ืืฉืื ืืงืื ืฉืืชืขืกืง ืื ื ืืฆื ืืืงืื ืืื.
"ืื ืฆืืืง" ืืืช ืืืื ืื ืืฉืืื ืืื. ืืจืื ืืชืืจืื ืืชืื ืืช ืื ืืืื ืืื ืฉืืคืฉืจ ืืคืชืืจ ืืืชื ืืื ืืื ื ืืจืืื. ืื ืืืฉื ืืืืขื ืขื ืืืืื ืฉืื ืืืื ืืืฉื ืืคืฉืจ ืืื ืืช ืคืืชืจืื ืืช ืืืืื (ืื ืคืืืช ืืืืื).
ืืืจื ืืืืืช ืืชืื ืชืื ืืืืื ืืืชืจ ืืื ืื ืืืฆืื ืืช "ืืืืฉื ืืืืช" ืฉืชืืื ื ืืื ื, ืืื ืืืืคืชื ืืืืชืจ ืืืฉืืช, ืืืืืื ืืชืื ืืืฉื ืืกืืืืช ืื ืืกืื ืืจืืื ืฉืืงืืืืื ืื, ืื ืื ืืืืจ ืืืชืื ืงืื ืืื (ืื ืืจืืข) ืืฉืืืืืืงื ืืชืื ืืงืืืคืื ื ืืืช, ืืื ืื ืืืืจ ืืืชืื ืงืื ืืื (ืื ืืจืืข) ืืฉืืืืืืงื ื ืืฆืืช ืืืงืื ืืืจ, ืืืืื ืืืืืืืช ืื ืกืื ืืช ืฆืคืืืืช ืื ื ืืื ืืืช ืืืืืฉืืช.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
