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
Untitled</a> by Ynon Perek (<a href="https://codepen.io/ynonp">@ynonp</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
1 419
# ืืืค JavaScript: ืฉืืืจืช ืืืืข ืืงืืฆืื ืืืขืื ื ืืืจื
ืืืฉืืื Front End ืืืคืฉืจืื ืืืฉืชืืฉืื ืืืื ืืก ืืืืข. ืืจืื ืคืขืืื ืื ืื ื ืฉืืืจืื ืืช ืืืืืข ืืฉืจืช ืืื ืืคืขืืื ืืื ืื ื ืฉืจืช ืื ืฉืืืืืข ืื ืืชืืื ืืฉืืืจื ืืืกืืก ืื ืชืื ืื ืืื ืืืื ื ืจืืฆืื ืืชืช ืืช ืืืืืข ืืืฉืชืืฉ ืืชืืจ ืงืืืฅ. ืืืืืื ืื ืืจืื ืืื ืืืืฉ ืืืคืก ืขื ืฉื ื ืืคืชืืจืื - ืืคืชืืจ ืืื "ืืืจืื" ืืช ืืืืืข ืฉืืืืคืก ืืงืืืฅ JSON ืขื ืืืฉื ืืืฉืชืืฉ ืืืคืชืืจ ืฉื ื "ืืขืื" ืงืืืฅ JSON ืืืืืฉื ืืื ืืืื ืืื ื ืืช ืืืืคืก.
## ืงืื ื HTML
ืงืื ื HTML ืฉื ืืืืืื ืืืื ืืืคืก ืขื 3 ืฉืืืช. ืืื ืฉืื ืืืืืจ name ืฉืืืื ืืืคืชื ื JSON, ืืืขืจื ืืืื ืืขืจื ืฉืืืฉืชืืฉ ืืื ืืก ืืฉืื. ืื ืืงืื:
<div>
<button id="exportButton">Export to JSON</button>
<button id="importButton">Import From JSON</button>
</div>
<hr />
<form>
<div>
<label>Name: </label>
<input type="text" name="name" />
</div>
<div>
<label>Phone Number: </label>
<input type="tel" name="tel" />
</div>
<div>
<label>Email:</label>
<input type="email" name="email" />
</div>
</form>
## ืฉืืืจืช ืืืืืข ืืงืืืฅ
ืืฉืืื ืืงืืช ืืช ืชืืื ืืฉืืืช ืืงืืืฅ ืืฆืื ืขื ืืืืฉื ืื ื ืฆืจืื ืฉื ื ืืืจืื: ืงืืื ืื ืื ื ืฆืจืื ืืืขืืืจ ืืช ืื ืืืืืข ืืืืืคืก ืืืืืืงื JSON, ืืืืจ ืื ืฆืจืื "ืืืืจืื" ืืช ืืืืืงื ื JSON ืืชืืจ ืงืืืฅ.
ืืฉืืื ืืืืง ืืจืืฉืื ืงื ืืืฉืชืืฉ ื FormData:
const form = document.querySelector('form');
const fd = new FormData(form);
const data = JSON.stringify(Object.fromEntries(fd));
ืืืจื ืื ืื ื ืืืฆืจ ืืืื ื "ืงืืฉืืจ" ืฉืืืจืื ืืช ืืงืืืฅ, ืืืืฅ ืขืืื ืืืืืง ืืืชื ืืืืกื:
const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(data);
const downloadAnchorNode = document.createElement('a');
downloadAnchorNode.setAttribute("href", dataStr);
downloadAnchorNode.setAttribute("download", "form.json");
document.body.appendChild(downloadAnchorNode); // required for firefox
downloadAnchorNode.click();
downloadAnchorNode.remove();
ืงืื ืืคืื ืงืฆืื ืืืื ืืื ืืื:
function download() {
const form = document.querySelector('form');
const fd = new FormData(form);
const data = JSON.stringify(Object.fromEntries(fd));
const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(data);
const downloadAnchorNode = document.createElement('a');
downloadAnchorNode.setAttribute("href", dataStr);
downloadAnchorNode.setAttribute("download", "form.json");
document.body.appendChild(downloadAnchorNode); // required for firefox
downloadAnchorNode.click();
downloadAnchorNode.remove();
}
## ืืขืืืช ืืงืืืฅ ืืขืืืื ืืืืคืก
ืืืืง ืืฉื ื ืืื ืืชืช ืืืฉืชืืฉ ืืคืฉืจืืช ืืืขืืืช ืงืืืฅ ืืืขืืื ืืช ืืืืคืก ืืืชืื ืืคืจืืื ืฉืืงืืืฅ. ืคื ืื ืื ื ื ืขืฉื ืชืืืื ืืคืื - ืงืืื ื ืืฆืืจ ืืืื ื input ืฉืืืืขื ืืืขืืืช ืงืืฆืื, ื ืืืฅ ืขืืื ืืื ืืคืชืื ืืช ืืืืืืื ืฉื ืืืคืืคื ืืืืืจืช ืงืืืฅ, ื ืงืจื ืืช ืชืืื ืืงืืืฅ, ื ืืคืื ืืช ืืชืืื ื JSON ืืื ื ืฉืชืืฉ ืืงืื JavaScript ืืื ืืขืืื ืืช ืืฉืืืช ืฉืืืืคืก ืืชืื ืืขืจืืื ืฉืงืจืื ื ืื JSON.
ืกื ืืื ืืคืื ืงืฆืื ืืื:
function upload() {
const form = document.querySelector('form');
const input = document.createElement('input');
input.type = 'file';
input.onchange = e => {
const file = e.target.files[0];
const reader = new FileReader();
reader.readAsText(file,'UTF-8');
reader.onload = readerEvent => {
const content = JSON.parse(readerEvent.target.result); // this is the content!
console.log(typeof content);
for (const key of Object.keys(content)) {
console.log(key);
form.querySelector(`input[name="${key}"]`).value = content[key];
}
}
}
input.click();
}
ืืงืืฉืืจ ืืื ืชืืืื ืืืฆืื ืืช ืื ืืงืื ืืงืืืคื ืขืืื:
https://codepen.io/ynonp/pen/XWZbpoK
ืื ืื ืืชื ืงืืจืืื ืืช ืื ืืืืคืืคื ืื ืื ื ืืื ืืืืืขื:
<iframe height="300" style="width: 100%;" scrolling="no" title="Untitled" src="https://codepen.io/ynonp/embed/XWZbpoK?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/ynonp/pen/XWZbpoK">1 419
# ืืฆื ืฉืขื ืืืื
ืืืฆื ืฉืขื ืืืื ืืคืฉืจ ืืืืื ืฉืคื ืืืฉื (ืื ืฉืคืช ืชืื ืืช ืืืฉื).
ืืืฆื ืฉืขื ืืืื ืืคืฉืจ ืืืชืื ืคืจืืืงื ืฆื, ืืืื ืืื ืฉืืื ืืก ืืกืฃ ืื ืขืืฉื ืจืืฉื ืืื ืขื ืืืจืื.
ืืืฆื ืฉืขื ืืืื ืืคืฉืจ ืืืืื ืืขืฆื, ืื ืื ืืจืืข ืื ื ืจืื ืฉืืื ืื ืืืฉืจืื.
ืืืฆื ืฉืขื ืืืื ืืคืฉืจ ืืืืื ืก ืืืืฉืจ ืืืืจืืืฉ ืืืื ืื ืจืืื ืื ืืฉืืืข.
ืืืื ืืื ืืฉ ืขืื ืืื ืกืืฃ ืจืขืืื ืืช ืฉื ืืืจืื ืฉืืืืชื ืจืืฆืื ืืขืฉืืช.
ืืืขืื ืขื ืืืฆื ืฉืขื ืืืื ืืืืช ืื ืฉืืืืืื ืืืชืืื. ืื ืื ืขืืืจ ืืขืฉืืช ืกืคืืจื ืฉืืืขืืื ืืื ืืขืืื ืืช ืื, ืื ืืืืื ืคืืืชืื ืืืืฉ ืืื ืื ืืืขืช ืืื ืืืชืจ. ืืขืจื ืฉื "ืืฆื ืฉืขื ืืืื" ืืืืข ืืืืื ืืจืืืง, ืืืจื ืืืืฉืื ืื ืฉื ืื.
ืืื ืืืฆื ืฉืขื ืืืื ืฉื ืขืืืื ืืืืื ืจืืืง ืื ืืฉ ืขืจื ืืืืื - ืืื ืืกืคืงืช ืื ื ืชืืืฉืช ืืฉืืขืืช, ืืืืื, ืืืืืื ืขืฆืื ืืื ืืืฉืจ. ืืฆื ืฉืขื ืืืื ืืืืื ืืจืืืง ืืืช ืืืฆื ืฉืขื ืฉืืฉ ืืื ืืฉืืืืื. ืื ืชืืืจื ืืืืชืจ ืขืืื.
1 419
# ืืืืื ืฉืืฉ ืืขืื
ืืื ืืืืจืื ืืช ืืจืืฉืื ืื ืฉืื ืืขืืืื ืืืืชืืช ืืชืื ืืช ืืื ืฉืืืจื ืฉืกืืืืชื ืืืื ืืฉืืื ืืืืชื ืฆืจืื ืืขืืื ืืช ืืืื ืื ืืฆืื ืฉื ืืงืื ืืืื ื ืืืจ ืืื ืฉืืขืืจื ืฉืื ืืื ืืืืื ืืืื. ืฉืื ืืชื ืืช ืืืืจืืช ืืขืืจื ืืขืืจืชื ืืคืชืื ืงืืืฅ ืงืืืฅ ืืืฉืืืจ ืืืชื ืืืืฉ ืขื ืืืื ืื ืืฆืื ืื ืืื ื. ืืืจื ืฉืจืืชื ืืืชื ืืขืืจ ืืืชืฃ ืขืืฉื ืืช ืืขืืืื ืืกืืืืคืืช ืืื ืืฆืืขื ืฉืืืชืื ืกืงืจืืคื ืืืงืื ืืืจืืชื ืื ืืื ืืืฉืชืืฉ ื perl. ืืงื ืื ื ืฉืขืืช ืืืชืื ืืช ืืกืงืจืืคื ืฉืืขืืื ืืื ืฉืฆืจืื, ืืจืื ืืืชืจ ืืื ืืื ืฉืืื ืืืงื ืื ืืกืืื ืืขืืืจ ืขื ืื ืืงืืฆืื ืืื ืืช. ืืืงื ืื ืฉืืืขืืช ืืืืื ืฉืขืฉืื ื ืืช ืืืืจ ืื ืืื - ืื ืืคืขื ืืืื ืฉืืื ืฆืจืื ืืชืงื ืืื ืื ืืฆืื ืืืจ ืืื ืื ื ืืช ืืืืื ืืขืืื ืืืจ.
ืืจืื ืคืขืืื ืืืงื ืืื ืืืืืช ืฉืืืชื ืืขืื ืืฉืืืช ืืขืืืื ืฉืื ื ืืฉืืฉ ืืจื ืืืื ืืืชืจ. ืืืืจื ืืื, ืืฉืื ืื ื ื ืฉืืจืื ืขื ืืืืื ืืฉืืืืช ืืขืืืื ืืคืืืช ืืืืื, ืจืง ืื ืื ืื ืฉืื ืื ื ืืืืจืื, ืื ืื ื ืขืืฉืื ื ืืง ืืขืฆืื ื ืืืืจืืื:
1. ืื ืื ื ื ืืชืื ืืืืงืืช ืืฆืืจื ืืกืืืืช, ืืืืืื ืฉืืืช ืืืจื ืืืืืื ืื ืืืืื ืืืืชืจ ืืืชืื ืืืืงืืช, ืืืจืืช ืฉืื ืืงืืืื ืืื ืืช ื ROI ืืืื ืืืืชืจ ืืืคืฉืจื. ืืฉืืืฉืื ืืืื ืืฉืื ื ืืืจ ืืืกืืืจ ืืื ืืืืืงืืช ืฉืื ื ืื ืงืจืืืืืช ืืืฆืืืช ืืืขืจืืช.
2. ืื ืื ื ื ืฉืชืืฉ ืืืืื ืืฆืืจื ืืกืืืืช, ืืืืืื ืฉืืื ืฆืจืื ืืขืืื ืืืชื, ืืืจืืช ืฉืื ืฉืื ืืืจืื ืืฉืชืืฉืื ืืฆืืจื ืืืชืจ ืืขืืื ืืืืชื ืืืื. ืืฉืื ืืจืื ืื ื ืืช ืืืจื ืฉืืื ื ืืืจ ืืืกืืืจ ืืื ืื ืืืขืื ืืืื ืืฉืืื ืฉืืื ืื ืืชืืืื ืื ื.
3. ืื ืื ื ื ืืืจ ืืืื ืืืืืื ืืกืืืืช ืื ืขืงื ืืืชื ืืื ืฉืชืชืืื ืืฆืจืืื ืฉืื ื, ืืืจืืช ืฉืืื ืืืืืื ืืืจืช ืืืชื ืืืืื ืืขืืื ืืจืื ืืืชืจ ืืื.
ืื ืืฉืื ืื ืขืืื, ืื ืืชื ืจืืืื ืฉืืชื ืขืืืืื ืงืฉื ืืื ืืฉืืื ืืงืื ืชืืฆืื ืฉืืืจืื ืืงืืืื ืืืชืจ ืืงืืืช, ืื ืืชื ืืืืืื ืฉืืฆืืื ืืฆืืืช ืืชืืืืืื ืขื ืืขืืืช ืฉืืฃ ืืื ืื ืืชืืืื ืืืชื ืืขืืจ - ืืฉ ืกืืืื ืื ืจืข ืฉืืชื ืชืงืืขืื ืืืืจ ืฉืืคืจืชื ืืขืฆืืื. ืืืจื ืืฆืืช ืืื ื ืืื ืงืืื ืื ืืจืืืช ืืืชื. ืืืืื ืฉืืืง ืืืืืืืฆืื ืฉืืื ืื ืคืืงืืืืืื ืื ืฉืืคืฉืจ ืืฉื ืืช ืืืชื, ืืฉืฉืืื ืืชืช ืืืืื ืืช ืืืืฉื ืืืจืช ืืืชืช ืื ืืช ืืืื ืืื ืืจืืืช ืชืืฆืืืช.
ืฉืืืืฉ ืืขืื ืืืืื ืืืจืื ืืืงื ืืื, ืืื ืื ืืื ืืจืื ืขื ืืืคื ืืื ืขื ืืืืื ืขืืจ. ืืืจืืช ืืืืื ืืขืืจ, ืื ืื ืืจืืข ื ืจืืืช ืืจืกื ืืช, ืืืจ ืืืื ืชืคืชื ืืื ืืคืฉืจืืืืช ืืืฉืืช ืืืชืงืื.
1 419
runner.start(cmd);
form.current.querySelector('input').value = '';
}
return (
<div className="App">
<p>{JSON.stringify(runner.lines)}</p>
<form onSubmit={start} ref={form}>
<label>
Command:
<input type="text" />
</label>
<button>Start</button>
</form>
<Output />
</div>
)
});
export default App
ืืืืขื ืืื ืงืื ืืฆืืืชื ืืืฆืืจ ืงืฉืจ ืื ืืืืื ื ืืื ืงืื ืฆื ืืงืื ืืฉืจืช ืคืืืชืื. ืขื ืืคืืคืืืจืืืช ืฉื ืืืฉืงื ืืื, ืื ืื ืื ืืื ืืืื ืืกืคืง ืชืืืืฃ ืืื ืืืื ืฉืืจืช ืคืงืืื ืื ืืืชืืืฉืง ืืืื ืฉืืจืช ืคืงืืื ืงืืื ืฉืืื.
## ืขืืฉืื ืืชื
ืืงืื ืืจืืข ืขืืื ืืืืคืฉืจ ืืืจืืฅ ืคืงืืืืช ืขื ืืฉืจืช ืืื ืืขืืื ืืืื ืืงืืืืช ืืืงืืื. ืืงืื ืื ืืืคื ืืืฆื ืื ืืฉืชืืฉ ืื ืกื ืืืจืืฅ ืืื ืคืงืืืืช ืืืงืืื - ืงืื ืฆื ืืืงืื ืืฆืื ืืช ืืคืื ืฉื ืฉืชื ืืคืงืืืืช ืืขืืจืื, ืืงืื ืฆื ืืฉืจืช ืื ืืกืคืง ืืจืืข ืฉืื ืืจื ืืืงืื ืืืืืื ืื ืืคืงืืื ืฉืืื ืืจืืฅ ืฉืืฆืจื ืืช ืืคืื ืฉื ืฉืื. ืชืจืืื ืืขื ืืื ืืื ืฉืจืืฆื ืืฉืืง ืขื ืืงืื ืืื ืืืื ืืืืกืืฃ ืืช ืืชืืืื, ืืืืืจ ืืืืกืืฃ ืืืืืข ืฉืืฉืจืช ืฉืืื ืื ืืืื ืฉื ืืคืงืืื ืฉืืื ืืจืืฅ, ืืืขืืื ืืช ืงืื ืฆื ืืืงืื ืื ืฉืืคืฉืจ ืืืื ืืจืืืช ืฉืืจืืช ืคืื ืืืื ืคืงืืืืช ืืืงืืื, ืืืื ืืฆืืขืื ืฉืื ืื ืืคื ืืืืื ืฉื ืื ืคืงืืื.1 419
# ืืืื ื ืืชืื ืืกืืฃ ืขื Python, React ื MobX
ืืชืืืื ืืืฆืืื ืช ืฉื ืคืืืชืื ื Socket.IO ืืืคืฉืจืช ืื ื ืืืขื ืืืื ืงืื ืืืชืื ืืืฉืงืื ืืจืคืืื ืืืื ืฉืืจืช ืคืงืืื. ืืืืืื ืฉื ืืืื ืื ื ืจืืฆื ืืืชืื ืืืฉืง ืืจืคื ืืืจืฆื ืฉื ืคืงืืืืช ืขื ืืืื ื ืืจืืืงืช. ืืืื ืื ื ืฉืจืช ืคืืืชืื ืฉืืงืื ืืืืขืืช ืืืจืืฅ ืคืงืืืืช, ืืช ืื ืืคืื ืฉื ืืคืงืืื ืืื ืฉืืื ื Web Socket ืืืืฉืื ืฆื ืืงืื ืืืฆืื ืขื ืืืกื.
## ืงืื ืฆื ืฉืจืช - ืคืืืชืื ื Socket.IO
ื ืชืงืื ืืช ืืกืคืจืื
python-socketio ืืื ืืช aiohttp, ืฉืชืืื ืขื pip:
$ pip install aiohttp python-socketio
ืืื ืื ื ืืืื ืื ืืืชืื ืงืื ืฆื ืฉืจืช. ืืฉืืื ืฉืจืช Socket.IO ืืคืืืชืื ืืกืคืืง ืืืชืื ืคืื ืงืฆืื ืืื ืืืืขื ืฉืื ืื ื ืฆืจืืืื ืืงืื ืืืกืื ืืืชื ืขื ื Decorator ืืืชืืื. ืื ื ืจืืฆื ืืงืื ืืืืขื ืฉื ืงืจืืช start ืืฉืืืื ืื ืคืจืืืจ ืฉืืื ืืืงืกื ืฉื ืฉืืจืช ืืคืงืืื ืืืจืฆื. ืคืืืชืื ืืจืืฅ ืืช ืืคืงืืื ืืืงืจื ืฉืืจืืช ื stdout, ืืื ืฉืืจื ืฉืืื ืงืืจื ืืื ืืฉืื ืืืจื ืืฆื ืืงืื. ืืฉืืื ืื ืืกืคืืง ืื ืงืืืฅ ืคืืืชืื ืืื ืื ื ืงืืจื ืื server.py ืขื ืืชืืื ืืื:
from aiohttp import web
import asyncio
import socketio
sio = socketio.AsyncServer(cors_allowed_origins='*', aync_mode='aiohttp')
app = web.Application()
sio.attach(app)
@sio.on('start')
async def start_command(sid, cmd):
print("Socket ID: " , sid)
proc = await asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
while not proc.stdout.at_eof():
next_line = await proc.stdout.readline()
await sio.emit('output', next_line, to=sid)
await proc.wait()
if __name__ == '__main__':
web.run_app(app)
ืฉืชื ืคืื ืงืฆืืืช ืืชืงืฉืืจืช ืืื ืื sio.on ืฉืืืืจืช ืงืื ืืืคืื ืืืืจืืข ืืืืจืืข ืขื ืฉื ืืกืืื (ืืืืืื ืฉืื ื start) ื sio.emit ืฉืฉืืืืช ืืืจืืข ืืืงืื. ืื ื ืืฉืชืืฉ ืืคืจืืืจ to ืืื ืืฉืืื ืืช ืืคืื ืจืง ืืืงืื ืฉืืจืืฅ ืืช ืืคืงืืื.
## ืงืื ืฆื ืืงืื - ืืืืืงืก
ืืฆื ืืืงืื ืื ื ืจืืฆื ืืืชืื ืืืืงื ืฉื ืืืืืงื ืฉืืืืขืช ืืืจืืฅ ืคืงืืืืช ืืืฉืืืจ ืืช ืืคืื ืฉืืื. ืืืื ืื ื ืื ืืืชืื ืืช ืืืืืืงื ืืืืืืงืก ืขื ืืขืจื ืฉืฉืืืจ ืืช ืื ืฉืืจืืช ืืคืื. ืื ืคืขื ืฉืืืืขื ืฉืืจืช ืคืื ืืืฉื ื ืืชืื ืืืชื ืืืขืจื, ืืืฉืืจืืฆืื ืคืงืืื ืืืฉื ื ืจืืงื ืืช ืืืขืจื. ืืช ืืงืื ืืชืืชื ืืงืืืฅ ืืฉื runner.js ืืชืื ืชืืงืื ืืฉื mobx. ืื ืชืืื ืืงืืืฅ:
import { observable, makeObservable, action } from 'mobx';
import { io } from "socket.io-client";
const socket = io("http://localhost:8080");
const enc = new TextDecoder();
class Runner {
constructor() {
this.output = [];
makeObservable(this, {
clear: action.bound,
append: action.bound,
output: observable,
});
}
append(msg) {
const msgText = enc.decode(msg);
this.output.push(msgText);
}
clear() {
this.output = [];
}
start(cmd) {
this.clear();
socket.emit('start', cmd);
}
}
const runner = new Runner();
socket.on('output', (msg) => {
runner.append(msg);
});
export default runner;
ืืคืื ืงืฆืื ืืืืืื ืฉืฉืืื ืืืชืขืื ืขืืื ืืื ืืื append ืืกืคืฆืืคืืช ืขื ืฉืืจืช ืืืืจื ืื:
const enc = new TextDecoder();
// ...
const msgText = enc.decode(msg);
ืื ืื ื ืืงืืืื ืืืืขืืช ืืคืืืชืื ืืชืืจ ืจืฆืคืื ืฉื ืืชืื ืืื ืืชืืจ ืืืจืืืืช, ืืืื ืฉืืื ืขืืื ื API ืฉื ืืจืฆืช ืคืงืืืืช ืืขืจืืช ืืคืืืชืื. ื JavaScript, ืฆืจืื ืืชืจืื ืืช ืืืกืฃ ืืืชืื ืืื ืืืืจืืืช ืืื ืืชืคืงืื ืฉื TextDecoder. ืืคืฉืจ ืืื ืื ืืขืฉืืช ืืช ืืืืจื ืืคืืืชืื ืืคื ื ืืฉืืืื ืื ืืชื ืืจืืืฉืื ืืืชืจ ื ืื ืฉื.
## ืืฆืืช ืืคืื ืืืืฉืง ืจืืืงื
ืืืืืง ืืืืจืื ืืื ืงืื ืจืืืงื ืฉืืฆืื ืชืืื ืืืชืืืช ืคืงืืื ืืงืืคืกื ืฉืื ืืืฆื ืื ืืคืื. ืืฉืชืืฉ ืืืชื ืคืงืืื ืืชืืื, ืฉืจืช ืคืืืชืื ืืจืืฅ ืืืชื ืืฉืืื ืืช ืืคืื ืืืจื ืืืฉืชืืฉ ืืงืื ืืช ืื ืืคืื ืืชืืืช ื output. ืื ืืงืื ืืงืืืฅ App.jsx:
import { useRef } from 'react'
import { observer } from 'mobx-react-lite';
import runner from './mobx/runner';
import './index.css';
const Output = observer(function Output() {
return (
<div className="output">
<ul>
{runner.output.map((line, index) => (
<li key={index}><pre>{line}</pre></li>
))}
</ul>
</div>
);
});
const App = observer(function App() {
const form = useRef(null);
function start(ev) {
ev.preventDefault();
const cmd = form.current.querySelector('input').value;1 419
ืืืืจืกื 18 ืฉื ืจืืืงื, ืื ืืืกืืคืื ืงืจืืื ื
startTransition ืืื ืฉืืืกืคืชื ืืืืืื, ืืืคืืคื ืขืืฆืจ ืืช ืืจืื ืืืจ ืืืืฆืข ืืื ืืืคื ืืืืืฆื ืขื ืืืคืชืืจ. ืื ื ืืชื ืืืคืืคื ืืืืื ืืช ืืืคื ืืืืจืืข mousemove ืืืืฆืข ื render ืืืขืืื ืืช ืืืฉืชื ื ืืืืืืืื. ืืชืืฆืื ืืื ืฉ-6 ืืืืคืขืื ืฉื MouseTracker ืื ืืฆืืืื ืืช ืืืชื ืขืจื.
ืฆืจืื ืืืืื - ืืืขืื ืืื ืื ืฉ-6 ืืงืืืคืื ื ืืืช ืืฆืืืืช ืืงืกื ืฉืื ื ืืืื ืื ืฉืื ืื. ืืคืขืืื ืื ืืืืื ื ืฉืืืฉืง ืืชืขืืื ืืืื ืืืช ืืืืงืื ืืกืืืืื ืื ืืชืขืืื ื ืืืชืจ ืืืจ ืืืืจืื. ืืืขืื ืฉืื ื ืืื ืืื ืฉืืืืื ืช ืืืฉืชืืฉ ืื 6 ืืืกืคืจืื ืืืฆืืื ืืืืืง ืืืืชื ืืื, ืืืืืจ ืืฉืชืืฉ ืืืืฅ ืขื ืืืคืชืืจ ืืฉืื ืื ืืขืจื ืฉื count, ืจืืืงื ืืชืืื ืขืืืื ืืืฉืืืืช ืืืฉืืื ืืกืืื ืืืชื ืืื ืืืชื ืืช ืื 6 ืืืกืคืจืื ืืืกื ืืืื ืืืช. ืืืฆื ืืื ืื ืื ืืืืื ื ืืืฆืื ืขืจื ืฉืื ื ืืื ืงืืืคืื ื ืื.
ืคืืชืจืื? ืื ืืืฉืชืืฉ ืืืฉืชื ืื ืืืืืืืืื ืืชืื ืงืืืคืื ื ืืืช ืืื ืืืืฆืื ืืืชื ืืืืฆื ื Store ืืกืืืจ, ืืืืืื ืฉืืกืคืจืื ืฉืืชื ืืฉืชืืฉืื ืื ืื ืืืื ืืกืืืื ืืืืืืืื ืืฉืชืืฉืช ืืคืื ืงืฆืื ืืืฉื ืฉื ืจืืืงื 18 ืืฉื useSyncExternalStore. ืคืื ืงืฆืื ืื ืืขืฆื ืืืงืืช ืื Store ืืชืืืืช ื render ืขืืชืง ืฉื ืืืชื ืืฉืชื ื ืืืืืืื ืืืืืืช ืืืขืืืจ ืืืชื ื render ืืื ืืงืืืคืื ื ืืืช ืฉืืกืชืืืืช ืขืืื. ืื ืืชื ืกืงืจื ืื ืืื ืื ืขืืื ืืืืืจื ืืงืืขืื ืฉืืื ืืฆืคืืช ืืืจืฆืื ืฉื ืืืืฉื.1 419
# ืื ืื Tearing ื React ืืืื ืฉืืืื ืืื ืืืคืช
ืืืจืกื 18 ืฉื ืจืืืงื ืืื ืืกื ืืฉืืืืฉ ืื ืื ืื ืืืฉ ืฉื ืงืจื Concurrent Mode. ืื ืืชื ืืื ืื ืืคืืืงืฆืืืช ืจืืืงื ืืืฉื ื Vite ืื create-react-app, ืืื ืื ืื ืืืคืขื ืืืจืืจืช ืืืื. ืื ืืชื ืืฉืืจืืื ืืคืืืงืฆืื ืืฉื ื ืืจืืืงื 18 ืืชื ืชืงืืื ืืืืขื ืฉืืืงืฉืช ืืื ืืืืืืฃ ืืช ืคืงืืืช ื ReactDOM.render ืืคืงืืื ืืฉื ReactDOM.createRoot ืืื ืืืคืขืื ืืช ืืื ืื ืื. ืื ืื ืื ื Concurrent Mode ืืืืจ ืืขืืืจ ืืคืชืืจ ืืขืืืช ืืืฆืืขืื ืฉื ืืืขืืช ื render-ืื ืืจืืืื ืืื.
ืื ืื ืื Concurrent Mode ืืืกืืฃ ืคืื ืงืฆืื ืืฉื
startTransition ืฉืืืคืฉืจืช ืื ื ืืกืื ืฉืขืืืื ืืกืืื ืืื ืืฉืื ืืฆืจืื ืืืคืกืืง render-ืื ืคืืืช ืืฉืืืื ืืืืจ ืืืจ ืืขืฉืืช render ืืืฉ ืจืง ืืฉืืื ืืฉืื ืื ืืื. ืืืืืจื ืคืืฆ'ืจ ื ืืื ืืื ืืืืง ืฉืืคืืื ืืืื ืืขืืืจ ืืืืฆืืขืื, ืืื ืืืืช ืงืฆืช ืืืชืจ ืืืจืืืช ืืืื ืขืืืื ืืงืคืืฅ ืขืืืื ืืืคืชืขื.
ืืช ืืืืฉื tearing ืืืงืฉืจ ืฉื ืืขืืืช UI ืื ืืฆืืชื ืืชืืขืื ืฉื ืจืืืงื ืื ืืืืจืื ืขื ืจืืืงื 18, ืืื ืจืง ืืคืืกืืื ืืืจืื ืฉืืืืจื ืขื ืืืขืื ืืืจืฆืื ืืฆืืื ืช ืืืืืืื ืฉื Daishi Kato. ืื ืืฉ ืืื 20 ืืงืืช ืคื ืืืืช ืฉืืื ืืืงืฉืื ืื:
https://www.youtube.com/watch?v=oPfSC5bQPR8.
ืืืืจื ื Tearing - ืืืงืฉืจ ืฉื ืจืืืงื ืืืืฉื ืืชืืจ ืืฆื ืื Concurrent Mode ืืืจื ื UI ืืืืืช ืื ืงืื ืกืืกืื ืื ืืืื ืฉืื ืื ืืฉืชื ืื ืืืืืืืืื. ืืืขืื ืืื ืืืืช:
1. ืืฉ ืื ื ืืื ืงืืืคืื ื ืืืช ืฉืืืฉืคืขืืช ืืืฉืชื ื ืืืืืืื - ืื ืืืื ืืืืืช ref, ืืฉืชื ื ืฉืฉืืืจ ื Store ืืืฆืื ื, ืื ืืคืืื ืืชืืจืื ืื ืืฉืขื ืื ืืืืืื ืฉื ืืงืืื ืืืืคืืคื.
2. ืืืืฆืข ืฉืจืืืงื ืขืืฉื render ืืงืืืคืื ื ืืืช ืืืื, ืคืชืืื ืืื ืืืื ืฉืืฉ ืฉืื ืื ืืืชืจ ืืืืฃ ืื ืืืฉืื ืงืจื ื startTransition. ืื ืจืืืงื ืขืืฆืจ ืืื ืืืืื ืืขืฉืืช ืืช ื render ืืืืชืจ ืืืืฃ ืฉืื. ืืืื ื ืืื ืฉืืื ืื 6 ืงืืืคืื ื ืืืช ืฉืืืฉืคืขืืช ืืืฉืชื ื ืืืืืืื, ืืจืืืงื ืจืื ืืจ 3 ืืื ืืคื ื ืฉืืื ืฆืจืื ืืขืฆืืจ.
3. ืชืื ืืื ื render ืืืืชืจ ืืืืฃ, ืืขืจื ืฉื ืืืฉืชื ื ืืืืืืืื ืืฉืชื ื.
4. ืืฉืจืืืงื ืืืืจ ืืจื ืืจ ืืช 3 ืืงืืืคืื ื ืืืช ืฉื ืฉืืจื, ืืื ืืจื ืืจ ืืืชื ืืคื ืืขืจื ืืืืฉ ืฉื ืืืชื ืืฉืชื ื ืืืืืืื.
5. ืจืืืงื ืืฆืื ืขื ืืืกื ืืช ืื 6 ืืงืืืคืื ื ืืืช ืืืื ืืืช, ืืืจืืช ืฉืื ืจืื ืืจื ืืืื ืื ืฉืื ืื ืืขื ืขืจืืื ืฉืื ืื ืฉื ืืืฉืชื ื ืืืืืืืื. ืขื ืืืกื ืื ืื ื ืจืืืื ืืืฉืง ืื ืงืื ืกืืกืื ืื. ืืฆื ืืืืืฉืง ืืชืืกืก ืขื ืขืจื ืืฉื ืฉื ืืืฉืชื ื ืืืืืืืื, ืืืืฆื ืืฉื ื ืขื ืืขืจื ืืืืฉ.
ืืืืฉื ืืจืื ืืืจืฆืื ืืืืื ืืขื ืืื ืช, ืืืจื ืฉืฆืืฆืืชื ืืืชื ืงืฆืช ืืืขืชื ืืงืื ืืื ืฉืืืืืฉ ืืืืืง ืืช ืืืขืื:
import { useState, useTransition } from 'react'
let lastMouseX = 0;
window.addEventListener('mousemove', (e) => {
lastMouseX = e.offsetX;
});
function MouseTracker() {
const start = performance.now();
while (performance.now() - start < 20);
return (
<p>{lastMouseX}</p>
);
}
function App() {
const [count, setCount] = useState(0)
const [isPending, startTransition] = useTransition();
return (
<div className="App">
<p>isPending = {JSON.stringify(isPending)}</p>
<button onClick={() => {
startTransition(() => {
setCount(c => c + 1)
});
}}>{count}</button>
<MouseTracker />
<MouseTracker />
<MouseTracker />
<MouseTracker />
<MouseTracker />
<MouseTracker />
</div>
)
}
export default App
ืืฉ ืื ื ืืฉืชื ื ืืืืืืื ืืฉื lastMouseX ืฉืืขืจื ืฉืื ืืฉืชื ื ืื ืคืขื ืฉืืืืืื ืืช ืืขืืืจ. ืืฉ ืื ื ืื 6 ืงืืืคืื ื ืืืช ืืกืื MouseTracker ืฉืคืฉืื ืืฆืืืืช ืืช ืืขืจื. ืืฉืืื ืฉื render ืฉืืื ืืืงื ืืื ืืืจืืืงื ืชืืื ืืืืื ืืช ืืขืฉืืช ืืื ืืืจืื ืืืงืืื ืืืกืคืชื ืงืื ืฉื ืืืชื ื ืืชืื ืงืื ืืงืืืคืื ื ืื. ืืขืืื ืืืืืชื ืื ืืืื ืืืืืช ืืืฉืื ืืจืื ืื ืืกืืื.
ืืืืจืกืืืช ืืฉื ืืช ืฉื ืจืืืงื ืื ืืฉื ื ืื ืืืื ื ืขืืฉืื ืชืืื ืืืื ื ืืงืืืื ืืช ืืืชื ืขืจื ืฉื lastMouseX ืืืคืืข 6 ืคืขืืื. ืืืื ืฉืจืืืงื ืขืกืืง ื render, ืืืคืืคื ืื ืืคืขืื ืืช ื callback ืฉืืืคื ืืืืคืื ืืืืจืืข. ืจืง ืืืจื ืฉื render ืืกืชืืื ืืืคืืคื ืืฉ ืืืืื ืืช ืืขืืื ืืช ืืืฉืชื ื ืืืืืืืื ืืื ืื ื ื ืงืื ืืช ืืขืจื ืืืืฉ ืืคืขื ืืืื ืฉื ืืืฅ ืขื ืืืคืชืืจ ืฉืืจื ืืจ ืืืืฉ ืืช ืืงืืืคืื ื ืื.
ืืืืจืกื 18 ืฉื ืจืืืงื ืืคื ื Concurrent Mode, ืื ืื ืื ืงืืจืืื ื startTransition, ืจืืืงื ืืืฆืข ืืช ื render "ืืืื ืืืช" ืืื ืืืืจืกืืืช ืืืฉื ืืช, ืืฉืื ืืืคืืคื ืืื ืืืืื ืืช ืืฉื ืืช ืืช ืืขืจื ืฉื ืืืฉืชื ื ืืืืืืืื ืืื ืจืื ืืืจ ืฉื ืงืืืคืื ื ืืืช.1 419
# ืงืื ืฉืื ื ืื ืจืืฆื ืืืชืื
ืืชืืชื ืืฉืืืข ืงืื ืชืงืฉืืจืช ืฆื ืืงืื ืืืคืก, ืืืืืจ ืืื ืกืคืจืื ืืื react-query ืื swr. ืืงืื ืืฉื ืืืืข ืืืฉืจืช ืืื ืฉืืจ ืืืชื ื cache ืืงืืื, ืืืืื ืืช ืืกืคืจ ืืชืฉืืืืช ืฉืฉืืืจืืช ื cache ืืืช ืืืื ืื ืฉืืืจืื ืืืชื ืืืืคื ืืื ืืื ื ืืงืจื ืงืฆื.
ืืื ืฉืืชืงืืืชื ืฉืืจื ืืขืื ืฉืืจื ืืฉืืชื -
ืดืืื ืื ื ืฆืจืื ืืืชืื ืืช ืื? ืืื ืืืฉืื ืืืจ ืืชื ืืช ืื ืงืืืืด
ืดืืืืืช ืืืืืช ืกืคืจืื ืฉืขืืฉื ืืช ืื... ืื ื ืื ืืืืื ืฉืื ื ืืืืื ืืื ืืช ืืืืืด
ืดืื ืื ื ืืื ืืคืกืคืก ืคื ืืื ืืงืจื ืงืฆื, ืืืืื ืื ืืฆืืื ืืชืคืืก ืืืชืงื ืืช ืืืืืด
ืดืืื ืืฆื ืฉืื ืืขืืื ืืื ืฉืฆืจืื ืขื ืื ืืืคืืคื ืื ืืืื ืกืืืื ืฉืื ื ืืืฆื ืืื ืืืืืง ืืช ืื ืขื ืื ืืืฉืืจืด
ืดืขืื ืคืขื if ??? ืื ืืืจ ืืืืืฉื ืฉืื ืืคืื ืงืฆืื. ืืื ืื ืื ืืจืื ืืืจืื ืืืืืื ืืืฉืชืืฉ!?ืด
ืืืื ืฉืื ื ืืืคืจ ืืืืฉืืืช ืืืื ืืืงืื ืืืชืื ืงืื ืืืืชื ืืืกืชืื ืืงืื ืฉื ืกืคืจืืืช ืฉืขืืฉืืช ืืืจืื ืืืืื (ืื ื ื, ืืื ืืืจ ืฉืืขืืื ืืืืื ืืื ืืืชืจ ืืืฉืจ ืงืื ืฉืืชื ืื ืจืืฆื ืืืชืื). ืืืืืื ืื ืืฉ ืื ืืฆืืชื ืฉื? ื ืืื, ืืืืืง ืืช ืืืชื ืงืื ืฉืื ื ืื ืจืฆืืชื ืืืชืื. ืืช ืืืืคืื ืืืืชื ืืงืจื ืงืฆื, ืืช ืืืืืงืืช ืืืช ื if-ืื.
ืืจืฆืื ืืืชืื ืจืง ืงืื "ื ืงื" ื"ืืคื" ืืื ื ืืื, ืืื ืืืืื ืื ืื ืกืคืจ ืืืืื. ืืจืื ืืงืืขื ืืงืื ืฉืืคืขืืืื ืืช ืืืืื ืฉืื ื ืืืืื ืืืืคืื ืืืื ืกืืฃ ืืงืจื ืงืฆื, ืืืื ืกืืฃ "ืคืืกืืจืื" ืฉืืชืื ืชืื ืืืืืงื ืื ืคืขื ืฉื ืชืงืื ืืืขืื ืืืฉื ืื ืชืืงื ื ืืื ืืืฉ. ืืืืชืืจ ืขื ืืชืืืช ืงืื ืืื, ืจืง ืื "ืืืืืช ืืืืืช ืืจื ืืืื ืืืชืจ", ืืฉืืืื ืกืคืจืื ืืืฆืื ืืช ืืืงืื ืื ืืืคื ืืช ืืืขืจืืช ืื ืงืื ืืืชืจ - ืืื ืคืฉืื ืืขืืืจ ืืช ืืืืืื ืืืงืื ืฉืงืฉื ืืจืืืช ืืืชื. ืืคืขืืื, ืืฉืืฉ ืกืคืจืื ืืืฆืื ืืช ืืืื ืืืชืืืืงืช ืื ืืืื. ืืฉืืื ืืืช ืืืืช ืฆืจืื ืื ืงืฆืช ืืืชืืืื ืืคืขืืื.
(ื .ื. ืืืจื ืืืืืื ืืืชืื ืงืื ืฉืืืคื ืืืืื ืืงืจื ืงืฆื ืืื ืืืฉืชืืข ื ืงืจืืช ืืืืงืืช. ืืืขืืืื, ืกืืืจื ืฉื ืื ืืืจ ืืืฉ ืคืืชืืช 3 ืืืจืื ืงืืืืื ืฉืืฉืืชื ืฉืกืืจืชื).
1 419
Object.values(this.items),
(i) => i.index
);
delete this.items[oldestItem.id];
}
});
});
}
ืืขืืฉืื ืื ืืืื ืกื ืืื ืืืืืงื ืืชืืฆืขืืช ืืืจื ืืืงืฆืื ืืืช ืืืืืืื ื render ืืืื.
ืืืืื ืื ืืจืืืช ืืช ืืงืื ืืืฉืืง ืืืชื ืืงืืืกื ืืืืงืก ืืงืืฉืืจ:
https://codesandbox.io/s/distracted-gagarin-qve7lc?file=/src/mobx/swapi.js
ืื ืืืืืขื ืืื:
<iframe src="https://codesandbox.io/embed/distracted-gagarin-qve7lc?fontsize=14&hidenavigation=1&theme=dark"
style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;"
title="distracted-gagarin-qve7lc"
allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking"
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
></iframe>
## ืกืืืื - ืืืคืื ืืฉืืืืฉ ื MobX
ืืืืืงืก ืืื ืกืคืจืื ืจืืืงืืืืืช ืื ืืืื ืกืืืื ืืืืืืื. ืืฉืืฉืชืืฉืื ืื ื ืืื ืืื ืืืื ืืขืืืจ ืื ื ืืืชืื ืืืฉืืื ืฆื-ืืงืื ื ืงืืื ืืงืืื ืืชืืืืงื. ืืกืืืื ืืคืืกื ืืื ืื ืงืืืืช ืืืจืืืืืช ืฉืฆืจืื ืืฉืื ืื ืืืืื ืืขืืืื ืขื ืืืืืงืก:
1. ืฉืืื ืื ืืจืืืงืืืืืืช. ืืื ืืฉืชื ื ืจืืืงืืืื, ืืชื ืืื ืืชืขืืื ืืื ืขืืงื ืืืจืื. ืืฉืชื ืื ืจืืืงืืืืืื ืืืจืฉืื ืืขืงื ืฆืืื ืืืจืื ืืืฉืชื ืื ืจืืืืื ืื ืื ืืื ืื ืื ืื ืืืจืืขืื ืืืื ื ืืชืื ืืืืืงื.
2. ืฉืืื ืื ืืชื ื ืืืฉืื ืืืฉืชื ืื ืจืืืงืืืืืื. ืื ืืืฉื ืืืฉืชื ื ืจืืืงืืืื ืืืฆืจืช ืืืก ืฉื ืืืื ื ืืฉืื ืืืื ืืืฉืชื ื ืื.
3. ืืชืืืื ืขื ืืืืืงืก ืืื ืืืช ืื ืืืืืืงื ืืืคืขืืืืช ืืื ืืชืง ืื UI, ืืจืง ืืืจ ืื ืืืฉื ืืช ื UI ืืชืืจ ืฉืืื ืืงื ืฉื ืืืฉื ืืืืืข.
ืืืฉืืืื ืืงืืืกืืช ืืื ืจืืืืงืก ืืืืืืงืก ืื ื ืื ืืืฉื ืฉืืืืืงืก ืืืชืจ ืคืฉืื ืืจืืืืงืก ืื ืืืืคื. ืื ืคืฉืื ืฉืื ืื. ืื ืืฉื ื ืืืื ืืืฉื ืืื ืชืืืจื, ืืืืจืืช ืืืื ืขื ืฉืืืช ืืขืืืื ืขืืืจืช ืืืชืื ืงืื ื ืงื ืืืืืืง ืืืชืจ.1 419
delete this.items[oldestItem.id];
}
});
}
}
export const charactersRepo = new Repo("https://swapi.dev/api/people");
ืืงืืืฅ ืืืืฆื ืืืืืงื Repo ืฉืืืืืจ ื REST Endpoint ืขืืืจ ืืืืืืช ืืืืืืช ืืืืืืื.
ืืฆื ืฉื ืจืืืงื ืื ื ืจืืฆื ืืื ืืช ืงืืืคืื ื ืื ืฉืืฉืชืืฉืช ืืจืืคื ืฉืืฆืจืชื ืืื ืืืฆืื ืืืืข ืขื ืืืืืืช ืืืืืืช ืืืืืืื. ืืงืืืคืื ื ืื ืชืืืืง ืืฉืชื ื ืกืืืื ืฉืืืืฆื ืืช ืืืืืช ืฉืขืืฉืื ืืืฆืืช, ืื ืคืขื ืฉืืื ืืชืขืืื ืืื ืชืืงืฉ ืืจืืคื ืืืฆืข fetch ืืืืืข ืฉื ืืืชื ืืืืช, ืืืฉืืืืืข ืืืื ืืืื ืืงืืืคืื ื ืื ืชืฆืื ืืืชื. ืื ื ืจืื ืืงืื:
const SWCharacter = observer(function SWCharacter() {
const [id, setId] = useState("");
const data = charactersRepo.items[id]?.data;
useEffect(() => {
if (id !== "") {
charactersRepo.fetch(id);
}
}, [id]);
console.log(`render items id = ${id}`);
return (
<div>
<input type="number" value={id} onChange={(e) => setId(e.target.value)} />
{data && (
<div>
<p>Name: {data.name}</p>
<p>Birth Year: {data.birth_year}</p>
</div>
)}
</div>
);
});
ืืืืง ืืจืืฉืื ืืงืื ืืงืืืคืื ื ืื ืฉืงืฉืืจ ืืจืืืงืืืืืืช ืืื ืืฉืืจื:
const data = charactersRepo.items[id]?.data;
ืฉืืจื ืื ื ืืืฉืช ืืืืืืงื items ืฉื ืืจืืคื ืืืคืชื id ืฉืื. ืื ืืฉ ืฉื ืืฉืื ืืื ืชืืงื ืืช ืฉืื data ืฉืื, ืฉืื ืืืืืข ืฉืืงืื ื ืืืจ ืืืฉืจืช (ืืืื ืืชืืืื ืืืงืฉื ืืืจืช). ืืืชืจ ืืขื ืืื ืื ืงืืจื ืื ืื ืื ืงืืื. ืืืฆื ืืื ืื ืื ื ื ืงืื undefined, ืืื ืืืืืงืก ืื ืืกืื ืฉื ืืกืื ื ืืืฉืช ืืืืืืงื ืืืืื id. ืื ืืขืชืื ืืขืจื ืืืืื ืืื ืืฉืชื ื, ืืืืคื ืืืืืืื ืืงืืืคืื ื ืื ืชืจืื ืืจ ืืืืฉ ืืชืงืื ืืืืื ืืช ื ืืกืคืช ืืงืืช ืืช ืืขืจื ืืืืฉ ืืฉื.
ืืืืง ืืฉื ื ืืื ืืืคืงื:
useEffect(() => {
if (id !== "") {
charactersRepo.fetch(id);
}
}, [id]);
ืื ืคืขื ืฉ id ืืฉืชื ื ืืืขืจื ืืืืฉ ืืื ื ืืืจืืืช ืจืืงื, ืชืืคืขื ืืคืื ืงืฆืื fetch ืขื ื id ืืืืฉ. ืืจืืข ืฉ fetch ืืกืืืืช ืืืขืืื ืช ืืช items ืืืคืชื id, ืืฆืืจื ืืืืืืืืช ืืงืืืคืื ื ืื ืชืชืขืืื ืืืืฉ ืขื ืืขืจื ืฉื ืฉืืจ ืืืื ืคืฉืื ืืขืืื.
ืืฉ ืจืง ืืขืื ืืืช ืขื ืืงืื ืืืชื ืื ืื ื ืจืืืื ืืงืื ืกืื ืืืืืขืช ืืืืืจื:
[MobX] Since strict-mode is enabled, changing (observed) observable values without using an action is not allowed. Tried to modify: Repo@5.items.2?
ืืืืืจื ืืืืจืช ืฉืืืฆืขื ื ืขืืืื ืฉื ืืฉืชื ื ืจืืืงืืืื ืืืืฅ ื action. ืืืืจืช action ืืฉืืื ืืืืืืงืก ืืืื ืืืคืืืืืืฆืืืช ืืืฆืืขืื. ืืชืื ืคืื ืงืฆืื ืฉืืกืืื ืช ื action ืื ืืฉืื ืืืื ืืืฉืชื ื ืืจืืืงืืืื ืืืืฆืขื ืืืจื ืืืงืฆืื ืืืืื ืืื "ืืฉืืืจื" ืืืืฆื ืขื ืฉื Action ืืกืชืืื. ืืื action, ืื ืฉืื ืื ืืืฉืชื ื ืจืืืงืืืื ืืืืืืืืช ืืืจืื ื render ืืืืฉ ืฉื ืืงืืืคืื ื ืื, ืืื ืืฉ ืื ื 5 ืคืงืืืืช ืฉืืฉื ืืช 5 ืืืคืืื ืื ืฉืื ืื ืฉื ืืืืืงื ืจืืืงืืืื ืืืื, ืื ืงืืืคืื ื ืื ืฉืืกืชืืืช ืขื ืืืืืืงื ืืื ืชืชืจื ืืจ 5 ืคืขืืื.
ืืื ืจืืข, ืืคืื ืงืฆืื ืฉืื fetch ืืืืงื ืื ืืืืืจื ื action ื ืืื? ืื ื ืืงืจืืื ื makeObservable:
makeObservable(this, {
items: observable,
fetch: action
});
ืื ืืื - ืืคืื ืงืฆืื fetch ืืื action, ืืื ืืงืื ืฉืืชืื ื then ืฉื ืืืืืืืช ืืื ืืืจ ืื. ืืืืืจ ืืงืจืืื ืืื:
fetch(`${this.endpoint}/${id}`)
.then((res) => res.json())
.then((data) => {
this.items[id] = {
id,
data,
index: ++this.index
};
if (Object.keys(this.items).length > MAX_CACHE_SIZE) {
const oldestItem = _.minBy(Object.values(this.items), (i) => i.index);
delete this.items[oldestItem.id];
}
});
ืฉืชื ืคืื ืงืฆืืืช ื Callback ืฉืืืขืืจืืช ืืฉื ื ืืืืืงืื ืฉื then ืืืจ ืืื ื ื ืืฉืืืช ืืชืืจ action. ืืฉืคืื ืงืฆืืืช ื Callback ืืฉื ืื ืืฉื ื ืืช this.items ืื ืืืจื ืืืืืจื ืฉืจืืื ื.
ืืคืืชืจืื ืืื ืืขืืืฃ ืืช ืืืืง ืฉืืฉื ื ืืฉืชื ืื ืจืืืงืืืืืื ืืชืื ืงืจืืื ื runInAction, ืคืื ืงืฆืื ืฉื mobx ืฉืืงืืืช ืคืื ืงืฆืื ืืืืคืืช ืืืชื ื action. ืืงืื ืืืชืืงื ื ืจืื ืื:
fetch(id) {
if (this.items[id]) {
return;
}
fetch(`${this.endpoint}/${id}`)
.then((res) => res.json())
.then((data) => {
runInAction(() => {
this.items[id] = {
id,
data,
index: ++this.index
};
if (Object.keys(this.items).length > MAX_CACHE_SIZE) {
const oldestItem = _.minBy(1 419
style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;"
title="objective-fog-1rmocb"
allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking"
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
></iframe>
ืืคื ืืืจ ืืงืื ื ืฉืืจ. ืืชื ืืืืืื ืืืืืฅ ืขื ืืคืชืืจ Shuffle ืืืจืืืช ืฉืืจืฉืืื ืืชืขืืื ืช, ืืื ืืฉืชื ืกื ืืืืืฅ ืขื ืืคืชืืจ ืคืืืก 1 ืืื ืืืืกืืฃ 1 ืืื ืคืจืื ืืจืฉืืื ืื ืื ื ืืงืืืื ืืช ืืืืขืช ืืืืคืกื ืืืืืืงืก, ืืื ืจืืืงื ืื ืืชืขืืื ืืฉืื ืื. ืื ืงืืจื ืืื ืืืื ืืชืงื ืื?
ื ืชืืื ืืืขืื ืืืื ืืคืื ืงืฆืื RandomList:
function RandomList(props) {
const { items, renderItem = defaultRenderItem } = props;
return (
<ul>
{items.map((v, index) => (
<li key={index}>{renderItem(v)}</li>
))}
</ul>
);
}
ืืคืื ืงืฆืื ืื ืืืืืจืช ืืชืืจ observer ืืืื ืื ืืงืฉืืื ืืฉืื ืืืื ืืืฉืชื ืื ืืจืืืงืืืืืื ืฉืื. ืื ืฉืขืืื ืขื ืืืืข ืจืืืงืืืื, ืฉืื ืืคืื ืงืฆืื ืืืืฆืื ืืช App, ืืืืืจ ืืชืืจ observer ืืื ืื ืื ืืกืคืืง ืื ืืื ืืขืืืจ ืืช ืืืืืข ืืจืืืงืืืื ืฉืื ืคื ืืื.
ืืคืขืืื ืืฉื ืื, shuffle, ืืืืงื ืื ืขืืืืช ืืืื ืฉืืื ืืฉื ื ืืช ืืืขืจื values ืขืฆืื. ืืงืืืคืื ื ืื App ืืกืชืืืช ืขื ืืืขืจื values ืืืฉืืื ืืืืืฃ ืืืืฉ ืื ืืื ืชืชืจื ืืจ ืืืืฉ. ืคืขืืืช ืืคืืืก ืืื ืืืขืืืชืืช ืื ืืื ืืฉื ื ืืช ืืืืืจืื ืืชืื ืืืขืจื, ืืขืืืื ืื ืฉืืกืชืื ืื ืจืง ืืงืืืคืื ื ืื RandomList ืืคืื ืงืฆืืืช ื map ืฉืืื ืืคืขืืื.
ืืคืืชืจืื ืืงื ืืืฆื ืืื ืืื ืืืคืื ืืช RandomList ื observer. ืืื ืื ืชืืื ืื ืืคืฉืจื ืื ืืืื ืงืืืืชื ืืืชื ืืกืคืจืืืช ืงืื ืืืฆืื ืืช.
ืื ืืชื ืื ืืืืืื ืืฉื ืืช ืืช RandomList ืขืฆืื ืืคืืชืจืื ืืืืชืจ ืื ืจื ืืืจืื ืืฉื ื ืืืงืื:
1. ืื ืื ื ืฆืจืืืื ืืืคืื ืืช ืืงืื ืฉื renderItem ื Observer. ืื ืื ืืขืื ืื ืื ืงืื ืฉืื ืื ื ืืขืืืจืื ืืืืืฅ ืืชืื ืืงืืืคืื ื ืื.
2. ืื ืื ื ืฆืจืืืื ืืขืืื ืืช Randomizer ืื ืฉืืฉืืืจ ืจืฉืืื ืฉื ืืืืืงืืื ืืื ืฉื ืืกืคืจืื.
ืืฆืืจื ืืืืช ืืืืฉื ืืืืืืงื ืจืืืงืืืื ืชืืืืจ ืืืืืช ืืชืื ืงืื ืจืืืงืืืื ืืื ืืฉืื ืืืื ืืืฆืื ืืื ืฉืฆืจืื ืขื ืืืกื. ืืคืฉืจ ืืจืืืช ืืช ืืคืืชืจืื ืืงืืืกื ืืืืงืก ืืงืืฉืืจ:
https://codesandbox.io/s/gallant-parm-p1nwgm?file=/src/App.js
ืื ืืืืืข ืืื:
<iframe src="https://codesandbox.io/embed/gallant-parm-p1nwgm?fontsize=14&hidenavigation=1&theme=dark"
style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;"
title="gallant-parm-p1nwgm"
allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking"
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
></iframe>
## ืื ืขืืฉืื ืขื ืงืื ืืกืื ืืจืื ื ืฉืืฉื ื ืืืืข ืจืืืงืืืื
ืื ืื ืืืืืข ืฉืื ื ื ืฉืืจ ืืืืืืงืก, ืจืง ืืืืื ื ืื ืกืืช ืืืฉืชืืฉ ืื ืื ืืชืืจ ืื ืื ืืืงืฉืืช ืืจืฉืช ืฉืื ื. ืืคื ื ืฉื ืืืข ืืืืจ ืขื Action-ืื ืืกืื ืืจืื ืืื, ืืืื ื ืืงื ืืช ืืืืฉื ืื ืืืืืช ืื ืืชืื ืงืื ืืกืื ืืจืื ื ืืืืืืงืก. ืืืืืื ืืืื ืื ื ืจืืฆื ืืืชืื ืืขืจืืช ืฉืืฆืืื ืืืืข ืืชืื swapi ืืืืืจ ืืืืข ืขื ืืืืืืช, ืกืจืืื, ืืืืืืช ืืื ืื ืืืืืืช ืืืืืืื. ืื ื ืืชืืื ืขื ืงืืืก ืืืืืงืกื ืืฉื Repo ืฉืืกืคืง ืืืฆืื ืฆื-ืืงืื ืืืืื. ื Repo ืืฉ Endpoint, ืฉืื ืื ืชืื ืืฉืจืช ืืื ื ืืื ืืืงื ืืช ืื ืชืื ืื, ืืคืื ืงืฆืื ืืฉื fetch ืฉืืงืืืช ืืืื ืืืฉืื ืืฉืืืจืช ืืช ืืืืืข ืฉืืชืืื ืื. ืืจืืคื ืืืืื ืืฉืืืจืช 10 ืคืจืืืื ืืื ืืคืจืืืื ื ืฉืืจืื ืืฆืืจื ืจืืืงืืืืืช. ืื ืืงืื:
import _ from "lodash";
import { makeObservable, observable, action, runInAction } from "mobx";
const MAX_CACHE_SIZE = 10;
class Repo {
constructor(endpoint) {
this.endpoint = endpoint;
this.index = 0;
this.items = {};
makeObservable(this, {
items: observable,
fetch: action
});
}
fetch(id) {
if (this.items[id]) {
return;
}
fetch(`${this.endpoint}/${id}`)
.then((res) => res.json())
.then((data) => {
this.items[id] = {
id,
data,
index: ++this.index
};
if (Object.keys(this.items).length > MAX_CACHE_SIZE) {
const oldestItem = _.minBy(Object.values(this.items), (i) => i.index);1 419
ืืืื ืจืืื ืืืืชื ืืฉืชืืฉ ื
bind ืื constructor, ืืื ืืืื ืฉืื ื ืงืืจื ื makeObservable ืืืฉื ืื ืื ืชืขืืื. ืืคืืชืจืื ืืื ืืขืืื ืืช ืืืืืงืก ืฉืื ื ืจืืฆื ืืืคืฉืจ ืืืงืืืืช ืืืืฅ ืืืืืงื ืืืฉืชืืฉ ืืคืื ืงืฆืื ืืืงืื ืชืืื ืืช ืืขืจื ืื ืืื ืฉื this, ืืืืช ืืืฉืืขืืช ืฉื action.bound.
ืืืืจื ืืจืืืงื, ื ืืื ืืืชืื ืืช ืืงืื ืืื ืืื ืืืฆืื ืฉืืืฉื ืืื ื ืืืืฆืืช ืืกืื ืืจื ืื - ืืืืฆื ืขื ืืืคืชืืจ ืืื ืืืช ืืืงืืืคืื ื ืืืช ืชืขืืื ืืช ืืขืจื ืืฉืชื ืืืืจืืช:
import "./styles.css";
import { observer } from "mobx-react-lite";
import counter from "./mobx/counter";
const Counter = observer(function Counter() {
return (
<div>
<p>Value = {counter.value}</p>
<button onClick={counter.click}>+1</button>
</div>
);
});
export default function App() {
return (
<div className="App">
<Counter />
<Counter />
<Counter />
</div>
);
}
ืืื ืืช ืืืื ืืื ืืขืืืชื ืืงืืืกื ืืืืงืก ืืืืืืื ืืจืืืช ืืืชื ืืงืืฉืืจ:
https://codesandbox.io/s/gifted-ride-qnoj92?file=/src/App.js
ืื ืืื ืืืื:
<iframe src="https://codesandbox.io/embed/gifted-ride-qnoj92?fontsize=14&hidenavigation=1&theme=dark"
style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;"
title="gifted-ride-qnoj92"
allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking"
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
></iframe>
## ืืืขืื ืขื ืชืื ืืช Render Props ืืืื ืืืชืืื ืืืชื ืืขืืืื ืจืืืงืืืืืช
ืจืื ืืืืจืื ืฉืื ืื ื ืืืืืื ืืืชืื ืืจืืืงื ืืขืืื ืืื ืืขืืืช ืืืืืืืช. ืฉืืืช ืืขืืืื ืขื ืจืืืงื ืืืืืืงืก ืชืืื ืืืชืื ืงืืื ืืช ืื ืืืืืืงื ืืืกืืืื ืืืืืืืื ืืชืื ืืืืงืืช ืืืืืงืก, ืืืืจ ืื ืืืืจ ืืื ืืืฉืง ืืฉืชืืฉ ืืืืฆืขืืช ืจืืืงื. ืืื ืื ืืฉ ืืกืคืจ ืืงืจืื ืื ืืื ืืืืืืืืืื ืืขืืืื ืขื ืืืืืงืก ืืขืืืื ืื ื ืจืืฆื ืืืืจ ืืืืงืื ืืืืื ืฉื ืืืจืื ืื.
ืืืืงืฉ ืืจืืฉืื ืืขืืืื ืขื ืืืืืงืก ืืจืืืงื ืืื ืชืื ืืช Render Props. ืืชืื ืืช ืื ืืฉ ืื ื ืงืืืคืื ื ืืช ืจืืืงื ืฉืืงืืืช ืืืง ืืืืืืืงื ืฉื ืืื ืืืฆืื ืืืืข ืืงืืืคืื ื ืื ืืืจืช - ืืืฉื ืงืืืคืื ื ืื ืฉื ืจืฉืืื ืฉืืงืืืช ืืชืืจ ืคืจืืืจ ืคืื ืงืฆืื ืฉืืืจืืืช ืขื ืจืื ืืืจ ืคืจืื ืืจืฉืืื.
ืชืื ืืช Render Props ืืื ืืืืืืช ืื ืืงืื ืฉืืืืข ืืืืืฅ, ืืืจืืจืช ืืืื, ืื ืืืืืจ ืืชืืจ Observer ืืืื ืืคืขืืื ืฉืื ืืืื ืื ืืืงืืื. ืืืื ื ืืืืฉ ืืช ืืืื ืขื ืชืืื ืืช ืงืื ื ืื ืืืื ืจืฉืืืช ืืกืคืจืื ืืงืจืืืื. ืชืืืื ืื ื ืืืชื ืืืืงื ืืืืืืงืก ืฉืืืืขืช ืืืืฆืจ ืืืฉืืืจ 10 ืืกืคืจืื ืืงืจืืืื:
import _ from "lodash";
import { makeObservable, observable, action } from "mobx";
class Randomizer {
constructor() {
this.shuffle();
makeObservable(this, {
values: observable,
shuffle: action.bound,
incAll: action.bound
});
}
shuffle() {
this.values = _.range(10).map((x) => _.random(1, 100));
}
incAll() {
for (let i = 0; i < this.values.length; i++) {
this.values[i] += 1;
}
console.log(this.values);
}
}
const randomizer = new Randomizer();
export default randomizer;
ืขืืฉืื ืื ื ืืืฉืื ืืืืจ ืืืชื ืืงืืืคืื ื ืืืช ืจืืืงื ืขื ืืงืื ืืื ื App.js:
import "./styles.css";
import { observer, Observer } from "mobx-react-lite";
import randomizer from "./mobx/randomizer";
function defaultRenderItem(value) {
return <span>{value}</span>;
}
function RandomList(props) {
const { items, renderItem = defaultRenderItem } = props;
return (
<ul>
{items.map((v, index) => (
<li key={index}>{renderItem(v)}</li>
))}
</ul>
);
}
export default observer(function App() {
return (
<div className="App">
<button onClick={randomizer.shuffle}>Shuffle</button>
<button onClick={randomizer.incAll}>+1 </button>
<RandomList
items={randomizer.values}
renderItem={(item) => <span>{item}</span>}
/>
</div>
);
});
ืืคืฉืจ ืืจืืืช ืื ืืืชื ืืืื ืืงืืืกื ืืืืงืก ืืื:
<iframe src="https://codesandbox.io/embed/objective-fog-1rmocb?fontsize=14&hidenavigation=1&theme=dark"
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
