ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ
(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² React, Vue ΠΈΠ»ΠΈ MobX), Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ JavaScript Π½Π΅ ΡΠΌΠ΅Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ. ΠΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΡΠ»Π΅ΠΆΠ΅Π½ΠΈΠ΅ (deep watching).
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°: ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΠΎΠ΅ ΡΠ»Π΅ΠΆΠ΅Π½ΠΈΠ΅ (`shallow watching`)
JavaScript ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π° Π½Π΅ ΠΈΡ
ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅.
const obj = { user: { name: "ΠΠ²Π°Π½" } };
const copy = obj;
copy.user.name = "ΠΠ΅ΡΡ";
console.log(obj.user.name); // "ΠΠ΅ΡΡ" (ΠΎΠ±Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅)
ΠΠ±ΡΡΠ½ΡΠΉ
Object.assign()
ΠΈΠ»ΠΈ spread-ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ({ ...obj }
) Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: const obj = { user: { name: "ΠΠ²Π°Π½" } };
const shallowCopy = { ...obj };
shallowCopy.user.name = "ΠΠ΅ΡΡ";
console.log(obj.user.name); // "ΠΠ΅ΡΡ" π± (ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»!)
ΠΠ»Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
structuredClone()
ΠΈΠ»ΠΈ JSON.parse(JSON.stringify(obj))
: const deepCopy = structuredClone(obj);
deepCopy.user.name = "ΠΠ΅ΡΡ";
console.log(obj.user.name); // "ΠΠ²Π°Π½" β (ΠΎΡΠΈΠ³ΠΈΠ½Π°Π» Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ)
Π React ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΡΡΠ»ΠΊΠΈ (
shallow compare
). const [user, setUser] = useState({ name: "ΠΠ²Π°Π½" });
useEffect(() => {
console.log("ΠΠΌΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ:", user.name);
}, [user]); // Π Π°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ user β Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ!
// ΠΠ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
user.name = "ΠΠ΅ΡΡ"; // user ΠΎΡΡΠ°Π»ΡΡ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ
Π Π΅ΡΠ΅Π½ΠΈΠ΅ β ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ:
setUser(prev => ({ ...prev, name: "ΠΠ΅ΡΡ" }));
ΠΠ±ΡΡΠ½ΡΠΉ
watch
ΡΠ»Π΅Π΄ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π° ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΡΡ watch(user, (newValue) => {
console.log("ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ:", newValue);
});
ΠΠ»ΡΠ±ΠΎΠΊΠΎΠ΅ ΡΠ»Π΅ΠΆΠ΅Π½ΠΈΠ΅ (
deep: true
)watch(user, (newValue) => {
console.log("ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ:", newValue);
}, { deep: true });
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ