ToCode
Open in Telegram
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Show more1 419
Subscribers
No data24 hours
No data7 days
+130 days
Posts Archive
1 419
<input type="text" value={text} onChange={handleChange} />
<button onClick={reset}>Reset</button>
<button onClick={deleteLastChar}>Delete Last Char</button>
<button onClick={deleteTwoChars}>Delete Two Chars</button>
</div>
</div>
);
}
ืื ืืกืืื ืืืกืื ืืช ื render ืฉื useEffect ื ืจืื ืืื ืชืื ืืช ืืืืื ืืช, ืืื ืืกืชืืจ ืฉืืื ืขืืื ื ืื ืืืืืื ืฉื ืจืืืงื. ืืืชื ืงืื ืขื useEffect ืืื ืืืจ ืืืขื ืขืืื:
export default function App() {
const [text, setText] = React.useState("");
const [resetCount, setResetCount] = React.useState(0);
React.useEffect(() => {
if (text === "") {
setResetCount((c) => c + 1);
}
}, [text]);
function handleChange(e) {
setText(e.target.value);
}
function reset() {
setText("");
}
function deleteLastChar() {
setText((t) => t.slice(0, -1));
}
function deleteTwoChars() {
deleteLastChar();
deleteLastChar();
}
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<div>
<p>reset count = {resetCount}</p>
<input type="text" value={text} onChange={handleChange} />
<button onClick={reset}>Reset</button>
<button onClick={deleteLastChar}>Delete Last Char</button>
<button onClick={deleteTwoChars}>Delete Two Chars</button>
</div>
</div>
);
}
ืืืื ืืืขื? ืื ืขืืฉืื ืื ืื ื ืืงืืืื ืืคืขืื ืืืช ืืืืชืจืช ืฉื ืืืคืงื ืืคืขื ืืจืืฉืื ื ืฉืืงืืืคืื ื ืื ืืืคืืขื ืขื ืืืกื, ืืืืืจ ืืขืจื ืฉื resetCount ืืชืืื ืืืื. ืืืจื ืืืงืืืืช ืืืชืขืื ืืืืคืงื ืืจืืฉืื ืืื ืืืืกืืฃ ืืฉืชื ื ref:
export default function App() {
const [text, setText] = React.useState("");
const [resetCount, setResetCount] = React.useState(0);
const isFirstEffect = React.useRef(true);
React.useEffect(() => {
// skip the first time
if (isFirstEffect.current) {
isFirstEffect.current = false;
return;
}
if (text === "") {
setResetCount((c) => c + 1);
}
}, [text]);
function handleChange(e) {
setText(e.target.value);
}
function reset() {
setText("");
}
function deleteLastChar() {
setText((t) => t.slice(0, -1));
}
function deleteTwoChars() {
deleteLastChar();
deleteLastChar();
}
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<div>
<p>reset count = {resetCount}</p>
<input type="text" value={text} onChange={handleChange} />
<button onClick={reset}>Reset</button>
<button onClick={deleteLastChar}>Delete Last Char</button>
<button onClick={deleteTwoChars}>Delete Two Chars</button>
</div>
</div>
);
}
ืืืืื ืื ืืจืืืช ืืช ืืืืจืกื ืืืืจืื ื ืขืืืืช ืืงืืืกื ืืืืงืก ืืงืืฉืืจ ืืื:
https://codesandbox.io/s/affectionate-lamport-ddrc3y?file=/src/App.js.1 419
# ืืื ืืืจืืช ืืขืฆืื ืืจืื ืืจืืืงื
ืืชืื ืืช ืืืจืืช ืืขืฆืื ืืจืื ืื ืื ืฉืงืืจื ืืฉืืชื ืืฉืชืืฉ ืื ืื ืื ื ืืื ืืฉืคื ืฉืืชื ืขืืฉื ืืขืฆืื ื ืืง. ืืจืืืงื ืื ืงืืจื ืื ืืื ืื ืฉืงืฉืืจ ืืขืืืื ืกืืืื ืืืืืืื ืืืขืืจืช ืืขืจื ืืื ื ืืื ืืคืื ืงืฆืืืช ื setState.
ื ืืงื ืงืืืคืื ื ืื ืืืืืื ืฉืืฆืืื ืชืืืช ืืงืกื ืืกืืคืจืช ืืื ืคืขืืื ืืืงืกื ืืชืืื ืืชืืคืก, ืืืืืจ ืื ืคืขื ืฉืืืฉืื ืืืืง ืืช ืื ืืืงืกื ืืืชืืื ืขืจื ืืืื ื ืขืืื ื-1. ืืืืขืื ืื, ืืืฉืืื ืฉืืืื ืืขื ืืื, ื ืืชื ืื ืืคืชืืจ ืฉืืืืืฆื ืขืืื ืืืงืกื ืืชืืคืก:
export default function App() {
const [text, setText] = React.useState("");
const [resetCount, setResetCount] = React.useState(0);
function handleChange(e) {
setText(e.target.value);
if (e.target.value === "") {
setResetCount(resetCount + 1);
}
}
function reset() {
setText("");
setResetCount(resetCount + 1);
}
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<div>
<p>reset count = {resetCount}</p>
<input type="text" value={text} onChange={handleChange} />
<button onClick={reset}>Reset</button>
</div>
</div>
);
}
ืฉืืื ืื ืืงืื ืืืคืื ืืฉืชื ืืคืื ืงืฆืืืช handleChange ื reset. ืืฉ ืฉืชื ืืจืืื ืงืืืช ืืืชืื ืืืชื ืืฆืืจื ืืืชืจ ืื ืจืืช:
1. ืืคืฉืจ ืืืชืื ืคืื ืงืฆืื ืืืช ืฉืฉืชื ืืคืื ืงืฆืืืช ืืงืจืื ืื, ืืืื ืื ืชืคืขืื ืืช setText ืืื ืชืืืืง ืื ืืืงืกื ืจืืง ืืชืขืื ืืช ืืืื ื.
2. ืืคืฉืจ ืืืฉืชืืฉ ื useEffect ืฉืืืืืง ืื ืืืงืกื ืืชืจืืงื ืืืขืืื ืืช ืืืื ื.
ืืืชืจืื ืืืืฉื ืืจืืฉืื ื ืืื ืืืฆืืขืื. ืืืงืื ืืฉื ืืช ืืช ืืืงืกื, ืืงืจืื ื render, ืืืืืช ืฉืืืงืกื ืืชืขืืื ืืื ืืฉื ืืช ืืช ืืืื ื ืืฉืื ืืงืจืื ื render, ืื ืื ื ืขืืฉืื ืืช ืืื ืืคืขื ืืืช. ืืงืื ืืืจื ืขืืืืื ื ืจืื ืื:
export default function App() {
const [text, _setText] = React.useState("");
const [resetCount, setResetCount] = React.useState(0);
function setText(newText) {
_setText(newText);
if (text !== "" && newText === "") {
setResetCount(resetCount + 1);
}
}
function handleChange(e) {
setText(e.target.value);
}
function reset() {
setText("");
}
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<div>
<p>reset count = {resetCount}</p>
<input type="text" value={text} onChange={handleChange} />
<button onClick={reset}>Reset</button>
</div>
</div>
);
}
ืขืืื? ืขืืื. ืืื ืืืงืื ืืงืื ืคืืชืจืื ืื ืจื, ืืืื ื ืืงืื ืืืงืฉ.
ืื ืขืืฉืื ืืืื ื ืืกืืฃ ืืคืชืืจ ืฉืืืืง ืืช ืืชื ืืืืจืื ืืืืงืกื. ืืืื ืจืืื ืื ื ืืืืข ืฉืืงืจืืื ื setter ืฉืชืืื ืืขืจื ืืงืืื ืืืื ืื ืืืขืืืจ ื setter ืคืื ืงืฆืื, ืืื ืืคืขื ืืืจ ืืฉ ืื ืคืื ืงืฆืืืช setText ืฉืืืืขืช ืืืคื ืืงืฉืจ ืืื ืฉื ื ืืฉืชื ื ืืกืืืื, ืืื ื ืจืืฆื ืืืืฉืื ืืืฉืชืืฉ ืื, ืื ืื ื ืขืืื ืืงืืช ืืช ืืฆืขื ืืจืืฉืื ืืืืืื ืืืืืื:
function deleteLastChar() {
setText(text.slice(0, -1));
}
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<div>
<p>reset count = {resetCount}</p>
<input type="text" value={text} onChange={handleChange} />
<button onClick={reset}>Reset</button>
<button onClick={deleteLastChar}>Delete Last Char</button>
</div>
</div>
);
ืืืื ืฆืขื ืืืืืื ืืืืืื? ืื ืืงืื ืขืืืื ืขืืื ืืื ืืืืงืฉืื ืจืง ืืชืจืืื. ืื ืขืืฉืื ืื ื ืจืืฆื ืืืืกืืฃ ืืคืชืืจ ืืืืืงืช ืฉื ื ืชืืืื - ืฉืืืืื ืืฉืชืืฉ ืืคืื ืงืฆืื ืฉืืืจ ืืฉ ืื - ืื ืืงืื ืืคืกืืง ืืขืืื:
export default function App() {
const [text, _setText] = React.useState("");
const [resetCount, setResetCount] = React.useState(0);
function setText(newText) {
_setText(newText);
if (text !== "" && newText === "") {
setResetCount(resetCount + 1);
}
}
function handleChange(e) {
setText(e.target.value);
}
function reset() {
setText("");
}
function deleteLastChar() {
setText(text.slice(0, -1));
}
function deleteTwoChars() {
deleteLastChar();
deleteLastChar();
}
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<div>
<p>reset count = {resetCount}</p>1 419
# ืืชืขืจ ืฉื ืืืงืื
ืืชืขืจ ืฉื ืืืงืื ืืื ืขืืงืจืื ืคืืืืกืืคื ืฉืืืขื ืฉืืืฉืจ ืงืืืืื ืืกืืจืื ืฉืื ืื ืืืืชื ืชืืคืขื ืืฉ ืืืขืืืฃ ืืช ืืคืฉืื ืืืื ืืื, ืฉืื ืืืกืคืจ ืืืืขื ืืืืชืจ ืฉื ืืืฉืืื ืืืืงืื.
ืื ืื ืืขืืื ืืืืขื ืื ืืืืืชื ืื ืชืืื ืืจืืจ ืืื ืืืืฉื ืขืืงืจืื ืื (ืื ืื ืืืื ืืืื), ืืขืืืื ืขื ืงืื ืคืืชืจืื ืืช ืคืฉืืืื ืื ืืืชืจ ืงืืื ืืชืืืืงื ืืืืชืจ ืขืืืืื ืืืืื ืืจืืืง. ืื ืืืืืื ืืฉ ืื ืืขืื ืขื ืงืืืคืื ื ืืช UI ืืกืืืืช ืื ื ืื ืกื ืืคืชืืจ ืืืชื ืืฉืืืื ืืืืื:
1. ืืืื ืืชืื ืืืชื ืืกืคืจืื ืื ื ืืืื ืืืขืืืจ ืคืจืืืจ ืฉืืืจืื ืืงืืืคืื ื ืื ืืืชื ืื ืืื ืฉืื ื ืจืืฆื.
2. ืืืื ืื ื ืืืื ืืืจืืก ืืืง ืืืืจืื ืฉื ืืงืืืคืื ื ืื ืืืืฆืขืืช ืฉืื ืื CSS.
3. ืืืื ืื ื ืืืื ืืงืื ืฉืื ืืื ืืช ืงืืืคืื ื ืื ืืืฉื ืืชืื ืืงืืืคืื ื ืื ืืงืืืืช, ืฉืืจืืืื ืืืชื ืืฆืืจื ืฉืื ื ืจืืฆื.
4. ืืืื ืื ื ืืืื ืืืฆืืจ Fork ืืกืคืจืื ืืืืืกืืฃ ืืงืืืคืื ื ืื ืืืคื ืื ืืช ืืื ืื ืื ืฉืื ื ืฆืจืื (ืืชืงืืื ืืื ืืฉืืืจ ืฉืื ืืืจ ืืืจ).
5. ืืืื ืื ื ืืืื ืืืฉืชืืฉ ืืงืืืคืื ื ืื ืืงืืืื ืืกืคืจืืืช UI ืืืจืช.
6. ืืืื ืื ื ืืืื ืืฉื ืืช ืืช ืื ืืืืฉืื ืฉืื ืื ืฉืืฉืชืืฉ ืืกืคืจืืืช UI ืืืจืช ืฉืื ืืงืืืคืื ื ืื ืืชื ืืืช ืืื ืฉืื ื ืจืืฆื.
ืืจืื ืคืขืืื ืืคืืชืจืื ืืคืฉืื - ืืื ืฉืืื ืืจืืฉ ืืจืฉืืื - ืืืจืฉ ืืืชืจ ืืืฉืื ืืืืืง ืืืฉืจ ืคืืชืจืื ืืช ืืืจืืืื ืืืชืจ, ืืืคืขืืื ืืชืืื ืฉื ืืื ืฉืืจืืช CSS ืฉืืคืชืจื ืืขืื ืืืืื ืืงืืช ืืฉืืขืืชืืช ืืืชืจ ืืื ืืืฉืจ ืืขืฉืืช ืคืฉืื fork ืืกืคืจืื ืืืชืงื ืืช ืืืขืื ืฉื. ืืืืชืจืื ืฉื ืืคืืชืจืื ืืคืฉืื ืืื ืื ืืื ืืขืืืื ืืงืฆืจ ืืืชืจ ื Delivery, ืืื ืืืืชื ืืฆืื ืืืชืจ ืืงื ืืืชืจ ืืชืืืืงื ืืืืื ืืืจืื.
1 419
# ืคืืจืืง ืืืงืฉืื
ืื ืื ื ืขืืืจ ืืืืช ืืื ืืชืืืช ืืื ืงืื ื ืฉืืจืืงื ืขื ืืจืืฆืคื ืื ื ืืื ืืจืื ืืืชื. ืืืงืจื ืืืื ืืืืืจ ืืืชื ืืงืืคืกื, ืืื ืืื ืืงืจื ืื ืื ืื ื ืื ืืืื ืืืคื ืืงืืคืกื ืื ื ืืขืืืฃ ืืฉืื ืืืชื ืขื ืฉืืืื ืื ืืฉืื - ืื ืื ื ืืืืข ืฉืืืจืช ืืืจืื ืขืืื ืืืขืืช ืืฉืืงืื ืืืืืื ืืืืื.
ืืช ืืืชื ืืืืื ืืจืื ืืืชืจ ืงืฉื ืืืืฉื ืืงืื.
ืืื ืืขืจืืช ืื ืื ื ื ืชืงืืื ืืืื ืกืืฃ ืงืืขื ืงืื ืขื ืืืงืฉืื: ืืฉืื ืฉื ืจืื ืืื ืืื (ืืื ืืื ืืืช ืขืืื ืืื ืืจืืจ ืืื), ืคืื ืงืฆืื ืื ืืชืืขืืช, ืื ืื ืื ืฉืืื ืื ืืืืงืืช, ืงืื ืืกืืจืื, ืืจืื ืืื ืืกืคืืง ืืจืืจ, ืื ืืคืืื ืชืงืืช ืืืืื ืฉืื ืืคืฉืจ ืื ืฆื ืืืชื.
ืืื ืคืขื ืฉืจืืืื ืืื ืืืงืฉ ืืืื ืกืืื ืงื ืืจืืฉืื ืืื ืืืชืจืืง. ืืชื ืืกืคืจ ืืขืฆืื ืกืืคืืจืื ืืื "ืื ืื ืืืื ืขืืฉืื ืืชืงื ืืช ืื", "ืืืื ืืืฉืื ืืชื ืืช ืื ืืื ืืืืื ื", "ืื ืื ืขืืื ืื ื ืืืขืื", "ืื ื ืื ืืืื ืืกืคืืง ืืื ืื ืืงืื ืฆืจืื ืืขืฉืืช ืืคืืื ืืฉืืืจ". ืืืื ืฉืื ืื ื ืื ืืืืขืื ืืืคื ืืืงืื ืื ืืื ืฉื ืืชืืืช ืืืื, ืื ืื ื ืืฉืืืจืื ืืืชื ืขื ืืจืืฆืคื.
ืงืื ืืื ืืื ืงืื ืื - ืืืฉืืื ืฉืงืื ืืืื ืื ืฆืจืื ืืืจืืืฉ ื ืื ืืฉื ืืช ืืืชื. ืื ืื ืืืชืืื ืชืืื ืฉื"ืชืืงืื ืื" ืฉืืื ืจืง ืฉืืืจืื ืืืชืจ ืืืจืื, ืืื ืืื ืืืื ืฉืชืชืจืืื ืืคืจืง ืืืงืฉืื ืื ืืชืืงืื ืื ืฉืืื ืืฉืชืคืจื ืืื ืชืจืืืฉื ืืจืื ืืืชืจ ืื ืื ืืขืืื ืขื ืื ืืืขืจืืช.
1 419
# ืืืค ืงืื ืจืืืืื: ืืชืืงืื ืืืืจ ืืื
ืืจืื ืคืขืืื ืืฉืืืจืื ืื ืชืืืืืื ืืืืขื ืืืจืืืช ืื ืงืืข ืงืื ืืกืืื ืืกืชืืืชื ืืืขืืช ืงืืื ืื ืขื ืขืฆืื, ืืืชืืืกืชื ืืื ืืื ืืฉืืง: ืืื ืื ื ืืกืืื ืืืฆืื ืืช ืื ืืืขืืืช ืืงืื? ืืื ืืืื ืื ืจืขืืื ืืช ืืกืคืืง ืืืืื ืืชืืงืื ืื ืฉืืคืืจ? ืื ืืคืขืืื "ืืืื ื ืืฆื ืืช ืื ืืืจืืื ืืื ืืคืฉืจ ืืฉืคืจ ืืช ืืงืื".
ืืฉืืชื ืื ืฉืื ืฉืื ืืขืืืคืื ืืงืื ืคืืืืง ืืื ืฉืืืชืจ ืืคืืจื, ืืฉืื ืืืจ ืืืจืื ื ืืขืฆืื ืืช ืืืื ืืืืชืืืืืืช ืขื ืืืชื ืคืืืืง. ืืื ืืืืจ ืชืคืืืื ืฉืืกืืื ืืช ืืขืืืื ืฉืื ืืืจื ืฉืืื ื ืืชื ืื ืืช ืืชืคืืืื. ืืืช ืื ืืขืื ืฉืื ืื ืืชื ืืืืข ืื ืื ืืืืข ืืื ืืืื ืื ืขืืื.
ืืืขืื ืขื ืืืจื ืืืืช ืืื ืืืชืืงืืืช ืืืื ืืจืงืฆืื ืืืช ืืืืืฉืื ืฉืืืื ืืจืงืฆืื ืชืืื ืื-ืคืขืืืช. ืื ืื ืชืืื ืืจืื ืืงืื ืืงืกื ืฉื ืงืืจืก, ืืื ืืืื ืื ืืจืื ืืงืื ืืงืกื ืฉื ืื ืืืจืื ื ืื ืขืืืื ืขื ืืชืื ืชืื ืฆืขืืจืื ืืฆืืื ืืืืจื.
ืจืขืืื ืฉืื ื ืืฉืืง ืืืชื ืืืืจืื ื ืืืื ืชืืื ืขืืื ืื ืจืข ืืื ืืืกืชืื ืขื Code Review ืืชืืจ ืชืืืื ืืืืชืืงื ืื ืคืขื ืื ืงืืื ืืืช. ืื ืืืืจ ืฉืื ืืชื ืืืฉืืื ืืขืืืจ ืขื ืงืื ืฉื ืืืจ ืืจืืืื ืื ืื ืฉืืืืฉ ืืืืืืจืืชื ืื ืืกืคืืง ืืขืื, ืื ืืืกืจ ืขืงืืืืช ืืฉืืืช ืืฉืชื ืื, ืื ืืืืงื ืื ืืกืคืืง ืืืื ืืคืื ืงืฆืืืช, ืื ืืขืืืช ืืืืื ืืื ืฉืืืชื ืืืจ ืฉืื ืืืชืื ืืืืงืืช - ืืชื ืื ืชืืืื ืืช ืื ืืืืจืื ื Code Review. ืืืงืื ืื, ืชืืืจื ืืืจ ืืื ืฉืืคืฉืจ ืืชืงื ืืชืืืื ืจืง ืขืืื. ืืคืขื ืืืื ืชืืฉืืื ืืืืจ ืขื ืืืชื ืืืจ ืขื ืฉืืืขืื ืืืืช ื ืคืชืจืช ืืื ืงืื ืขืชืืื ืฉืืืืจ ืืฆืขืืจ ืฉืืื ืืืชื, ืืจืง ืื ืชืืฉืืื ืืืืจ ืขื ืืืืจ ืืื.
ืืื ืื ืืคืชืืจ ืืช ืื ืืขืืืช ืืขืืื? ืื ืจืื ืฉืื. ืืื ืืืื ืืืืืช ืฉืืืฉื ืืืืช ืชืฉืคืจ ืืงืฆืช ืืช ืืืื ืืืงื ืืฆืืื ืืืืจื ืืชืืจืื ืืื ืฉืื ืืจืฆืืช ืืืชืจ ืืฉืืืข ืืช ืืืขื ืฉืืื.
(ืืืฆื ืฉื ื ืื ืืืื ืืืืืช ืฉืื. ืื ื ืจืง ืืฉืืง ืขื ืืจืขืืื ืืื ืืื ืฉืืืขืืช. ืื ืืชื ืื ืื ืกืื ืื ื ืืกืืชื ืืฉืื ืืืื ืืฉืื ืืฉืืืข ืืื ืืื ืืื ืืชืืืืืช).
1 419
# ืืืจืื ืฉืืื ืงืฉืื ืืขืืฉืื ืงืืื ืืื ืื ื
ืืณืืืื ืืื ืก ืคืืจืกืื ืืชืืื ืคืืกื ืืืฆืื ืขื ืืืจืื ืฉืคืขื ืืื ืงืฉืื ืืขืืฉืื ืงืืื. ืืื ืขืืงืจื ืืืืจืื ืขื ืืื ืชืืกืคืืช ืฉืื:
ืชืขืืืืช SSL (ืืืจืืฃ)
ืืืืื ืชืืื ื (ืืืืืื ืืืืช ืืืฉื ืืืจ ืื ืจืืืื ืืืช)
ืืืจืื ืฉืจืช ืืขื ื
ืคืืชืื ืืืฉืง ืืฉืชืืฉ ืืืฆื ืคืืืคืืจืืืช
ืืขืืจืช ืงืื ืืืื ืื ืืชืืืืืช ืืืืื ื ืืืืื ื (ืืืืฉ ืืืงืจ)
ืืงืืช ืชืฉืชืืช CI/CD ืืืื ืืืื ื (ืืืืฉ ืืืืืื)
ืืืฉืืื ืืื ืืืื ืืืช (ืืืืจืื ืืฉืืฆ'ื ืื'ืืืืื ืืื ื ืจืื ืืื ืืืจืงื ืืื ืืืืืืช?)
ืืืจื ืืืื ืืืื ืืืคืืืืื ืืก
ืืืจืื ืืืจืื ื CSS
ืชืืืื ืืืคืืคื ืื ืืฉื ืื (ืื ืืื ืคืขื ืืืจ ืฉื ืงืจื IE)
ืื ืฉืืขื ืืื ืืจืืืช ืืื ืื ืืื ืืฉืื ืืืื ืืืื ืืืืืืื ืืืื ืืืื ื ืฉืื ื ืืช ืืืืฆืจืื ืฉืื ืื ื ืืื ืื, ืืื ืื ืฉืื ื ืืช ืืขืืืื ืฉืื ื. ืื ืื ืฉืขืืฉืื ืืชืื ืชืื ืืืืืื ืืฉืืช ืืื ืืืงืื ืืืชื ืืช ืขืฆืื. ืื ืื ื ืขืืืื ืคืืชืจืื ืืช ืืืชื ืืืืื, ืืชืืืืืื ืขื ืืืชื ืืืืืื ืื ืืขื ืืืชื ืืืืืื ืฉืืชืจืกืงืื ืชืืื ืืจืืข ืืื ื ืืื.
ืืืืื ืืฉ ืืื ืืฉืื ืืขืืื. ืื, ืืืื ืขืื ืืื ืกืืฃ ืืื ืืืืืืืช ืืืฉืืช ืฉื ืฆืืจื ืืืืื, ืืื ืื ืืกืืื ืฉืื ืื ื ืฆืืืจืื ืืื ืืขื ืขืจื. ืืขืืืื ืืืืืชืืช - ืฉืืื ืืืืืืช ืืืชืืืื ืขื ืืชืืจืื, ืืืืื, ืืคืชืืจ ืืขืืืช ืืืืืช ืืืจืืื ืืฆืืจืชืืืช - ืื ืื ืืืื ืืฉืื ืืงืื. ืจืง ืืืืื ืืฉืชื ื.
1 419
# ืื ืืืืืืฆืื ืฉืื
ืืฉืื ืื ื ืืกืชืืืื ืขื ืงืืข ืงืื ืืคืขื ืืจืืฉืื ื ืืืคื ื ืฉืืชืืืืื ืืคืืื ืืฉืืื "ืืื ืืื ืคืืชืจ ืืขืื ืืกืืืืช", ืฆืจืื ืืืืื ืฉืื ืื ื ืืกืืืืื ืขื ืืืืจืืช.
ืงืื ืฉืฆืจืื ืืืืื ืก ืืคืจืืืืืืง ืฆืจืื ืืกืคืง ืืืื ืืช ืืืืฆืืขืื ืืจืื ืืจืื ืืืชืจ ืืืืื ืืงืื ืืคืืืงืืืื ืจืืื. ืืฆื ืฉื ื ืื ืืงืจื ืืืื ืื ืืื ืืืื ืงืฆืช ืืืชืจ ืงืฉื ืืืื ื ืื ืงืฉื ืืชืืืืงื, ืื ืืืืื ืชืืืจืืช ืืฉืื ืื ืฉื ื ืืืื.
ืงืื ืฉืื ื ืืืชื ืืืืืื ืืคืืกื ืืืืื ืฆืจืื ืืืืืช ืงืฆืจ, ืืืืืง ืืืืขืืืจ ืืช ืืืกืจ ืฉืจืฆืืชื ืืืขืืืจ ืืคืืกื. ืื ืืงืจื ืืืื ืื ืืืืืืจืืชื ืื ืืืื ืืื ืืขืื.
ืื ืืืืฉืื ืขื ืืืืงืืช - ืืฉ ืืืืงืืช ืืืืื ืฉืืืืจื ืฉืืื ืืื ืืชืช ืคืืืืง ืืื ืฉืืืชืจ ืืืืจ ืืื ืฉืืจืฆืช ืืืืืงืืช ืชืืื ืืืืืืช ืืื ืชืคืจืืข ืืชืืืื ืืคืืชืื. ืืืฉ ืืืืงืืช ืืื ืืืจืฆืื ืื ืืืืงืืช ืืขืจืืช ืืื ืื ื ืืืื ืืืชืคืฉืจ ืขื ืืืืจืืช ืืจืืฆื ืืื ืืฉืื ืื ืืงืื ืชืืฆืื ืืื ืฉืืืชืจ ืืืื ื, ืืื ืื ืืืขืืืจ ืืืืฆืืจ ืืขืจืืช ืขื ืืื.
(ืืืืช ืืืขืื ืืืจืืืืช ืฉืื ืขื ืืขืชืงืช ืงืืขื ืงืื ืืกืืืง ืืืืจืคืื. ืื ืฉืืชื ืืืชื ืื ืืืืข ืื ืืืืืืฆืื ืฉืื ืืขื ืืืื ืคืฉืจืืช ืื ื ืืืื ืืืืืช).
ืืืงืื ืืืืื ืืช ืฉืืืช ืืขืืืื ืฉืืื ืืื ืงืื ืฉืืชื ืืืืขืื ืืชืืืง, ืขืืฆืจื ืงืืื ืืฉืืื - ืื ืืืืืืฆืื ืฉื ืืืชื ืงืื, ืืื ืืืืืืฆืื ืืืื ืืืื ืืืื ืืืืื ืืงืื ืฉืืืจ ืงืืื, ืืจืง ืืืจื ืื ืืฆืืขื ืชืืงืื ืฉืืืงื ืืืฉืืื ืืช ืืืชื ืืืืืืฆืื.
1 419
# ืฉืืชืื ืืืืืช ืชืงืฉืืจืช ื ClojureScript ืฉืืชืืชื ืืคื ื ืฉื ืชืืื
ืืคืืกื ืืจืืข ืชืื ืืืช ืืงืืืคืื ื ืืืช React ืืชืืจืืืืช ื ClojureScript ื Reagent ืืจืืืชื ืืื ืืขืืื ืขื ืจืืืืื'ื ื ืืืืชืื ืงืืืคืื ื ืืืช ืจืืืงื ื clojurescript. ืืืืืื ืืืืจืื ื ืืืืชื ืคืืกื, ืืื ืฉืืืืื ืฉืืจืชื ืืจืืง ืืจืืืืื'ื ื ืืฉื ืชืืื ืืืืจืื ืืช ืืืชื ืืืืื ืืชืงืฉืืจืช ajax. ืืื ืืืชื ืฉืื ื ืืงืื ืฉืื ื ืจืืื ืืืชืื ืืจืืืงื, ืืืืื ืืืืื ืืืืื ืืืื ืจืืืืื'ื ื ืขืืื ืคืืืช ืืื ืืงืื ื'ืืืืืกืงืจืืคื ืืงืืื ืฉืืืืชื ืืืชื. ืืงืืฉื ืืขืืงืจื ืฉืื ืืชืจืืื ืืงืื ื JavaScript ืืจืืืืื'ื ื ืืืชื ืืืกืจ ืืชืืืื ื Hooks, ืืืคืจื useEffect ืฉืืื ืื ืืืื ืืกืจ.
ืฉื ืชืืื ืขืืจื ื Hooks ืงืืืื ืชืืืื ืืืื ืืืคื ืงืช ืืจืืืืื'ื ื ืืืืช ืืืชื ืืฉืืืื ืืืืื ืืช ืืืชืื ืืืืฉ ืืช ืืืืืื ืืืื ืืงืื ืฉืืจืื ืืจืื ืืืชืจ ืืืืืืชื ืืืชืื ืชื JavaScript. ืื ืืื ืืืชืจ ืืื ืืงืืืืช ืืืื ื ืจืื ืืช ืฉืชื ืืืืจืกืืืช.
## ืืืจืกื ืืฉื ื ืฉืื ืขืืื ืืืคื ื ืฉื ืชืืื
ืืคืืกื ืฉืืชืืชื ืืคื ื ืฉื ืชืืื ืืจืืืชื ืืช ืืืืจืกื ืืืื ืฉืื ืขืืื:
(defn pokemon-character [{id :id}]
(r/with-let [
data (r/atom {})
active (r/atom true)
request (go
(let [response (<! (http/get
(str "https://pokeapi.co/api/v2/pokemon/" @id)
{:with-credentials? false}))]
(if (true? @active) (reset! data (:body response)) nil)))
]
[:div
[:p "ID: " @id]
[:p "Name: " (str (get @data :name))]]))
ืืืขืื ืืืชื ืืื ืฉืืคืงืืื with-let ืงืืจืืช ืจืง ืคืขื ืืืช, ืืืื ืืฉื id ืืฉืชื ื ืื ืชืฆื ืืงืฉืช ืชืงืฉืืจืช ืืืฉื. ืืขืื ืงืื ื ื ืืกืคืช ืืื ืืฉืืืืฉ ื request ืฉืื ืกืคืจืืืช ืชืงืฉืืจืช ืฉื cljs, ืืืงืื ืืงืื ืืชืงืฉืืจืช ืืืืืจ ืฉื ืืืคืืคื.
## ืืืจืกื ืฉืขืืืืช ืืืื
ืขื ืืชืืืื ื hooks ืืฉืืคืืจ ืืืืืืจ ืืื clojurescript ืืืคืืคื ืืฆืืืชื ืืฉืืชื ืืช ืืงืื ืืืืืืข ืืืืจืกื ืืืื ืฉืื ื ืื ืืืื:
(defn use-pokemon [id]
(let [[data set-data] (react/useState {})
active? (r/atom true)]
(react/useEffect (fn []
(go
(let [response (<p! (js/fetch
(str "https://pokeapi.co/api/v2/pokemon/" id)))
data (<p! (.json response))]
(if @active? (set-data data))))
(fn []
(reset! active? false)))
(array id))
data))
ืืืื ื ืจืื ืื ืืฉ ืคื:
1. ืฉืืืืฉ ื useState ืืื ืืฉืืืจ ืืช ืืืืืข ืฉืืืืจ ืืืฉืจืช, ืขืืื ืืืืืง ืืื ื JavaScript.
2. ืืืฉืชื ื active? ืืืืืจ ืืชืืจ ืืืื ืืื ืฉืืคืฉืจ ืืืื ืืฉื ืืช ืืช ืืขืจื ืฉืื. ืืืจื ืืื ืืฉืชื ืื ื Clojure ืื Immutable, ืืื ืคื ืืืืช ืืืืชื ืฆืจืื Mutable Data ืืฉืืื ืืืคืฉืจ ืืืืื ืฉื ืืืคืงื ืืคื ืืืืฉืง ืฉื useEffect.
3. ืืงืจืืื ื useEffect ื ืจืืืช ืืืืืง ืืื ื JavaScript. ืืคืจืืืจ ืืจืืฉืื ืืื ืคืื ืงืฆืืืช ืืืคืงื, ืฉืืืืืจื ืคืื ืงืฆืืืช ืืืืื, ืืืคืจืืืจ ืืฉื ื ืืื ืืขืจื ืืชืืืืืช.
4. ืงืื ืืชืงืฉืืจืช ืืฉืชืืฉ ื fetch API ืืจืืื ืฉื ืืืคืืคื. ืืืืงืจื go ืืื ืืืงืืืื ืืงืืื'ืจืกืงืจืืคืืืช ื async ืืืืืงืจื "ืงืื ื p ืืื ืกืืื ืงืจืืื" ืืื ืืืงืืืื ืืงืืื'ืจืกืงืจืืคืืืช ื await.
ืืื ืืกื ืืื ืืคื ืื ืขืืฉืื ืื ื ืืืื ืืืฉืชืืฉ ืืคืื ืงืฆืื use-pokemon ืืชืื ืงืืืคืื ื ืื ืืืืคื ืืื:
(defn pokemon [id]
(let [
data (use-pokemon id)
]
[:div
[:p "ID: " (.stringify js/JSON id)]
[:p "Name " (aget data "name")]]))
ืืืื ืขืืื ืืืงืืืคืื ื ืื ื ืฉืืจืช ื ืงืื ืืืืืงืืช.
ืืืืื ืื ืืจืืืช ืืช ืืงืื ืืืื ืขื ืื ื require-ืื ืืืืกื: https://gist.github.com/ynonp/57c429315d282a82b145a0b94db92cb71 419
1. ืืคืงืืื
r/atom ืืืฆืจืช ืืืื, ืฉืื ืืืจ ืฉืฉืืืจ ืืืืข ืฉืืืื ืืืฉืชื ืืช. ืจืื ืืืืืข ืืงืืื'ืจ ืืื Immutable, ืืืืจื ืืื ืืืื ืื ื ืืืื ืืืื ืื ืืกืคืจ ืืืืืื ืืื ืืืืืืง ืืช ืืืืืข ืืืฉืชื ื ืฉื ืืืืฉืื. ืืคืฉืจ ืืืฉืื ืขื ืืืืื ืืื Store ืืจืืืืงืก ืื ืืืืืงืก.
2. ืืืืื ืืืจืืื ืืฆืื ืืชืืื ืืช ืืื ืจืฉืืืช ืืงืืคืื. ืืฉ ืื ืืืื ืฉืืืคื ื timeout ืืื ืฉืืืืืฆื ืขื ืงืืฃ ืืืจื ืฉืืืจ ืืฉ ืฉื ืืื ืืืืืื ื ืงืฆืจ ืืช ื timeout ืืืื ื ืกืชืืจ ืืช ืื ืฉืืืื.
3. ืืคืื ืงืฆืื click-on, ืฉืื ืจืื ืืืชื ืฆืจืืื ืืืืงืจื handle-click, ืืื ื ืงืืืช ืืื ืืกื ืืงืื ืืืื ื ืงืจืืช ืืฉืืฉืชืืฉ ืืืืฅ ืขื ืงืืฃ. ืืื ืืงืืืช ืืช ื id ืฉื ืืงืืฃ, ืืืืงืช ืื ืืฆื ืืขื ืืื ืื ืืืฉืืง ืืืขืืื ืช ืืช ืืืคืืื ื ืืงืืคืื. ืืื ื ืขืืจืช ืืคืื ืงืฆืืืช ืืขืืจ ืืืืจืืช ืฉืืชืืืืช ืืงืืืฅ.
ืืงืืืฅ ื UI ืขืืื ืชื ืืช ืืงืื ื home-page ืื ืฉืืฆืื ืืช ืจืฉืืืช ืืงืืคืื ืืืืจื ืืฉืื ืื ืืื ื ืจืื ืื:
(defn home-page []
(fn []
[:span.main
[:h1 "Welcome to my-reagent-app"]
[:ul {:class "cards"}
(for [item @cards/cards]
^{:key (:id item)}
[:li {
:class [(if (:visible item) "visible" "hidden")
(when (:found item) "found")]
:on-click #(cards/click-on (:id item))
} (:value item)])]]))
ืื ื ืืืื ืืืืชื ืืช ืืืชืื ืฉื reagent. ืื ื ืืืฉื ืฉืืื ืืจืื ืืืชืจ ื ืงื ืืงื ืืชืืืืงื ืืืฉืืืื ื jsx. ืื ืงืืืคืื ื ืื ืืืืฆืืช ืขื ืืื ืจืฉืืื ืฉืืชืืืื ื keyword ืืืฉืื, ืืืจ ืื hash-map ืฉื ืืืคืืื ืื ืืืกืืฃ ืืืงืกื ืื ืืืืืื ืฉื ืืืืื ื.
## ืื ืืืื
ืืชื ืืืืืื ืืืฆืื ืืช ืืฉืืง ืืืืืจืื ืืืื ืฉืื ืืืืืืื ืืงืืฉืืจ: https://github.com/ynonp/cljs-memory-game.
ืืื ืืชื ืจืืฆืื ืืืขืช ืืืชืจ ืขื ืจืืืืื'ื ื ืฉืืื ืืงืจืื ืืช ืืืืจืื ืืงืฆืจ ืฉืืื ืืงืืฉืืจ:
https://reagent-project.github.io/.1 419
# ืืฉืืง ืืืืจืื ื ClojureScript
ืืคืขื ืืงืืืืช ืฉืฉืืืงืชื ืขื ืงืืื'ืจืกืงืจืืคื ืืจืืืืื'ื ื ืืจืืชื ืืื ื ืืืื ืฉืื ืืืชื ืชืืืื ื Hooks. ืืื ืืื ืชื ืฉืืืกืืคื ืชืืืื (ืืืจืืช ืฉืื ื ืืกืืชื ืขืืืื), ืืจืฆืืชื ืื ืฆื ืงืฆืช ืืื ืคื ืื ืืื ืืืขืืฃ ืืื ื ืืกืฃ ืืืืื. ืืชืืฆืื ืืืชื ืืฉืืง ืืืืจืื ืฉืขืื ืื ืจืข ืืืื ืืืคืืื ืืื ื ืขืื ืืคืชื. ืืืื ื ืจืื ืืช ืืงืื.
## ืืื ืืชืืืืื
ืืฉืืื ืืงืื ืกืืืจืืจ ืืืชืืืช ืืคืืืงืฆืืืช ืจืืืืื'ื ื (ืฉืื ืืจืืืงื ืฉื ืงืืื'ืจืกืงืจืืคื) ืืชื ืฆืจืืืื ืืืชืงืื ืืื ืืฉื lein ืืืื:
https://leiningen.org/
ืืืืจ ืื ืืืืกืืฃ ืืืชืืื:
$ lein new reagent my-reagent-app
ืื ื ืืชื ืชืื ืืช ืืคืจืืืงื ืขื ืืกืคืจ ืืคืื. ืงืืืฅ ืืืืฉืง ื ืงืจื src/cljs/my_reagent_app/core.cljs. ืืืชืืื ืืฉ ืื ืืจืื ืชืืื ืื ืจืืืื ืื ืืืคืฉืจ ืืืืืง ืืช ืืจืื ืืืืืฉืืจ ืขื ืืงืื ืืื ืืฉืืื ืืงืื ืืืฉืื ืคืฉืื:
(ns my-reagent-app.core
(:require
[reagent.core :as reagent :refer [atom]]
[reagent.dom :as rdom]
[my-reagent-app.util :as util]
[my-reagent-app.lib.cards :as cards]))
(defn home-page []
(fn []
[:span.main
[:h1 "Hello World"]]))
(defn mount-root []
(rdom/render [home-page] (.getElementById js/document "app")))
(defn init! []
(mount-root))
ืืชืืงืืืช ืืคืจืืืงื ืฉื ืืฆืจ ืืคืขืืืื:
$ npm install
$ npx shadow-cljs watch app
ืืื ืืคืฉืจ ืืืืื ืก ืืืคืืคื ืืคืืจื 3000 ืขื localhost ืืื ืืจืืืช ืืช ืืืฃ ืืจืืฉืื ืืืคืฉืื ืืืืคืืืงืฆืื ืฉืืกื ืืื ืืืชื Hello World.
## ืงืื ืืืฉืืง ืืืืจืื
ืืืจื ืฉืืืชื ืื ืืช ืืชืื ืืช ืืืฉืืชื ืืืชืื ืืช ืงืื ืืงืืื'ืจ ืืืฉืืง ืืฉืืจืชื ืืืชื ืืงืืืฅ src/cljs/my_reagent_app/lib/cards.cljs.
ืืฉืืง ืืืืจืื ืืืื ืืืืื ืฉื ืงืืคืื, ืื ืฉืื ืงืืฃ ืืื ืืืืืงื ืขื ืืืคืชืืืช id, value, found ื visible. ืืืฉืืขืืช ืฉื value ืืื ืืืกืคืจ ืฉืืชืื ืขื ืืงืืฃ (ืืืฉืืง ืืืืจืื ืืฉ ืืืืืช ืฉื ืงืืคืื ืขื ืืืชื ืืกืคืจ), ืืืคืชื visible ืืชืืจ ืืื ืขืืฉืื ืืงืืฃ ืืืื ืื ืืืืื, ืืืคืชื found ืืชืืจ ืืื ืืฆืืชื ืืช ืืงืืฃ ืืื ืืืช ืืืื ืฉืื ืืืืคืชื id ืืืื ืืืื ืืืืืื ืืงืืฃ.
ืื ืืงืืคืื ืืชืืืืื ืืืกืชืจืื, ืืืืฆื ืขื ืงืืฃ ืืฆืืื ืืืชื, ืืืืฆื ืขื ืงืืฃ ื ืืกืฃ ืืฆืืื ืื ืืืชื, ืืื ืื ืฉื ื ืืงืืคืื ืืืื ืื ืืืฉืืจื ืืืืืื ืื found ืฉื ืฉื ืืื ืืืืืจ ื true, ืืื ืื ืฉืื ืื ืื ืฉื ืืื ืืืกืชืจื ืืืจื ืืืจื ืฉืชื ืฉื ืืืช.
ืื ืืงืื ืืงืืื'ืจ ืืืฉืืง:
(ns my-reagent-app.lib.cards
(:require [reagent.core :as r]))
(def cards (r/atom (shuffle
(map-indexed (fn [id v]
{
:id id
:value v
:found false
:visible false})
(flatten (take 2 (repeat (range 5))))))))
(def timeout (r/atom nil))
(defn show [id]
(fn [item]
(if (== (:id item) id)
(conj item {:visible true})
item)))
(defn new-turn [cards]
(map #(conj % {:visible false}) cards))
(defn reveal [card1 card2]
(fn [cards]
(map #(if (or
(== (:id %) (:id card1))
(== (:id %) (:id card2)))
(conj % {:found true :visible false})
%) cards)))
(defn check-pairs [id]
(let [other (first (filter :visible @cards))
this (first (filter #(== (:id %) id) @cards))]
(if (== (:value other) (:value this))
(swap! cards (reveal other this))
(do
(swap! cards #(map (show id) %))
(reset! timeout (js/setTimeout #(swap! cards new-turn) 2000))))))
(defn click-on [id]
(if (== 2 (count (filter :visible @cards))) (do
(js/clearTimeout @timeout)
(swap! cards new-turn)))
(let [card (first (filter #(== (:id %) id) @cards))
in-turn (some :visible @cards)]
(cond
in-turn (check-pairs id)
(:found card) false
(:visible card) false
:else (swap! cards #(map (show id) %)))))
ืื ื ืืื ืื ืจืง 54 ืฉืืจืืช ืืื ืืื ืืืช ืื ืื ืืืืจืื ืงืืื'ืจ ืืืง ืืืงืื ืืืื ืืืืื. ืืื ืขืืงืจื ืืืืจืื ืืืงืฆืจื:1 419
# ืืจืืื ืืืืฉ
ืืืื ื ื ืื ืฉืืชื ืฆืจืืืื ืืืชืื ืงืื ืฉืงืืจื url-ืื ืฉื ืืืงืจืืื ืืืืคืืก ืืช ืฉื ืืืืืจ ืืฉื ืืจืืคื ืื url. ืืืืืจ ืืชื ืชืชื ื ืื ืืช ืืืืจืืืช:
https://hub.docker.com/r/bitnami/postgresql
ืืืงืื ืืืืืจ ืืช ืืืืืื:
{ 'author': 'bitnami', 'repo': 'postgresql' }
ืืืืขืื ืื? ืขืืื, ืื ื ืืกืืชื ืืื ืืช ืืืืืฅ, ืืืช ืืคืื ืงืฆืื:
import re
import sys
def parse_dockerhub_url(url: str):
res = re.search(r'https://hub.docker.com/r/([\w%-]+)/([\w%-]+)', url)
if res:
author, repo = res.groups()
return { 'author': author, 'repo': repo }
print(parse_dockerhub_url(sys.argv[1]))
ืืืื ืืจืืฆืื ืืงืื ืืืืข ืืคืจืืืงืฉื ืืื ืืงืื ืืืื ืืชืงืฉืจ ืืืชืืื ื ืขื ืืื. ืืกืชืืจ ืฉืืฆืื ืืฉืชืืฉืื ืืจืื ื Official Images, ืฉืื ืืืื'ืื ืฉื url ืฉืืื ื ืจืื ืืื:
https://hub.docker.com/_/ubuntu
ืืงืื ืฉืื ืื ืืืื ืืช ืืืื ื ืื ืื ื ืืืคืฉ ืืช ื /r/ ืืคื ื ืฉื ืืจืืคื, ืืืื ืื ืื ืืฆืืืืื ืืืืื ืืช ืื ืชืืืื ืฉืืื ืืชืืื ื.
ืื ืขืืฉืื?
ืืจืื ืืชืื ืชืื ืฉืืงืืืื ืืฉืืื ืืืืช ืืืคืฉืื ืืช ืืืจื ืืืืืจื ืืืืชืจ ืืคืืชืจืื. ืืืงืจื ืฉืื ื ืืื ืงื ืืฉืืคื ืืช ืืงืื ืืคืื ืงืฆืื ืืืฉื ืืช ืืช ืืชื ืื:
import re
import sys
def parse_dockerhub_url(url: str):
res = re.search(r'https://hub.docker.com/r/([\w%-]+)/([\w%-]+)', url)
if res:
author, repo = res.groups()
return { 'author': author, 'repo': repo }
res = re.search(r'https://hub.docker.com/_/([\w%-]+)', url)
if res:
author, repo = ["Official Image", res.group(1)]
return { 'author': author, 'repo': repo }
print(parse_dockerhub_url(sys.argv[1]))
ืื ืขืืื ืืืคืฉืจ ืืืืฉืื ืืชืงืื ืืืื.
ืื?
ืจืืข.
ืืืื ื ืชืืงื ืชื ืืช ืืืื ืืื ื ืจืื ืื ืฉืฉืืจืชื ืืช ืืคืื ืงืฆืื.
ืืืืจืกื ืืงืืืืช, ืื ืืืฉืื ืืื ืจืืฆื ืืฉื ืืช ืืช ืืืคืชืืืช ืืืืืื ืฉืืคืื ืงืฆืื ืืืืืจื ืืื ืขืืื ืืฉื ืืช ืจืง ืืืงืื ืืื. ืืืืจืกื ืืืืฉื ืื ืืืงืื author ื ืจืฆื ืืืชืื owner ื ืฆืืจื ืืฉื ืืช ืืฉื ื ืืงืืืืช. ืืื ืฉืืืชืจ ืืจืืข, ืฉืืฆืจืชื ืืื ืชืื ืืช. ืืื ืืื ืืื ืฉืืฆืืจื ืืืืกืืฃ ืขืื url ืฉืฉืืืชื ืืืคื ืื ืื ืืขืชืืง ืืช ืืงืื ืืจืง ืืืคืื ืืช ืฉืื ืื ืฉืืืช ืืืคืชืืืช ืืขืื ืืืชืจ ืงืฉื.
ืื ื ืืืื ืืืืจื ืืช ืืืืืคืืช ืืชืงื ืืช ืืืื. ืื ื ืืืื ืื ืฉืืืื ืฉืืืงืื ืฆืืฆื ืืืชืืื ื ืขื ืืชืงืื ืืืืช ืขืืืชื ืขื 5 ืืืจืื ืืืจืื, ืืืื ืืืชืจ ืืฉืืืื. ืื ื ืืืื ืฉืงืฉื ืืชืงื ืงืื ืืื ืืืจืื ืืืชื ืืืืฉ ืืืืชื PR, ืืฉืืืื ืืจืืข ืืื ืืื ืจืขืืื ืืื ืืชืงื ืืช ืื ืืฆืืจื ืฉืชืฉืืจ ืืช ืืจืื ืฉื ืืคืื ืงืฆืื ืืืงืืจืืช.
ืืขื ืื ืื ืื ื ืืืฉื ืฉืืฉ ืคื ืจืง ืฉืชื ืืคืฉืจืืืืช ืฉืืขืืื ืืืืื ืืจืืืง:
1. ืืคืฉืจ ืืืืืื ืฉืื ืื ื ืืืจืื ืื ืืืืฉ ืืช ืืงืื ืืฉืื ืื ื ืืชืงื ืื ืืืืื, ืืื "ืชืืงืื" ืืื ืฉืืชืืชื ืงืืื ืืืื ืื ื ืื ืก ืืืขืจืืช.
2. ืืคืฉืจ ืืืืืื ืฉืื ืื ื ืืื ืืกืื ืชืืงืื ืื ืืืืจืื, ืืื ืืงืืืฉืื ืืื ืฉืขืืช ืืฉืืืข ืืื ืืชืงื ืืช ืืชืืงืื ืื, ืืืืืืืจ ืืืชื ืืจืื ืืืงืืจืืช ืฉื ืืงืื.
ืงืื ืืืคื ืืืจืื. ืืฃ ืืื ืื ืืฆื ื"ืคืจืืืงื ืจืืคืงืืืจืื ื" ืืฉืืื ืืชืงื ืืคื ืงืื ืฉื ืฉืชื ืฉืืจืืช, ืืื ืืืืจืื ืืืื ืืฆืืืจืื ืืืืืจื ืืื ืงืฉื ืืชืงื ืืืชื.
ื .ื. ืืฉ ืืื ืืืื ืจืขืืื ืืช ืืื ืืืจืื ืืืืฉ ืืช ื"ืชืืงืื"? ืื ืชืฉืืจื ืืืชื ืืื - ืขืืคื ืขื ืขืฆืืื ืืฉืชืคื ืืชืืืืืช. ืื ื ืืืืื ื ืื ืืฉืชืฃ ืืช ืืจืขืืื ืืช ืฉืื ืืื ืื ืืงืืงื.
Available now! Telegram Research 2025 โ the year's key insights 
