ToCode
Open in Telegram
1 419
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
1 419
# 拽讜讚 砖注讛 讘讬讜诐
讬砖 讗转 讛拽讜讚 砖讗转诐 讻讜转讘讬诐 讘诪住讙专转 讛注讘讜讚讛, 讛拽讜讚 砖爪专讬讱 诇驻转讜专 讘注讬讛, 诇注砖讜转 诪砖讛讜 诪讜注讬诇. 讗谞讬 讬讜讚注, 讙诐 讗谞讬 讻讜转讘 讻讝讛. 讝讛 讗讞诇讛, 讜诇讗 注诇讬讜 讗谞讬 诪讚讘专.
讻讬 讞讜抓 诪诪谞讜 讬砖 讗转 讛拽讜讚 砖讗谞讞谞讜 讻讜转讘讬诐 讻讚讬 诇诇诪讜讚:
1. 讗转 讛拽讜讚 砖专讗讬转讬 讘讜讬讚讗讜 讜讗谞讬 诪拽诇讬讚 讻讚讬 诇专讗讜转 讗讬讱 讝讛 注讜讘讚.
2. 讗转 讛拽讜讚 砖诪爪讗转讬 讘住驻专 讜讗谞讬 诪拽诇讬讚 讜讙诐 诪砖谞讛 讗讜转讜 拽爪转.
3. 讗转 讛拽讜讚 讘砖讘讬诇 诇驻转讜专 讞讬讚转 转讻谞讜转 砖诪爪讗转讬.
4. 讗转 讛拽讜讚 砖讗谞讬 讻讜转讘 讻讚讬 诇注谞讜转 注诇 砖讗诇讛 砖诇 转诇诪讬讚, 讗讜 砖诇 诪讬砖讛讜 讗拽专讗讬 诪 Stack Overflow.
5. 讗转 讛拽讜讚 砖讗谞讬 讻讜转讘 讻讚讬 诇诇诪讜讚 砖驻转 转讻谞讜转 讞讚砖讛.
拽讜讚 砖注讛 讘讬讜诐 诪讚讘专 注诇 讛住讜讙 讛讝讛, 讛砖谞讬. 注诇 讛拽讜讚 砖讗转诐 讻讜转讘讬诐 讘砖讘讬诇 诇诇诪讜讚. 讜讛讟专讬拽 讛讜讗 驻砖讜讟, 砖注讛 讘讬讜诐 砖诇 拽讜讚 讻讝讛 讛讬讗 讟专谞住驻讜专诪讟讬讘讬转. 砖讘讜注 讗讞专讬 砖讘讜注, 讞讜讚砖 讗讞专讬 讞讜讚砖 砖诇 转砖讜讘讜转, 砖诇 诇讬诪讜讚 砖驻讜转 转讻谞讜转 讞讚砖讜转, 砖诇 拽专讬讗转 住驻专讬诐 讜诇讬诪讜讚 诪拽讜专住讬 讜讬讚讗讜 - 讗诇讛 讛讚讘专讬诐 砖讛讜驻讻讬诐 讗转讻诐 诇诪转讻谞转讬诐 砖砖讜讜讛 诇注讘讜讚 讗讬转诐 诇讟讜讜讞 讛专讞讜拽.
(讜讟讬驻 拽爪专 诇讗诇讛 砖讗讜诪专讬诐 状讗讘诇 讗讬谉 诇讬 专注讬讜谉 诪讛 诇讻转讜讘状 - 诪拽住讬诐 讜讬谞讚专讜讘 讛转讞讬诇 诇讗 诪讝诪谉 驻专讜讬拽讟 砖谞拽专讗 讗转讙专 JS 讘讜 讻诇 砖讘讜注讬讬诐 讛讜讗 谞讜转谉 诇讻诐 讗转讙专 JavaScript 讞讚砖, 讜讛讜讗 讙诐 注讜讝专 讻砖谞转拽注讬诐. 讛讻诇 注讚讬讬谉 讘诪讞讬专讬 讛专爪讛 讗讝 专讜爪讜 诇讛讬专砖诐 诇驻谞讬 砖讬讛讬讛 讬拽专. 讝讛 讛拽讬砖讜专)
1 419
# 转讜爪讗讛 专讗砖讜谞讛 讘讙讜讙诇
诇驻注诪讬诐 讛转砖讜讘讛 讛讟讜讘讛 讘讬讜转专 转讛讬讛 讘转讜爪讗讛 讛专讗砖讜谞讛 讘讙讜讙诇. 诇驻注诪讬诐 讛讬讗 转讛讬讛 讘 Stack Overflow. 诇驻注诪讬诐 讛讬讗 转讛讬讛 讘讗讬讝讛 讘诇讜讙 驻讜住讟 砖诇 讘诇讜讙专 诪驻讜专住诐 讜诇驻注诪讬诐 讘驻讜住讟 砖诇 讘诇讜讙专 砖讗祝 驻注诐 诇讗 砖诪注转诐 注诇讬讜.
讻讘专 转拽讜驻讛 讗专讜讻讛 砖讗谞讬 诇讗 诪转专讙砖 诪讛转讜爪讗讛 讛专讗砖讜谞讛 讘讙讜讙诇, 讜讻砖讗谞讬 诪讞驻砖 转砖讜讘讛 诇讘注讬讛 讟讻谞讬转 讗谞讬 讗驻转讞 讘讟讗讘讬诐 讗转 讻诇 讛转讜爪讗讜转 砖诇 讛注诪讜讚 讛专讗砖讜谉. 讬砖 诇讙讬砖讛 讝讜 砖谞讬 讬转专讜谞讜转:
1. 诇驻注诪讬诐 讘讗诪转 讛转砖讜讘讛 讛讟讜讘讛 讘讬讜转专 讛讬讗 诇讗 讛转讜爪讗讛 讛专讗砖讜谞讛. 讜讝讛 拽讜专讛 诇注转讬诐 讬讜转专 拽专讜讘讜转 诪诪讛 砖讛讬讬转诐 诪讚诪讬讬谞讬诐.
2. 讗驻讬诇讜 讗诐 讛转讜爪讗讛 讛讟讜讘讛 讘讬讜转专 讛讬讗 讛专讗砖讜谞讛, 讻砖讗转诐 诪住转讻诇讬诐 注诇 讘注讬讛 讟讻谞讬转 诪注谞讬讬谞转 转诪讬讚 讬砖 讻诪讛 讙讬砖讜转 讜讻诪讛 诪拽专讬诐. 拽专讬讗转 7 驻讜住讟讬诐 讜砖转讬 转砖讜讘讜转 诪 Stack Overflow 转驻转讞 诇讻诐 讗转 讛诪讞砖讘讛 讻讚讬 诇讛讘讬谉 讟讜讘 讬讜转专 讗转 讛讚讬诇诪讜转 讜讛谞讬讜讗谞住讬诐 砖诇 讛讘注讬讛.
讘转讜专 讗谞砖讬 诪拽爪讜注 讛注讘讜讚讛 砖诇谞讜 讛讬讗 诇讛讘讬谉 讗转 讛讙讜讜谞讬诐 讜讛专讘讚讬诐 讛专讘讬诐 砖诇 讛砖讗诇讜转, 讛专讘讛 讬讜转专 诪讗砖专 诇诪爪讜讗 讗转 讛转砖讜讘讛 讛专讗砖讜谞讛 砖注讜讘讚转.
1 419
注专讘 讟讜讘 讻讜诇诐 讘讙诇诇 讘注讬讛 讟讻谞讬转 讛驻讜住讟 砖诇 讛讘讜拽专 诇讗 驻讜专住诐 讘砖注讛 讛专讙讬诇讛. 诪拽讜讜讛 砖诇讗 诇拽讞转诐 诇诇讘. 讛谞讛
讛诇讬谞拽:
https://www.tocode.co.il/blog/2020-08-commits-and-branches
1 419
# 砖砖 诪讗讜转 砖砖讬诐 讜转砖注 砖讜专讜转
讛驻注诇转讬 讛讬讜诐 npm run eject 讘转讜讱 讬讬砖讜诐 砖谞讜爪专 注诐 create-react-app 讜拽讬讘诇转讬 拽讜讘抓 讜讜讘驻讗拽 砖诇 669 砖讜专讜转 讜注讜讚 6 拽讘爪讬 讛讙讚专讜转 拽讟谞讬诐 讬讜转专.
讛住讬讘讛 砖拽讘爪讬 讛讛讙讚专讜转 砖诇 create-react-app 讻诇 讻讱 讙讚讜诇讬诐 讛讬讗 砖讛诐 爪专讬讻讬诐 诇转诪讜讱 讘拽讜谞驻讬讙讜专爪讬讛 讛讻讬 诪转讜讞讻诪转 砖讗驻砖专 讻讚讬 诇讛转讗讬诐 诇讻诪讛 砖讬讜转专 驻专讜讬拽讟讬诐. 讛转讜爪讗讛 讛讬讗 砖讻诇 讛驻专讜讬拽讟讬诐 讻讜诇诇讬诐 讛诪讜谉 驻讬爪'专讬诐 砖专讜讘诐 诇讗 爪专讬讻讬诐, 讜砖讛驻讬爪'专讬诐 砖讗转诐 讘讗诪转 爪专讬讻讬诐 讗讜诇讬 诇讗 谞诪爪讗讬诐 砖诐 讻讬 讛诐 住驻爪讬驻讬讬诐 诇驻专讜讬拽讟 砖诇讻诐.
讗讝 诪讛 拽讬讘诇谞讜 砖诐 讗转诐 砖讜讗诇讬诐? 住拽讬专讛 讝专讬讝讛 砖诇 讛讚讘专讬诐 砖拽驻爪讜 诇讬 诇注讬谉:
1. 拽讜讘抓 manifest.json 砖诪诪砖 讬注讝讜专 诇讻诐 讗诐 讛砖专转 砖诇讻诐 爪专讬讱 诇讘谞讜转 讚讬谞诪讬转 讗转 讛 HTML 讜诇砖转讜诇 讘讜 讘爪讜专讛 讚讬谞诪讬转 讗转 拽讘爪讬 讛住拽专讬驻讟 (讗讛, 讗转诐 诪讙讬砖讬诐 拽讜讘抓 HTML 住讟讟讬? 转诪砖讬讻讜 诇诇讻转 讗转诐 诇讗 爪专讬讻讬诐 讗转 讝讛).
2. 讛讙讚专讜转 讗诇讬讗住 诇专讬讗拽讟 谞讬讬讟讬讘 (讗讛, 讗转诐 诇讗 讻讜转讘讬诐 专讬讗拽讟 谞讬讬讟讬讘? 诇讗 诪砖谞讛, 砖讬讛讬讛 诇讻诐)
3. 诪谞讙谞讜谉 砖讙讜专诐 诇 webpack 诇讗 诇讟注讜谉 拽讘爪讬 locale 讙讚讜诇讬诐 诪住驻专讬讬转 moment.js (讞砖讜讘, 诪讛 讗转诐 诇讗 诪砖转诪砖讬诐 讘 moment.js?).
4. 诪谞讙谞讜谉 file-loader 砖诪讗驻砖专 诇谞讜 诇讘爪注 import 诇拽讘爪讬诐 专讙讬诇讬诐 诪转讜讱 拽讜讚 讛 js 砖诇谞讜 讻讚讬 诇拽讘诇 讗转 砖诐 讛拽讜讘抓 (诇诪砖诇 讘砖讘讬诇 诇砖诇讘 转诪讜谞讜转 讘转讜讱 javascript).
讗转 专讜讘 讛讚讘专讬诐 讛讗诇讛 诇讗 讛讬讬转讬 诪讻谞讬住 诇拽讜讘抓 webpack 专讙讬诇 砖诇 讛驻专讜讬拽讟. 讗讜诇讬 讗讜住讬祝 讗讜转诐 讻砖讗转拽诇 讘讘注讬讛 诪住讜讬诪转 讗讜 讘爪讜专讱 诪住讜讬诐, 讗讘诇 讘讟讞 诇讗 讘爪讜专讛 讙讜专驻转. 讗讘诇 讛讘注讬讛 讛讬讜转专 讙讚讜诇讛 注诐 669 砖讜专讜转 砖诇 拽讜谞驻讬讙讜专爪讬讛 讛讬讗 砖讗谞砖讬诐 专讜讗讬诐 讗转 讛讘诇讜拽 讛讝讛 讜驻讜讞讚讬诐 诇砖谞讜转 讗讜转讜, 讜讻讱 讘诪拽讜诐 诇讛转讗讬诐 讗转 讛讙讚专讜转 讛讘谞讬讛 诇诪讛 砖讗谞讬 讘讗诪转 爪专讬讱 讗谞砖讬诐 诪讞驻砖讬诐 诇讘谞讜转 驻讬转专讜谞讜转 讜诪注拽驻讬诐 专拽 讘砖讘讬诇 诇讛讬砖讗专 讘转讜讱 讛 create-react-app.
讗诐 讛驻专讜讬拽讟 砖诇讻诐 讛讜诇讱 诇讛注住讬拽 讗转讻诐 讬讜转专 诪讻诪讛 讬诪讬诐. 讗诐 讛讙讚专讜转 讛讘谞讬讛 砖诇讜 诪讜专讻讘讜转 讜讗诐 讗转诐 诇讗 讘讟讜讞讬诐 讗讬讱 诇讙砖转 诇讝讛 - 诇讻讜 诇诇诪讜讚 讜讜讘驻讗拽. 讗讞专讬 讝讛 转讻转讘讜 拽讜讘抓 驻砖讜讟 注诐 讛讙讚专讜转 砖讗转诐 诪讘讬谞讬诐 讜诇讗讟 诇讗讟 转专讞讬讘讜 讗讜转讜 讻讚讬 诇驻转讜专 讗转 讛讘注讬讜转 砖诇 讛驻专讜讬拽讟 砖诇讻诐. 讝讛 讬讜转专 诪讚讜讬拽, 讬讜转专 诪砖转诇诐 讜讙诐 讬讛驻讜讱 讗转讻诐 诇诪转讻谞转讬诐 讟讜讘讬诐 讬讜转专.
1 419
# 砖砖 诪讗讜转 砖砖讬诐 讜转砖注 砖讜专讜转
讛驻注诇转讬 讛讬讜诐 npm run eject 讘转讜讱 讬讬砖讜诐 砖谞讜爪专 注诐 create-react-app 讜拽讬讘诇转讬 拽讜讘抓 讜讜讘驻讗拽 砖诇 669 砖讜专讜转 讜注讜讚 6 拽讘爪讬 讛讙讚专讜转 拽讟谞讬诐 讬讜转专.
讛住讬讘讛 砖拽讘爪讬 讛讛讙讚专讜转 砖诇 create-react-app 讻诇 讻讱 讙讚讜诇讬诐 讛讬讗 砖讛诐 爪专讬讻讬诐 诇转诪讜讱 讘拽讜谞驻讬讙讜专爪讬讛 讛讻讬 诪转讜讞讻诪转 砖讗驻砖专 讻讚讬 诇讛转讗讬诐 诇讻诪讛 砖讬讜转专 驻专讜讬拽讟讬诐. 讛转讜爪讗讛 讛讬讗 砖讻诇 讛驻专讜讬拽讟讬诐 讻讜诇诇讬诐 讛诪讜谉 驻讬爪'专讬诐 砖专讜讘诐 诇讗 爪专讬讻讬诐, 讜砖讛驻讬爪'专讬诐 砖讗转诐 讘讗诪转 爪专讬讻讬诐 讗讜诇讬 诇讗 谞诪爪讗讬诐 砖诐 讻讬 讛诐 住驻爪讬驻讬讬诐 诇驻专讜讬拽讟 砖诇讻诐.
讗讝 诪讛 拽讬讘诇谞讜 砖诐 讗转诐 砖讜讗诇讬诐? 住拽讬专讛 讝专讬讝讛 砖诇 讛讚讘专讬诐 砖拽驻爪讜 诇讬 诇注讬谉:
1. 拽讜讘抓 manifest.json 砖诪诪砖 讬注讝讜专 诇讻诐 讗诐 讛砖专转 砖诇讻诐 爪专讬讱 诇讘谞讜转 讚讬谞诪讬转 讗转 讛 HTML 讜诇砖转讜诇 讘讜 讘爪讜专讛 讚讬谞诪讬转 讗转 拽讘爪讬 讛住拽专讬驻讟 (讗讛, 讗转诐 诪讙讬砖讬诐 拽讜讘抓 HTML 住讟讟讬? 转诪砖讬讻讜 诇诇讻转 讗转诐 诇讗 爪专讬讻讬诐 讗转 讝讛).
2. 讛讙讚专讜转 讗诇讬讗住 诇专讬讗拽讟 谞讬讬讟讬讘 (讗讛, 讗转诐 诇讗 讻讜转讘讬诐 专讬讗拽讟 谞讬讬讟讬讘? 诇讗 诪砖谞讛, 砖讬讛讬讛 诇讻诐)
3. 诪谞讙谞讜谉 砖讙讜专诐 诇 webpack 诇讗 诇讟注讜谉 拽讘爪讬 locale 讙讚讜诇讬诐 诪住驻专讬讬转 moment.js (讞砖讜讘, 诪讛 讗转诐 诇讗 诪砖转诪砖讬诐 讘 moment.js?).
4. 诪谞讙谞讜谉 file-loader 砖诪讗驻砖专 诇谞讜 诇讘爪注 import 诇拽讘爪讬诐 专讙讬诇讬诐 诪转讜讱 拽讜讚 讛 js 砖诇谞讜 讻讚讬 诇拽讘诇 讗转 砖诐 讛拽讜讘抓 (诇诪砖诇 讘砖讘讬诇 诇砖诇讘 转诪讜谞讜转 讘转讜讱 javascript).
讗转 专讜讘 讛讚讘专讬诐 讛讗诇讛 诇讗 讛讬讬转讬 诪讻谞讬住 诇拽讜讘抓 webpack 专讙讬诇 砖诇 讛驻专讜讬拽讟. 讗讜诇讬 讗讜住讬祝 讗讜转诐 讻砖讗转拽诇 讘讘注讬讛 诪住讜讬诪转 讗讜 讘爪讜专讱 诪住讜讬诐, 讗讘诇 讘讟讞 诇讗 讘爪讜专讛 讙讜专驻转. 讗讘诇 讛讘注讬讛 讛讬讜转专 讙讚讜诇讛 注诐 669 砖讜专讜转 砖诇 拽讜谞驻讬讙讜专爪讬讛 讛讬讗 砖讗谞砖讬诐 专讜讗讬诐 讗转 讛讘诇讜拽 讛讝讛 讜驻讜讞讚讬诐 诇砖谞讜转 讗讜转讜, 讜讻讱 讘诪拽讜诐 诇讛转讗讬诐 讗转 讛讙讚专讜转 讛讘谞讬讛 诇诪讛 砖讗谞讬 讘讗诪转 爪专讬讱 讗谞砖讬诐 诪讞驻砖讬诐 诇讘谞讜转 驻讬转专讜谞讜转 讜诪注拽驻讬诐 专拽 讘砖讘讬诇 诇讛讬砖讗专 讘转讜讱 讛 create-react-app.
讗诐 讛驻专讜讬拽讟 砖诇讻诐 讛讜诇讱 诇讛注住讬拽 讗转讻诐 讬讜转专 诪讻诪讛 讬诪讬诐. 讗诐 讛讙讚专讜转 讛讘谞讬讛 砖诇讜 诪讜专讻讘讜转 讜讗诐 讗转诐 诇讗 讘讟讜讞讬诐 讗讬讱 诇讙砖转 诇讝讛 - 诇讻讜 诇诇诪讜讚 讜讜讘驻讗拽. 讗讞专讬 讝讛 转讻转讘讜 拽讜讘抓 驻砖讜讟 注诐 讛讙讚专讜转 砖讗转诐 诪讘讬谞讬诐 讜诇讗讟 诇讗讟 转专讞讬讘讜 讗讜转讜 讻讚讬 诇驻转讜专 讗转 讛讘注讬讜转 砖诇 讛驻专讜讬拽讟 砖诇讻诐. 讝讛 讬讜转专 诪讚讜讬拽, 讬讜转专 诪砖转诇诐 讜讙诐 讬讛驻讜讱 讗转讻诐 诇诪转讻谞转讬诐 讟讜讘讬诐 讬讜转专.
1 419
# 讗讬讱 诇爪诪爪诐 Boilerplate 讘 Redux - 讞诇拽 3
讘砖谞讬 讛讞诇拽讬诐 讛拽讜讚诪讬诐 诇诪讚谞讜 讗讬讱 诇爪诪爪诐 Boilerplate 讘讬讬砖讜诐 Redux 讘讗诪爪注讜转 讟讬驻讜诇 讘 Action Creators 讜讘 Reducer. 讛讬讜诐 讗谞讬 专讜爪讛 诇讚讘专 注诇 讛拽讜诪驻讜谞谞讟讜转 讜诇讛专讗讜转 讗讬讱 诇讻转讜讘 讛专讘讛 驻讞讜转 拽讜讚 讘转讜讱 拽讜诪驻讜谞谞讟讛 砖诪讞讜讘专转 诇 Redux 讜注讚讬讬谉 诇拽讘诇 讘讚讬讜拽 讗转 讗讜转讛 转讜爪讗讛.
## 讗讬驻讛 讻讗谉 讛 Boilerplate?
谞转讘讜谞谉 讘拽讜诪驻讜谞谞讟讛 讛讘讗讛 诪转讜讱 讚讜讙诪转 讛 Todo 讛诪驻讜专住诪转 诪讛讗转专 砖诇 专讬讚讗拽住. 讛拽讜诪驻讜谞谞讟讛 诪住讜讚专转 讘砖谞讬 拽讘爪讬诐 讗讘诇 讗谞讬 诪讗讞讚 讗讜转诐 讘砖讘讬诇 砖讬讛讬讛 拽诇 诇专讗讜转:
import { connect } from 'react-redux'
import { setVisibilityFilter } from '../actions'
import React from 'react'
import PropTypes from 'prop-types'
const Link = ({ active, children, onClick }) => (
<button
onClick={onClick}
disabled={active}
style={{
marginLeft: '4px',
}}
>
{children}
</button>
)
Link.propTypes = {
active: PropTypes.bool.isRequired,
children: PropTypes.node.isRequired,
onClick: PropTypes.func.isRequired
}
const mapStateToProps = (state, ownProps) => ({
active: ownProps.filter === state.visibilityFilter
})
const mapDispatchToProps = (dispatch, ownProps) => ({
onClick: () => dispatch(setVisibilityFilter(ownProps.filter))
})
export default connect(
mapStateToProps,
mapDispatchToProps
)(Link)
讗讬驻讛 讻讗谉 讛 Boilerplate? 谞讜, 讝讛 讛 Higher Order Component 讻诪讜讘谉: 讛讙讚专转 讛驻讜谞拽爪讬讛 mapStateToProps 砖转拽讜注讛 讘讻诇 拽讜诪驻讜谞谞讟讛, 讛讙讚专转 讛驻讜谞拽爪讬讛 mapDispatchToProps, 讜讻诪讜讘谉 讛拽专讬讗讛 诇 connect.
## 讗讬讱 诇爪诪爪诐 讗转 讛拽讜讚 讛诪讬讜转专
讛诪注讘专 诪 Higher Order Components 诇 Custom Hooks 讗讬驻砖专 诇讻讜转讘讬 讛住驻专讬讛 react-redux 诇讛爪讬注 API 谞拽讬 讬讜转专. 讗驻砖专 诇拽专讜讗 讗转 讛驻专讟讬诐 讘转讬注讜讚 砖诇 react-redux 讻讗谉:
https://react-redux.js.org/api/hooks
讘拽爪专讛 讗谞讞谞讜 谞砖转诪砖 讘 useSelector 讘诪拽讜诐 讘 mapStateToProps, 讜讘 useDispatch 讘诪拽讜诐 讘 mapDispatchToProps. 讛谞讛 讛拽讜讚 讗讞专讬 讛转讬拽讜谉:
import React from "react";
import PropTypes from "prop-types";
import { useSelector, useDispatch } from "react-redux";
import { setVisibilityFilter } from "../actions";
const Link = props => {
const { children, filter } = props;
const active = useSelector(state => state.visibilityFilter === filter);
const dispatch = useDispatch();
const onClick = () => dispatch(setVisibilityFilter(filter));
return (
<button
onClick={onClick}
disabled={active}
style={{
marginLeft: "4px"
}}
>
{children}
</button>
);
};
Link.propTypes = {
active: PropTypes.bool.isRequired,
children: PropTypes.node.isRequired,
onClick: PropTypes.func.isRequired
};
export default Link;
讛拽讜讚 砖诇谞讜 讻讜诇诇 注讻砖讬讜 专拽 拽讜诪驻讜谞谞讟讛 讗讞转 讜讻诇 讛诪讬讚注 砖诇讛 诪讞讜砖讘 讘诪拽讜诐 讗讞讚 讘转讞讬诇转 讛驻讜谞拽爪讬讛. 讗诐 讘注转讬讚 谞爪讟专讱 拽讜诪驻讜谞谞讟讜转 诪讜专讻讘讜转 讬讜转专 讬讛讬讛 诇谞讜 讛专讘讛 讬讜转专 拽诇 诇砖讘讜专 讗转 讛拽讜讚 诇诪住驻专 拽讜诪驻讜谞谞讟讜转 砖讻诇 讗讞转 注讜住拽转 讘注谞讬讬谞讬讛. 讛驻专讬讚讛 诪 Higher Order Component 讬爪专讛 拽讜讚 谞拽讬 讬讜转专 讜讙诐 转讜爪讗讛 专讝讛 讬讜转专 诪讘讞讬谞转 讛 Virtual DOM.1 419
# 讻讗诇讛 讚讘专讬诐 驻砖讜讟 讬讻讜诇讬诐 诇转住讻诇
转住讻讜诇 讜住拽专谞讜转 讛诐 砖谞讬 专讙砖讜转 诪讗讜讚 拽专讜讘讬诐. 讻砖讗谞讞谞讜 讘讗讬诐 诇诇诪讜讚 诪砖讛讜 讞讚砖, 讗诐 讗谞讞谞讜 诪爪诇讬讞讬诐 诇讛专讙讬砖 住拽专谞讜转 讘诪拽讜诐 转住讻讜诇 住讬讻讜讬讬 讛讛爪诇讞讛 砖诇谞讜 讬讙讚诇讜 诪砖诪注讜转讬转. 讗讘诇, 讗讬讱 注讜砖讬诐 讗转 讝讛?
## 诇诪讛 讗谞讬 诪专讙讬砖?
讛专讘讛 讗谞砖讬诐 讟讜注讬诐 诇讞砖讜讘 砖专讙砖 讛讜讗 诪砖讛讜 砖拽讜专讛 诇谞讜 讻转讜爪讗讛 诪诪砖讛讜 砖拽专讛 讘注讜诇诐: 专讗讬转讬 住专讟 注爪讜讘 讗讝 讗谞讬 诪专讙讬砖 注爪讜讘, 讛专讞转讬 专讬讞 诪讜讻专 讗讝 讗谞讬 诪专讙讬砖 讘讘讬转, 讛爪诇讞转讬 诇专讜抓 诪专转讜谉 讗讝 讗谞讬 诪专讙讬砖 注诇 讙讙 讛注讜诇诐.
讛讗诪转 讛讬讗 砖讻诇 专讙砖 讛讜讗 转讜爪讗讛 砖诇 讞讬讘讜专 讘讬谉 诪砖讛讜 砖拽讜专讛 讘注讜诇诐 诇讘讬谉 讛住讬驻讜专 砖讘讗诪爪注讜转讜 讗谞讬 诪讘讬谉 讗转 诪讛 砖拽专讛. 讛住讬驻讜专 砖诇讬 讛讜讗 讛驻讬诇讟专 讚专讻讜 讻诇 讚讘专 注讜讘专.
拽诇 诇专讗讜转 讗转 讝讛 讘讚讜讙诪讗 砖诇 讛住专讟 讻讬 讘专讜专 砖诇讗 讻诇 诪讬 砖专讜讗讛 讟讬讟讗谞讬拽 讬转讞讬诇 诇讘讻讜转 讻砖诇讬讗讜谞专讚讜 讚讬拽驻专讬讜 爪讜诇诇 诇讬诐, 讜诇讗 讻诇 诪讬 砖专讜讗讛 讘诪讘讬 讬讬拽讞 诇诇讘 讻砖讗诪讗 砖诇 讘诪讘讬 诪转讛.
讻诪讜讘谉 砖讻讻诇 砖讛住讬讟讜讗爪讬讛 讬讜转专 注爪讜讘讛 讗讜 砖诪讞讛 讘注讬谞讬讬 讬讜转专 讗谞砖讬诐 讻讱 拽砖讛 诇讛砖转讻谞注 砖讬砖 诇讬 驻讛 讗讬讝砖讛讜 讗诇诪谞讟 砖诇 讘讞讬专讛. 讗讘诇 讘讗诪转 讗诐 谞讞讝讜专 诇讚讜讙诪讗 砖诇 讛住专讟 讗祝 讗讞讚 诇讗 讘讜讞专 诇讘讻讜转 讻砖讛讜讗 专讜讗讛 住专讟 注爪讜讘, 讝讛 驻砖讜讟 讗讬讱 砖讞诇拽 诪讛讗谞砖讬诐 诇讜拽讞讬诐 讗转 讝讛.
讛专讙砖 讛讜讗 讛讛转谞讙砖讜转 讘讬谉 诪谞讙谞讜谞讬 讛讛讘谞讛 砖诇讬 诇讘讬谉 诪砖讛讜 砖拽专讛 讘注讜诇诐 讜讛讜讗 谞讜爪专 讻砖讗谞讬 诪住转讻诇 讛讞讜爪讛 讜诪谞住讛 诇讛住讘讬专 诇注爪诪讬 讘专讗砖 讗转 讛转讜驻注讛 砖拽专转讛.
## 诇诪讛 讗谞讬 诪专讙讬砖 转住讻讜诇?
专讙砖 砖诇 转住讻讜诇 诪讜驻讬注 讻砖讗谞讬 诪谞住讛 诇注砖讜转 诪砖讛讜 砖讗谞讬 讞讜砖讘 砖讗谞讬 讬讜讚注 讗讜 爪专讬讱 诇讚注转 讗讘诇 讛讚讘专 讛讝讛 诇讗 诪爪诇讬讞. 讗谞讬 诪谞住讛 诇讛专讻讬讘 驻讗讝诇 12 讞诇拽讬诐 讜讛诐 诇讗 诪转讞讘专讬诐. 讗讬讱 讛诐 诇讗 诪转讞讘专讬诐? 讝讛 驻讗讝诇 诇讙讬诇 3... 诪讛 诇讗 讘住讚专 讗讬转讬?
讛转住讻讜诇 诇讗 诪讙讬注 专拽 诪讝讛 砖诇讗 讛爪诇讞转讬 诪砖讛讜, 讗诇讗 诪讝讛 砖诇讗 讛爪诇讞转讬 诪砖讛讜 砖讗谞讬 讘讟讜讞 砖讛讬讬转讬 爪专讬讱 诇讛爪诇讬讞. 住讬讝讬驻讜住 诇讗 讞砖 转住讻讜诇 讻砖讛讗讘谉 诪转讚专讚专转 砖讜讘 讜砖讜讘 讘诪讜专讚 讛讛专 - 讛讜讗 诇专讙注 诇讗 讛注诇讛 讘讚注转讜 砖讛驻注诐 讝讛 讬爪诇讬讞.
讗讘诇 讻砖讗转讛 诪专讬抓 讗转 讗讜转讛 驻拽讜讚转 git 砖讻讘专 砖诇讜砖 砖谞讬诐 注讜讘讚转 讻诇 驻注诐 诪讞讚砖 讜驻转讗讜诐 讛讙讬讟 讝讜专拽 注诇讬讱 讛讜讚注转 砖讙讬讗讛 砖讗转讛 诇讗 诪讘讬谉 - 讝讛 转住讻讜诇. 讗转讛 讘讟讜讞 砖讗转讛 讬讜讚注 诇注砖讜转 讗转 讝讛, 讗讘诇 讝讛 诇讗 诪爪诇讬讞.
## 诇诪讛 讗谞讬 诪专讙讬砖 住拽专谞讜转?
住拽专谞讜转 讛讬讗 讞讘专讛 讚讬 拽专讜讘讛 砖诇 转住讻讜诇, 注诐 住讬驻讜专 拽爪转 砖讜谞讛. 讗转 讛住拽专谞讜转 讗谞讬 诪专讙讬砖 讻砖讗谞讬 诪谞住讛 诇注砖讜转 诪砖讛讜 讜诇讗 诪爪诇讬讞, 讗诐 讛讙注转讬 诇住讬讟讜讗爪讬讛 讘诇讬 爪讬驻讬讜转 诇讛爪诇讞讛.
状诪注谞讬讬谉 诪讛 讛讜诇讱 诇拽专讜转 注讻砖讬讜" 讝讛 讛诪砖驻讟 砖诪讬讬爪讙 讛讻讬 讟讜讘 讗转 讛住拽专谞讜转. 讗讛, 驻拽讜讚转 git 砖谞讬住讬转讬 诇讻转讜讘 诇讗 注讘讚讛 诇诪专讜转 砖注讚 注讻砖讬讜 讻诇 讛砖谞讬诐 讛讬讗 注讘讚讛 诪注讜诇讛. 诪注谞讬讬谉 诇诪讛. 诪注谞讬讬谉 诪讛 讬拽专讛 讗诐 讗砖谞讛 讞诇拽 诪讛诪转讙讬诐. 诪注谞讬讬谉 诪讛 注砖讬转讬 讛驻注诐 砖讜谞讛 诪讘讚专讱 讻诇诇.
讻砖诪讜专讬讚讬诐 诪讛住讬驻讜专 讗转 状讗谞讬 讬讜讚注 诇注砖讜转 讗转 讝讛状, 讛转住讻讜诇 讛讜驻讱 诇讘讚 诇住拽专谞讜转 讜讛诇诪讬讚讛 诪转讞讬诇讛.
1 419
# 拽讜专住讬诐 砖诪驻讞讬讚讬诐 讗讜转讬
讗谞讬 诇讗 驻讜讞讚 诪诪专爪讬诐 诪砖注诪诪讬诐. 讻砖讛讛专爪讗讛 诇讗 诪注谞讬讬谞转 讗谞讬 讗讜诪谞诐 诇讗 诪诪砖 讬讻讜诇 诇诇诪讜讚 讜拽砖讛 诇讛转专讻讝, 讗讘诇 讛讬转专讜谉 讛讜讗 砖诪讚讜讘专 讘诪砖讛讜 诪讗讜讚 讘讜诇讟. 诪住驻讬拽 诇专讗讜转 讛拽诇讟讛 讗讞转 诪讛专爪讗讛 讗讜 诇讘讜讗 诇砖讬注讜专 诇讚讜讙诪讗 讜讬砖 讗转讛 诪讘讬谉 砖讗转讛 讘拽讜专住 注诐 诪专爪讛 诪砖注诪诐 讜讬讻讜诇 诇讛讞诇讬讟 讗诐 诇讛讬砖讗专 讗讜 诇讘专讜讞.
拽讜专住讬诐 砖诪驻讞讬讚讬诐 讗讜转讬 讛诐 拽讜专住讬诐 砖谞专讗讬诐 讟讜讘: 拽讜专住讬诐 注诐 诪讜转讙 讞讝拽, 注诐 诪专爪讬诐 砖讬讜讚注讬诐 诇住驻专 住讬驻讜专讬诐 讜诇注谞讬讬谉, 讻讗诇讛 砖讗转讛 讘讗诪转 讬讜砖讘 讜诇讜诪讚 诪讛诐, 讗讘诇 诇讜诪讚 讗转 讛讚讘专讬诐 讛诇讗 谞讻讜谞讬诐.
讜讝讜 转讜驻注讛 讚讬 讬讬讞讜讚讬转 诇诪拽爪讜注 砖诇谞讜 讻讬 讘讛专讘讛 诪拽爪讜注讜转 讬砖 讗转 讛住驻专讜转 讛诪拽爪讜注讬转 讜讻讜诇诐 诪诇诪讚讬诐 诪诪谞讛. 讗讘诇 讗爪诇谞讜 讘讙诇诇 砖讛讟讻谞讜诇讜讙讬讛 专爪讛 讻诇 讻讱 诪讛专, 讜讘讙诇诇 砖讬砖 诇讗 诪注讟 讻诇讬诐 砖讗驻讬诇讜 诪讬 砖讻转讘 讗讜转诐 注讚讬讬谉 诇讗 讘讟讜讞 诪讛 转讛讬讛 讛讚专讱 讛讟讜讘讛 讘讬讜转专 诇讛砖转诪砖 讘讛诐, 讛住讻谞讛 砖诇 诇讬诪讜讚 转讘谞讬讜转 诇讗 谞讻讜谞讜转 讛讬讗 诪讗讜讚 诪砖诪注讜转讬转.
(诪讛 讝讛 转讘谞讬讜转 诇讗 谞讻讜谞讜转? 诇讚讜讙诪讗 讘砖驻讛 讻诪讜 C 讝讛 讬讛讬讛 讻诪讜 诇诇诪讚 讗转 malloc 讘诇讬 诇诇诪讚 讗转 free. 讘 JavaScript 讝讛 讬讛讬讛 诇诇诪讚 讗转 讛驻讜谞拽爪讬讛 document.write, 讜注讜讚 讚讘专讬诐 专讘讬诐 讘住讙谞讜谉).
讚讜讙诪讗讜转 讛拽讜讚 注讜讘讚讜转, 讛谉 谞专讗讜转 讟讜讘, 讛谉 注讜砖讜转 诪讛 砖讻讘讬讻讜诇 讛转讜讻谞讬转 爪专讬讻讛 诇注砖讜转 - 讗讘诇 讗诐 谞谞住讛 诇讛讜爪讬讗 讗讜转谉 诪讛拽讜专住 讜诇砖诇讘 讗讜转谉 讘注讜诇诐 讛讗诪讬转讬 讛转讜讻谞讬转 转讬驻讜诇 讗讜 砖讛拽讜讚 讬住转讘讱 砖诇讗 诇爪讜专讱; 讗讜 讘讚讜讙诪讗 讗讞专转 - 讗诐 谞谞住讛 诇注谞讜转 注诇 砖讗诇讛 诪专讗讬讜谉 注讘讜讚讛 注诐 讛讚讜讙诪讗 砖诇诪讚谞讜 讛诪专讗讬讬谉 讬讝专讜拽 讗讜转谞讜 诪讻诇 讛诪讚专讙讜转.
讛砖讬讟讛 砖诇讬 讛讬讜诐 诇诇诪讜讚 谞讜砖讗讬诐 讞讚砖讬诐 讛讬讗 诇讞驻砖 讻诪讛 砖讬讜转专 诪拽讜专讜转 诪讬讚注, 讜讻诪讛 砖讗驻砖专 诇讘讚讜拽 讗转 讛拽讜专住 砖诇拽讞转讬 讗诇 诪讜诇 讛转讬注讜讚 砖诇 讛住驻专讬讛 讗讜 驻讜住讟讬诐 注讚讻谞讬讬诐 讘转讞讜诐. 讻砖诪诇诪讚讬诐 讗讜转讬 诪砖讛讜 砖讗谞讬 诇讗 诪讜爪讗 讘砖讜诐 诪拽讜诐 讗讞专, 讝讛 住讬诪谉 诇讛转讞讬诇 诇讚讗讜讙.
1 419
# 讗讬讱 诇爪诪爪诐 Boilerplate 讘拽讜讚 Redux - 讞诇拽 2
讘讞诇拽 讛拽讜讚诐 讘住讬讚专讛 讛专讗讬转讬 讗讬讱 诇爪诪爪诐 Boilerplate 讘拽讜讚 砖诇 讛 Action Creator 讘 Redux. 讛讬讜诐 驻讜住讟 讛诪砖讱 讘讜 谞讟驻诇 讘 Reducer 讜谞专讗讛 讗讬讱 诇爪诪爪诐 讞诇拽 讙讚讜诇 诪讛 Boilerplate 讜讛讻讬注讜专 砖诇 专讜讘 讛 Reducers 讘诪注专讻转.
## 注诇 诪讛 讗谞讞谞讜 诪讚讘专讬诐 讻砖讗谞讞谞讜 讗讜诪专讬诐 Boilerplate
拽讜讚 讛 Reducer 诪转讜讱 讚讜讙诪转 讛 Todos 讘转讬注讜讚, 砖诇爪注专讬 讛专讘讛 讗谞砖讬诐 诇讜拽讞讬诐 讗讜转讜 讘转讜专 转讘谞讬转 诇讗讬讱 Redux 爪专讬讱 诇讛讬专讗讜转, 谞专讗讛 讻讱:
const todos = (state = [], action) => {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
id: action.id,
text: action.text,
completed: false
}
]
case 'TOGGLE_TODO':
return state.map(todo =>
todo.id === action.id ? { ...todo, completed: !todo.completed } : todo
)
default:
return state
}
}
export default todos
讛诪讗驻讬讬谉 讛讘讜诇讟 砖诇 专讜讘 讛 Reducers 讛讜讗 诪讘谞讛 砖诇 switch/case 讘转讜讱 驻讜谞拽爪讬讛. 讛驻讜谞拽爪讬讛 讘讜讚拽转 诪讛 住讜讙 讛驻注讜诇讛 讜诪讞讝讬专讛 住讟讬讬讟 讞讚砖 诇驻讬 住讜讙 讛驻注讜诇讛 讜讛驻专诪讟专讬诐 砖诇讛.
讝讛 诪讘谞讛 讬驻讛 讻砖诪住转讻诇讬诐 注诇讬讜 诪诇诪注诇讛 讗讘诇 讛砖讟谉 讛讜讗 讘驻专讟讬诐. 讻讻诇 砖讬砖 讬讜转专 驻注讜诇讜转 驻讜谞拽爪讬讛 讻讝讗转 讛讜诇讱 诇讛讬讜转 诪讗讜讚 讗专讜讻讛 讜讬讛讬讛 拽砖讛 诇拽专讜讗 讗讜转讛. 讛驻讬转专讜谉 讛诪讜爪注 讘转讬注讜讚, 诇讛驻专讬讚 讗转 讛 Reducer 诇诪住驻专 Reducers, 讛讜讗 诇讗 专诇讜讜谞讟讬 讜讘专讜讘 讛诪拽专讬诐 专拽 讛讜驻讱 讗转 讛拽讜讚 诇拽砖讛 讬讜转专 诇拽专讬讗讛.
讗转讙专 谞讜住祝 讘拽讜讚 讛讜讗 砖讻诇 驻注诐 砖讗谞讞谞讜 诪讜住讬驻讬诐 驻注讜诇讛 讞讚砖讛 讗谞讞谞讜 爪专讬讻讬诐 诇讻转讜讘 讙诐 讗转 诪讬诪讜砖 讛驻注讜诇讛, 讗讘诇 讙诐 诇注讟讜祝 讗转 讛诪讬诪讜砖 讘注讜讚 讘诇讜拽 砖诇 case 讜诇讛砖讜讜转 讗转 砖诐 讛 Action, 诪讛 砖注讜讚 讬讜转专 诪讗专讬讱 讗转 讛驻讜谞拽爪讬讛.
## 讗讬讱 诇讻转讜讘 驻讞讜转 拽讜讚
讗讘诇 - 讗诐 讗谞讞谞讜 诪讜讻谞讬诐 诇讛转讞讬讬讘 注诇 拽讜谞讘谞爪讬讛 诇砖诪讜转 砖诇 驻注讜诇讜转 讗驻砖专 诇讞住讜讱 讞诇拽 讙讚讜诇 诪讛拽讜讚 讛讝讛. 讛谞讛 诪讛 砖谞注砖讛:
1. 谞讞诇讬讟 砖讻诇 驻注讜诇讛 转拽讘诇 讟讬驻讜诇 讘驻讜谞拽爪讬讬转 注讝专 拽讟谞讛.
2. 砖诐 讛驻讜谞拽爪讬讛 讬讬讙讝专 讘讗讜驻谉 爪驻讜讬 讜讬讚讜注 诪专讗砖 诪砖诐 讛驻注讜诇讛.
3. 谞讻转讜讘 讗转 讻诇 驻讜谞拽爪讬讜转 讛讟讬驻讜诇 讘转讜讱 讗讜讘讬拽讟 专讗砖讬.
4. 谞讻转讜讘 驻讜谞拽爪讬讛 砖诪拽讘诇转 讗转 讗讜转讜 讗讜讘讬拽讟 专讗砖讬 讜讬讜爪专转 诪诪谞讜 讘爪讜专讛 讗讜讟讜诪讟讬转 Reducer, 讗讘诇 讘诪拽讜诐 switch/case 讛讬讗 转讙诇讛 诇讘讚 讗转 砖诐 讛驻讜谞拽爪讬讛 诇驻讬 讛 action.type.
讛拽讜讚 讗讞专讬 讛砖讬谞讜讬 砖诇讬 谞专讗讛 讻讱:
import createReducer from "./reducerUtils";
const todos = {
addTodo(state, { id, text }) {
return [...state, { id, text, completed: false }];
},
toggleTodo(state, { id }) {
function toggle(todo) {
return { ...todo, completed: !todo.completed };
}
return state.map(todo => (todo.id === id ? toggle(todo) : todo));
}
};
export default createReducer(todos);
专讜爪讬诐 诇讛讜住讬祝 驻注讜诇讛 讞讚砖讛? 讗讬谉 讘注讬讛 驻砖讜讟 转讜住讬驻讜 驻讜谞拽爪讬讬转 讟讬驻讜诇. 诇讗 爪专讬讱 诇讛讜住讬祝 讘诇讜拽 case 讞讚砖 讗讜 诇讛砖讜讜转 type. 讚讘专 谞讜住祝 砖讗谞讬 讗讜讛讘 讘诪讘谞讛 讻讗谉 讛讜讗 砖砖诪讜转 讛驻专诪讟专讬诐 诪讜驻讬注讬诐 讘转讜讱 讛讙讚专转 讛驻讜谞拽爪讬讛 讘讝讻讜转 讻转讬讘 讛 Destructuring 砖诇 JavaScript. 讜讗讜诇讬 讛讬转专讜谉 讛讻讬 讙讚讜诇: 讗谞讬 讬讻讜诇 诇讛砖转诪砖 讘讗讜转讜 砖诐 诪砖转谞讛 讘讻诇 讗讞转 诪讛驻讜谞拽爪讬讜转 讘诇讬 讘注讬讛 (讘谞讬讙讜讚 诇讘诇讜拽 讛 switch/case 砖诐 讻诇 讘诇讜拽 case 注讜讘讚 注诇 讗讜转诐 诪砖转谞讬诐 讻诪讜 讻诇 讛讗讞专讬诐).
讗转 专讜讘 讛拽讜讚 讛讙谞专讬 讛注讘专转讬 诇拽讜讘抓 reducerUtils 讘讜 讗驻砖专 诇讛砖转诪砖 诪讻诇 讗讞讚 诪讛 Reducers 讘诪注专讻转:
function convertActionTypeToName(actionType) {
return actionType.toLowerCase().replaceAll(/_(\w)/g, v => v[1].toUpperCase());
}
export default function createReducer(handlers) {
return function reducer(state = [], action) {
const key = convertActionTypeToName(action.type);
const handler = handlers[key];
if (handler) {
return handler(state, action);
} else {
return state;
}
};
}
讗转诐 讬讻讜诇讬诐 诇砖讞拽 注诐 讛拽讜讚 讘 Sandbox 砖讛讻谞转讬 讻讗谉:
https://codesandbox.io/s/2020-08-reduce-redux-boilerplate-2-88dnv
讘讞诇拽 讛讘讗 讘住讬讚专讛 讗讚讘专 注诇 讛拽讜诪驻讜谞谞讟讜转 讜谞专讗讛 讗讬讱 诇爪诪爪诐 拽讜讚 Boilerplate 讘转讜讱 拽讜诪驻讜谞谞讟讛 讛诪讞讜讘专转 诇 Redux.1 419
讛讬 讞讘专讬诐 诇驻谞讬 讻诪讛 讬诪讬诐 讻转讘转讬 讻讗谉 注诇 驻讬专爪转 讗讘讟讞讛 讘讗转专 讛讘讬讟讜讞 讛诇讗讜诪讬 诇驻讬 驻专住讜诐 砖讛讬讛 讘讗转专 讛讗专抓. 讝讛 讛诇讬谞拽 讛诪转讜拽谉 诇讻转讘讛:
1 419
# 讗讬讱 诇爪诪爪诐 Boilerplate 讘拽讜讚 Redux 讘讗诪爪注讜转 ES6 Proxy
诇驻谞讬 讻诪讛 讬诪讬诐 讙讚讬 讛注讬专 讻讗谉 砖讗讞转 讛讘注讬讜转 讛诪专讻讝讬讜转 注诐 Redux 讛讬讗 讻诪讜转 拽讜讚 讛 Boilerplate 砖爪专讬讱 诇讻转讜讘. 诇讚注转讬 讛拽砖讬讬诐 讘注讘讜讚讛 注诐 Redux 讛诐 讗讞专讬诐 讗讘诇 讛讛注专讛 讛讝讗转 讚讞驻讛 讗讜转讬 诇砖讞拽 拽爪转 注诐 讛讻诇讬诐 讻讚讬 诇讻转讜讘 拽讜讚 专讬讚讗拽住 拽爪专 讬讜转专. 讗讞转 讛转讜爪讗讜转 讛讬讗 讛转讘谞讬转 讛拽爪专讛 讛讘讗讛 诇讞住讻讜谉 讘拽讜讚 讛 Action Creator (讗谞讬 诪拽讜讜讛 讘讛诪砖讱 诇驻专住诐 注讜讚 讻诪讛 转讘谞讬讜转 诪讜注讬诇讜转 讘专讜讞 讝讜).
## 注诇 诪讛 讗谞讞谞讜 诪讚讘专讬诐 讻砖讗谞讞谞讜 讗讜诪专讬诐 Boilerplate
讛拽讜讚 讛讘讗 诇拽讜讞 诪转讜讱 讚讜讙诪转 Redux 诪转讜讱 转讬注讜讚 讛住驻专讬讛:
let nextTodoId = 0
export const addTodo = text => ({
type: 'ADD_TODO',
id: nextTodoId++,
text
})
export const setVisibilityFilter = filter => ({
type: 'SET_VISIBILITY_FILTER',
filter
})
export const toggleTodo = id => ({
type: 'TOGGLE_TODO',
id
})
export const VisibilityFilters = {
SHOW_ALL: 'SHOW_ALL',
SHOW_COMPLETED: 'SHOW_COMPLETED',
SHOW_ACTIVE: 'SHOW_ACTIVE'
}
讘 Redux 讻诇 驻注讜诇讛 讙诇讜讘讗诇讬转 砖讗谞讞谞讜 专讜爪讬诐 诇注砖讜转 讘讬讬砖讜诐 诪讬讜爪讙转 注诇 讬讚讬 讗讜讘讬拽讟 Action. 讛拽讜讚 讛讜讗 诪转讜讱 讛拽讜讘抓 actions/index.js 讜讻诇 诪讛 砖讛讜讗 注讜砖讛 讝讛 诇讛讙讚讬专 驻讜谞拽爪讬讜转 砖讬讜爪专讜转 讗讜讘讬拽讟讬诐 讗诇讛. 讘诪讬诇讬诐 讗讞专讜转 讘注讜诇诐 诪讜谞讞讛 注爪诪讬诐 专讙讬诇 讘砖讘讬诇 诇讛讜住讬祝 讗讜讘讬拽讟 Todo 讛讬讬谞讜 讬讻讜诇讬诐 诇讚诪讬讬谉 拽讜讚 讻讝讛 砖驻砖讜讟 诪驻注讬诇 驻讜谞拽爪讬讛:
todos.addTodo(input.value);
讘 Redux 讬砖 诇谞讜 注讜讚 砖诇讘 诇注讘讜讚: 讗谞讞谞讜 爪专讬讻讬诐 诇讬爪讜专 讗讜讘讬拽讟 砖诪讬讬爪讙 讗转 讛驻专诪讟专讬诐 讜讗讜转讜 诇讛注讘讬专 诇驻讜谞拽爪讬讛 讙诇讜讘讗诇讬转 讘砖诐 dispatch. 讛专讘讛 驻注诪讬诐 (讻诪讜 讘讚讜讙诪讗 诪转讞讬诇转 讛驻讜住讟) 谞讬爪讜专 驻讜谞拽爪讬讛 砖讬讜爪专转 讗转 讛讗讜讘讬拽讟 讘砖讘讬诇 诇讗 诇讛转讘诇讘诇 讘砖诪讜转 讛驻专诪讟专讬诐 讜讻讱 谞拽讘诇:
export const addTodo = text => ({
type: 'ADD_TODO',
text
})
dispatch(addTodo(input.value));
讛砖讜专讛 讛讗讞专讜谞讛 讛讬讗 讛讙讬讜谞讬转 讜诪诪砖 讚讜诪讛 诇拽讜讚 讛驻注诇转 驻讜谞拽爪讬讛 驻砖讜讟讛, 讗讘诇 讻诇 诪讛 砖诇驻谞讬讛 谞拽专讗 Boilerplate. 讝讛 拽讜讚 砖讗谞讬 讻讜转讘 讗讜转讜 专拽 讘砖讘讬诇 砖 Redux 讬讛讬讛 砖诪讞.
注讻砖讬讜 讗谞讬 讬讜讚注 诪讛 讗转诐 讞讜砖讘讬诐 - 诪讛 讛讘注讬讛 诇讜讜转专 注诇 讛 Action Creator 讜驻砖讜讟 诇讻转讜讘 拽讜讚 砖谞专讗讛 讻讱:
dispatch({ type: 'ADD_TODO', text: input.value });
讗讝 讝讛 注讜讘讚 讗讘诇 讛专讘讛 讗谞砖讬诐 诪专讙讬砖讬诐 专注 注诐 住讙谞讜谉 讛讻转讬讘讛 讛讝讛: 讛诪讬诇讬诐 text 讜 type 讬讞讝专讜 注诇 注爪诪谉 讻诇 驻注诐 砖讗谞讬 诪驻注讬诇 讗转 讛驻讜谞拽爪讬讛, 讜讛讟拽住讟 ADD_TODO 讘讗讜转讬讜转 讙讚讜诇讜转 诇讗 诪住转讚专 注诐 讗讬讱 砖讗谞讞谞讜 专讙讬诇讬诐 诇专讗讜转 砖诐 砖诇 驻讜谞拽爪讬讛.
## 讗讬讱 ES6 Proxy 讬讻讜诇讬诐 诇注讝讜专
讚专讱 讗讞转 诇讬爪讜专 讗转 讛 Action Creators 讘爪讜专讛 讗讜讟讜诪讟讬转 讛讬讗 诇讛砖转诪砖 讘 ES6 Proxy. 讛专注讬讜谉 讛讜讗 诇转驻讜住 讻诇 拽专讬讗讛 诇讗讜讘讬拽讟 讛 Actions 讜诇讬爪讜专 诪诪谞讛 讗讜讘讬拽讟 讘爪讜专讛 讚讬谞诪讬转. 讻讱 谞专讗讛 讛拽讜讚:
function convertActionNameToType(actionName) {
return actionName.replaceAll(/([A-Z])/g, "_$1").toUpperCase();
}
export const actions = new Proxy(
{},
{
get: function(target, prop) {
if (target[prop] === undefined)
return function(args) {
return {
type: convertActionNameToType(prop),
...args
};
};
else return target[prop];
}
}
);
讗转 讝讛 讗驻砖专 诇讻转讜讘 驻注诐 讗讞转 讘讬讬砖讜诐 讜诇讗讜专讱 讻诇 讛讬讬砖讜诐 讗谞讬 讬讻讜诇 注讻砖讬讜 诇讛砖转诪砖 讘 actions 讻讚讬 诇讬爪讜专 讗讜讘讬拽讟讬 驻注讜诇讛 讘爪讜专讛 讚讬谞诪讬转 诇讙诪专讬. 讻讱 注砖讜讬讛 诇讛讬专讗讜转 拽讜诪驻讜谞谞讟讛 砖诪砖转诪砖转 讘讗讜讘讬拽讟 讛 actions 砖讬爪专谞讜:
const AddTodo = ({ dispatch }) => {
let input;
return (
<div>
<form
onSubmit={e => {
e.preventDefault();
if (!input.value.trim()) {
return;
}
dispatch(actions.addTodo({ text: input.value, id: lastId++ }));
input.value = "";
}}
>
<input ref={node => (input = node)} />
<button type="submit">Add Todo</button>
</form>
</div>
);
};
讻诪讜讘谉 诪讛 砖谞讞诪讚 砖注讻砖讬讜 讻诇 驻注诐 砖讗谞讬 爪专讬讱 诇讛讜住讬祝 Action 讞讚砖 讗谞讬 讻讘专 诇讗 爪专讬讱 诇讛讜住讬祝 注讘讜专讛 Action Creator. 讻诇 诪讛 砖讗谞讬 爪专讬讱 讛讜讗 诇讻转讜讘 讗转 讛诪讬诪讜砖 讘转讜讱 讛 Reducer 讜诇讛转讞讬诇 诇讛砖转诪砖 讘 Action 讛讞讚砖 砖讬爪专转讬. 诪爪讚 砖谞讬 讗谞讞谞讜 谞砖讗专讬诐 注诐 讛转讘谞讬转 砖诇 拽专讬讗讛 诇驻讜谞拽爪讬讜转 讘转讜讱 讛 Dispatch 讜讗谞讬 诇讗 爪专讬讱 诇讛讙讚讬专 诇讘讚 讗讜讘讬拽讟 注诐 type 讻诇 驻注诐 砖专讜爪讛 诇拽专讜讗 诇 Action.
讘驻讜住讟讬诐 讛讘讗讬诐 讘住讬讚专讛 讗谞讬 诪转讻谞谉 诇谞住讜转 诇爪诪爪诐 Boilerplates 谞讜住驻讬诐 砖诇 Redux - 诇诪砖诇 讗转 拽讜讚 讛 Reducer 讜讗转 讛 mapStateToProps 讛诪驻讜专住诐.