{"id":333696,"date":"2022-05-26T21:00:26","date_gmt":"2022-05-26T21:00:26","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=333696"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=333696","title":{"rendered":"<span>\u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e: Vue 3 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p> Vue 3 \u043f\u0440\u0438\u043d\u0451\u0441 \u0432 \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u044f \u0441\u0442\u0430\u043b \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0430 \u043f\u043e\u0440\u043e\u0439 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0446\u0435\u043b\u044b\u0439 \u0437\u043e\u043e\u043f\u0430\u0440\u043a \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u043e\u0441\u0442\u0438, \u043b\u0438\u0431\u043e \u0432\u0441\u0451 \u0432 state manager, \u043b\u0438\u0431\u043e \u0432 composable (composition API), \u043b\u0438\u0431\u043e <strong>\u043c\u0443\u0442\u0430\u0446\u0438\u044f props \u0432\u043d\u0443\u0442\u0440\u0438<\/strong> \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432!<\/p>\n<p>\u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043d\u0430\u043c \u0432\u043e Vue 3.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/324\/aa8\/22d\/324aa822d612637c34fa25be43dd6dde.png\" width=\"1824\" height=\"1020\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/324\/aa8\/22d\/324aa822d612637c34fa25be43dd6dde.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h3>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044f \u0442\u0432\u0435\u0440\u0434\u043e \u0443\u0431\u0435\u0436\u0434\u0451\u043d, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0438\u0436\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u0435\u0440\u0435\u0431\u0440\u044f\u043d\u043e\u0439 \u043f\u0443\u043b\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u0435\u0442 \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0426\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u0438\u043c\u044b\u0445 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0438\u0437 \u0441\u0435\u0431\u044f \u043d\u0435\u043a\u0438\u0439 \u0447\u0435\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0447\u0442\u043e-\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u043c \u043e \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445!<\/p>\n<p>\u0421\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e:<\/p>\n<ol>\n<li>\n<p>props\/emits<\/p>\n<\/li>\n<li>\n<p>provide\/inject<\/p>\n<\/li>\n<li>\n<p>composable (composition API)<\/p>\n<\/li>\n<li>\n<p>state manager (Vuex\/Pinia)<\/p>\n<\/li>\n<\/ol>\n<p><strong>props\/emits<\/strong> &#8212; \u043f\u0440\u044f\u043c\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438! \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 (\u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438).<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u0435\u043d \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (\u201c<a href=\"https:\/\/vuejs.org\/guide\/components\/provide-inject.html#prop-drilling\" rel=\"noopener noreferrer nofollow\"><u>props drilling<\/u><\/a>\u201d) \u0438 \u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u043d\u0435\u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445.<\/p>\n<p><strong>provide\/inject<\/strong> &#8212; \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u201c<a href=\"https:\/\/vuejs.org\/guide\/components\/provide-inject.html#prop-drilling\" rel=\"noopener noreferrer nofollow\"><u>props drilling<\/u><\/a>\u201d \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\/\u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432\/\u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f, \u043a\u0442\u043e \u0438\u0437 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a \u0436\u0435 \u201c\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u201d \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443.<\/p>\n<p><strong>composable<\/strong> &#8212; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a \u0436\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u201c\u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u0430\u201d \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u201c\u0441\u043e\u0431\u043b\u0430\u0437\u043d\u0438\u0442\u044c\u0441\u044f\u201d \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0432 composable \u0444\u0430\u0439\u043b\u044b.<\/p>\n<p><strong>Vuex\/Pinia<\/strong> &#8212; \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u0441 composable. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0443\u0436 \u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043b\u044e\u0431\u0430\u044f \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0441 \u0441\u043e\u0431\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0442\u044c \u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u044c (\u043f\u043e\u043a\u0430) \u0442\u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0441\u043c\u044b\u0441\u043be \u0438 \u0447\u0442\u043e-\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043c\u0435\u043d\u044f\u044e\u0442, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u0441 \u043f\u0440\u044f\u043c\u043e\u0439 \u0441\u0432\u044f\u0437\u044c\u044e \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438.  <\/p>\n<p>\u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u0432\u0441\u0435 \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043c\u043e\u0451 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0441\u043f\u043e\u0440\u0438\u043c\u043e\u0439 \u0438\u0441\u0442\u0438\u043d\u043e\u0439. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043d\u0435\u043e\u0441\u043f\u043e\u0440\u0438\u043c\u044b\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u0435 \u043e\u0442\u0447\u0435\u0442 \u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432.  <\/p>\n<h3>\u0421 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435.<\/h3>\n<p><strong>props\/emits <\/strong>&#8212; \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c (\u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c) props \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439-\u0442\u043e props \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u043d \u043e\u0431 \u044d\u0442\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f emit(). \u0414\u0430 \u201c<a href=\"https:\/\/vuejs.org\/guide\/components\/provide-inject.html#prop-drilling\" rel=\"noopener noreferrer nofollow\"><u>props drilling<\/u><\/a>\u201d \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e.   <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/de3\/40c\/b2a\/de340cb2a469c29dd187c28ff30ab306.png\" alt=\"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Props\/Emits\" title=\"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Props\/Emits\" width=\"922\" height=\"824\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/de3\/40c\/b2a\/de340cb2a469c29dd187c28ff30ab306.png\"\/><figcaption>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Props\/Emits<\/figcaption><\/figure>\n<p><strong>provide\/inject<\/strong> &#8212; \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d75\/4c6\/284\/d754c62849bafb36a9e501113000ee83.png\" alt=\"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Provide\/Inject\" title=\"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Provide\/Inject\" width=\"924\" height=\"824\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d75\/4c6\/284\/d754c62849bafb36a9e501113000ee83.png\"\/><figcaption>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Provide\/Inject<\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 props\/emits \u0434\u0430\u043d\u043d\u044b\u0435 <strong>\u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435<\/strong>! \u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u0447\u0435\u0440\u0435\u0437 provide \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.  <\/p>\n<p><strong>Vuex\/Pinia<\/strong> (state managers).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95c\/a83\/fed\/95ca83fedb9f37e1626399652d7e0be9.png\" alt=\"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia\" title=\"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia\" width=\"1101\" height=\"804\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/95c\/a83\/fed\/95ca83fedb9f37e1626399652d7e0be9.png\"\/><figcaption>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia<\/figcaption><\/figure>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0445\u0440\u0430\u043d\u0438\u0442\u044c <strong>\u0432\u0441\u0451<\/strong> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 state manager &#8212; \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0432\u0441\u0451, \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u0435\u043c, \u0432\u044b\u043d\u043e\u0441\u0438\u043c. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439\/\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u201c\u0447\u0442\u043e-\u0442\u043e\u201d \u0442\u0440\u0435\u0442\u044c\u0435, \u0438\u043c\u0435\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u044d\u0442\u043e\u043c \u201c\u0447\u0451\u043c-\u0442\u043e\u201d. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e, \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u044d\u0442\u043e\u043c \u201c\u0447\u0435\u043c-\u0442\u043e\u201d, \u0430 \u0432 \u0434\u043e\u0431\u0430\u0432\u043e\u043a \u043d\u0430\u0447\u043d\u0443\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b <strong>\u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e<\/strong>.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0435\u0431\u044f \u044f \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u0447\u0442\u043e \u0432 state manager \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438. \u041e\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 Props\/Emits \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e01\/1ac\/a1c\/e011aca1c1f3251320801d1cfbeb10ca.png\" alt=\"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia + Props\/Emits\" title=\"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia + Props\/Emits\" width=\"1101\" height=\"804\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e01\/1ac\/a1c\/e011aca1c1f3251320801d1cfbeb10ca.png\"\/><figcaption>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia + Props\/Emits<\/figcaption><\/figure>\n<p>\u0410 \u0447\u0442\u043e \u0436\u0435 \u0441 <strong>Composable ( Composition API)<\/strong>? \u041f\u043e\u0434\u0445\u043e\u0434 \u0441 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 use\u2026 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Vuex\/Pinia.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430, \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043d\u043e. <strong>Vuex\/Pinia<\/strong> &#8212; \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Vuex\/Pinia \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c. \u0421 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 Composable \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u0422\u043e \u0435\u0441\u0442\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0432\u0430\u0448\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e, \u0441\u0445\u0435\u043c\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u043e\u0439, \u0447\u0442\u043e \u0432\u044b\u0448\u0435. <s>\u0414\u0430 \u0438 \u043f\u043e\u043b\u0435\u043d\u0438\u043b\u0441\u044f \u044f \u0435\u0451 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c.<\/s><\/p>\n<h3>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Props\/Emits (\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b)  <\/h3>\n<h4>\u041f\u0440\u044f\u043c\u043e\u0439 props \u0438 emits<\/h4>\n<p>\u0421\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u044d\u0442\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 v-model. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043d\u0438\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0447\u0435\u0440\u0435\u0437 v-model.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3QgbXNnID0gcmVmKCdIZWxsbyBXb3JsZCEnKTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBtc2cudmFsdWUgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbn1cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm1zZzoge3sgbXNnIH19PC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBAY2xpY2s9XCJjaGFuZ2VcIj5cbiAgICAgINCY0LfQvNC10L3QuNGC0YxcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8Rm9ybSB2LW1vZGVsPVwibXNnXCIgLz5cbjwvdGVtcGxhdGU+IiwiaW1wb3J0LW1hcC5qc29uIjoie1xuICBcImltcG9ydHNcIjoge1xuICAgIFwidnVlXCI6IFwiaHR0cHM6Ly9zZmMudnVlanMub3JnL3Z1ZS5ydW50aW1lLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmRlZmluZVByb3BzKHtcbiAgbW9kZWxWYWx1ZToge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgfVxufSk7XG4gIFxuZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdDp2YWx1ZT1cIm1vZGVsVmFsdWVcIlxuICAgIEBpbnB1dD1cIiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsICRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0412 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 (App.vue) \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u043a\u043d\u043e\u043f\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 Form.vue \u0447\u0435\u0440\u0435\u0437 v-model:  <\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref } from 'vue'; import Form from '.\/Form.vue';  const msg = ref('Hello World!');  const change = () => {   msg.value = Math.random().toString(36).slice(2, 7); } &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;div>msg: {{ msg }}&lt;\/div>   &lt;div>     &lt;button @click=\"change\">       \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c     &lt;\/button>   &lt;\/div>   &lt;hr \/>   &lt;Form v-model=\"msg\" \/> &lt;\/template><\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 Form.vue \u0443\u043a\u0430\u0436\u0435\u043c props \u0438 emits:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref } from 'vue';  defineProps({   modelValue: {     type: String,   } });    defineEmits(['update:modelValue']); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    :value=\"modelValue\"     @input=\"$emit('update:modelValue', $event.target.value)\"   > &lt;\/template><\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c v-model \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445.<\/p>\n<h4>Writable computed<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c v-model \u043d\u0430 &lt;input> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>writable computed<\/strong> (get\/set).<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3QgbXNnID0gcmVmKCdIZWxsbyBXb3JsZCEnKTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBtc2cudmFsdWUgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbn1cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm1zZzoge3sgbXNnIH19PC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBAY2xpY2s9XCJjaGFuZ2VcIj5cbiAgICAgINCY0LfQvNC10L3QuNGC0YxcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8Rm9ybSB2LW1vZGVsPVwibXNnXCIgLz5cbjwvdGVtcGxhdGU+IiwiaW1wb3J0LW1hcC5qc29uIjoie1xuICBcImltcG9ydHNcIjoge1xuICAgIFwidnVlXCI6IFwiaHR0cHM6Ly9zZmMudnVlanMub3JnL3Z1ZS5ydW50aW1lLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQgfSBmcm9tICd2dWUnO1xuXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgbW9kZWxWYWx1ZToge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgfVxufSk7XG4gIFxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFsndXBkYXRlOm1vZGVsVmFsdWUnXSk7XG4gIFxuY29uc3QgbG9jYWxDb21wdXRlZCA9IGNvbXB1dGVkKHtcbiAgZ2V0KCkge1xuICAgIHJldHVybiBwcm9wcy5tb2RlbFZhbHVlO1xuICB9LFxuICBzZXQobmV3VmFsdWUpIHtcbiAgICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIG5ld1ZhbHVlKVxuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdHYtbW9kZWw9XCJsb2NhbENvbXB1dGVkXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>App.vue \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f, \u0430 \u0432\u043e\u0442 Form.vue \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed } from 'vue';  const props = defineProps({   modelValue: {     type: String,   } });    const emit = defineEmits(['update:modelValue']);    const localComputed = computed({   get() {     return props.modelValue;   },   set(newValue) {     emit('update:modelValue', newValue)   } }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"localComputed\"   > &lt;\/template><\/code><\/pre>\n<p>\u041c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0422\u043e \u0435\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 (App.vue), \u0442\u043e \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (Form.vue).<\/p>\n<p>\u0422\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 props \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e (\u0447\u0435\u0440\u0435\u0437 ref()) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c 2 watch.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3QgbXNnID0gcmVmKCdIZWxsbyBXb3JsZCEnKTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBtc2cudmFsdWUgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbn1cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm1zZzoge3sgbXNnIH19PC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBAY2xpY2s9XCJjaGFuZ2VcIj5cbiAgICAgINCY0LfQvNC10L3QuNGC0YxcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8Rm9ybSB2LW1vZGVsPVwibXNnXCIgLz5cbjwvdGVtcGxhdGU+IiwiaW1wb3J0LW1hcC5qc29uIjoie1xuICBcImltcG9ydHNcIjoge1xuICAgIFwidnVlXCI6IFwiaHR0cHM6Ly9zZmMudnVlanMub3JnL3Z1ZS5ydW50aW1lLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIHdhdGNoIH0gZnJvbSAndnVlJztcblxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIG1vZGVsVmFsdWU6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH1cbn0pO1xuICBcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0cyhbJ3VwZGF0ZTptb2RlbFZhbHVlJ10pO1xuICBcbmNvbnN0IGxvY2FsID0gcmVmKHByb3BzLm1vZGVsVmFsdWUpO1xuICBcbndhdGNoKGxvY2FsLCAobmV3VmFsdWUpID0+IHtcbiAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBuZXdWYWx1ZSk7XG59KTtcbiAgXG53YXRjaCgoKSA9PiBwcm9wcy5tb2RlbFZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgbG9jYWwudmFsdWUgPSBuZXdWYWx1ZTtcbn0pO1xuPC9zY3JpcHQ+XG5cbjx0ZW1wbGF0ZT5cbiAgPGgyPkZvcm08L2gyPlxuICA8aW5wdXQgXG4gIFx0di1tb2RlbD1cImxvY2FsXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c watchers \u0432 Form.vue:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: String,   } });    const emit = defineEmits(['update:modelValue']);    const local = ref(props.modelValue);    watch(local, (newValue) => {   emit('update:modelValue', newValue); });    watch(() => props.modelValue, (newValue) => {   local.value = newValue; }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"local\"   > &lt;\/template><\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u043c, \u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c. \u203c\ufe0f\u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 watchers, \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 callstack? \u0415\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e watch \u0441\u0440\u0430\u0432\u043d\u0438\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043d\u043e \u043d\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e. <\/p>\n<h4>Provide\/Inject<\/h4>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 provide\/inject \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0441 \u0447\u0435\u043c \u0432\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 &#8212; \u0441 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432 provider. \u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/vuejs.org\/guide\/components\/provide-inject.html\" rel=\"noopener noreferrer nofollow\"><u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/u><\/a>. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u044f \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b, \u043d\u043e \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c <strong>Symbol<\/strong>, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgcHJvdmlkZSB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgQ2hpbGQgZnJvbSAnLi9DaGlsZC52dWUnO1xuICBcbmNvbnN0IG1zZyA9IHJlZignSGVsbG8gV29ybGQhJyk7XG5jb25zdCB1cGRhdGVNc2cgPSAobmV3VmFsdWUpID0+IG1zZy52YWx1ZSA9IG5ld1ZhbHVlO1xucHJvdmlkZSgnbXNnS2V5Jywge1xuICBtc2csXG4gIHVwZGF0ZU1zZyxcbn0pO1xuPC9zY3JpcHQ+XG5cbjx0ZW1wbGF0ZT5cbiAgPGgxPnt7IG1zZyB9fTwvaDE+XG4gIDxDaGlsZCAvPlxuPC90ZW1wbGF0ZT4iLCJpbXBvcnQtbWFwLmpzb24iOiJ7XG4gIFwiaW1wb3J0c1wiOiB7XG4gICAgXCJ2dWVcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvdnVlLnJ1bnRpbWUuZXNtLWJyb3dzZXIuanNcIlxuICB9XG59IiwiQ2hpbGQudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCBDaGlsZERlZXAgZnJvbSAnLi9DaGlsZERlZXAudnVlJztcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxDaGlsZERlZXAgLz5cbjwvdGVtcGxhdGU+IiwiQ2hpbGREZWVwLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyBpbmplY3R9IGZyb20gJ3Z1ZSc7XG4gIFxuY29uc3QgeyBtc2csIHVwZGF0ZU1zZyB9ID0gaW5qZWN0KCdtc2dLZXknKTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxpbnB1dCA6dmFsdWU9XCJtc2dcIiBAaW5wdXQ9XCJ1cGRhdGVNc2coJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbjwvdGVtcGxhdGU+In0=\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref, provide } from 'vue'; import Child from '.\/Child.vue';    const msg = ref('Hello World!'); const updateMsg = (newValue) => msg.value = newValue; provide('msgKey', {   msg,   updateMsg, }); &lt;\/script>  &lt;template>   &lt;h1>{{ msg }}&lt;\/h1>   &lt;Child \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/Child.vue &lt;script setup> import ChildDeep from '.\/ChildDeep.vue'; &lt;\/script>  &lt;template>   &lt;ChildDeep \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/ ChildDeep.vue &lt;script setup> import { inject} from 'vue';    const { msg, updateMsg } = inject('msgKey'); &lt;\/script>  &lt;template>   &lt;input :value=\"msg\" @input=\"updateMsg($event.target.value)\"> &lt;\/template><\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Options Api \u0432\u043e Vue 3 \u0438\/\u0438\u043b\u0438 \u043d\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c provide\/inject, \u0442\u043e \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdD5cbmltcG9ydCBDaGlsZENvbXAgZnJvbSAnLi9DaGlsZENvbXAudnVlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiBcIkFwcFwiLFxuICBjb21wb25lbnRzOiB7XG4gICAgQ2hpbGRDb21wLFxuICB9LFxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7IGxpc3RJdGVtczogdGhpcy5pdGVtcyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IFtcbiAgICAgICAgeyBpZDogMSwgdGV4dDogXCJJdGVtIDFcIiB9LFxuICAgICAgICB7IGlkOiAyLCB0ZXh0OiBcIkl0ZW0gMlwiIH0sXG4gICAgICAgIHsgaWQ6IDMsIHRleHQ6IFwiSXRlbSAzXCIgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGFkZEl0ZW0oKSB7XG4gICAgICB0aGlzLml0ZW1zID0gW1xuICAgICAgICAuLi50aGlzLml0ZW1zLFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IERhdGUubm93KCksXG4gICAgICAgICAgdGV4dDogYE5ldyBpdGVtICR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8YnV0dG9uIEBjbGljaz1cImFkZEl0ZW1cIj5BZGQgaXRlbTwvYnV0dG9uPlxuICA8cHJlPnt7IGl0ZW1zIH19PC9wcmU+XG4gIDxociAvPlxuICA8Q2hpbGRDb21wIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiLFxuICAgIFwidnVlL3NlcnZlci1yZW5kZXJlclwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy9zZXJ2ZXItcmVuZGVyZXIuZXNtLWJyb3dzZXIuanNcIlxuICB9XG59IiwiQ2hpbGRDb21wLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2dWUnO1xuICBcbmNvbnN0IGl0ZW1zID0gaW5qZWN0KCdsaXN0SXRlbXMnKTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5DaGlsZCBjb21wb25lbnQ8L2gxPlxuICA8cHJlPnt7IGl0ZW1zIH19PC9wcmU+XG48L3RlbXBsYXRlPiJ9\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041d\u0435\u0442 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438!<\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script> import ChildComp from '.\/ChildComp.vue';  export default {   name: \"App\",   components: {     ChildComp,   },   provide() {     return { listItems: this.items }   },    data() {     return {       items: [         { id: 1, text: \"Item 1\" },         { id: 2, text: \"Item 2\" },         { id: 3, text: \"Item 3\" },       ],     };   },   methods: {     addItem() {       this.items = [         ...this.items,         {           id: Date.now(),           text: `New item ${Date.now()}`,         },       ];     },   }, }; &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;button @click=\"addItem\">Add item&lt;\/button>   &lt;pre>{{ items }}&lt;\/pre>   &lt;hr \/>   &lt;ChildComp \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/ ChildComp.vue &lt;script setup> import { inject } from 'vue';    const items = inject('listItems'); &lt;\/script>  &lt;template>   &lt;h1>Child component&lt;\/h1>   &lt;pre>{{ items }}&lt;\/pre> &lt;\/template><\/code><\/pre>\n<p>\u0412\u043d\u0435\u0441\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0430\u0432\u043a\u0438 \u0432 App.vue \u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgcHJvdmlkZSB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgQ2hpbGRDb21wIGZyb20gJy4vQ2hpbGRDb21wLnZ1ZSc7XG4gIFxuY29uc3QgaXRlbXMgPSByZWYoW1xuICB7IGlkOiAxLCB0ZXh0OiBcIkl0ZW0gMVwiIH0sXG4gIHsgaWQ6IDIsIHRleHQ6IFwiSXRlbSAyXCIgfSxcbiAgeyBpZDogMywgdGV4dDogXCJJdGVtIDNcIiB9LFxuXSk7XG5cbmZ1bmN0aW9uIGFkZEl0ZW0oKSB7XG4gIGl0ZW1zLnZhbHVlID0gW1xuICAgIC4uLml0ZW1zLnZhbHVlLFxuICAgIHtcbiAgICAgIGlkOiBEYXRlLm5vdygpLFxuICAgICAgdGV4dDogYE5ldyBpdGVtICR7RGF0ZS5ub3coKX1gLFxuICAgIH0sXG4gIF07XG59O1xuXG5wcm92aWRlKCdsaXN0SXRlbXMnLCBpdGVtcyk7XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGJ1dHRvbiBAY2xpY2s9XCJhZGRJdGVtXCI+QWRkIGl0ZW08L2J1dHRvbj5cbiAgPHByZT57eyBpdGVtcyB9fTwvcHJlPlxuICA8aHIgLz5cbiAgPENoaWxkQ29tcCAvPlxuPC90ZW1wbGF0ZT4iLCJpbXBvcnQtbWFwLmpzb24iOiJ7XG4gIFwiaW1wb3J0c1wiOiB7XG4gICAgXCJ2dWVcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvdnVlLnJ1bnRpbWUuZXNtLWJyb3dzZXIuanNcIixcbiAgICBcInZ1ZS9zZXJ2ZXItcmVuZGVyZXJcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvc2VydmVyLXJlbmRlcmVyLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkNoaWxkQ29tcC52dWUiOiI8c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAndnVlJztcbiAgXG5jb25zdCBpdGVtcyA9IGluamVjdCgnbGlzdEl0ZW1zJyk7XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+Q2hpbGQgY29tcG9uZW50PC9oMT5cbiAgPHByZT57eyBpdGVtcyB9fTwvcHJlPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref, provide } from 'vue'; import ChildComp from '.\/ChildComp.vue';    const items = ref([   { id: 1, text: \"Item 1\" },   { id: 2, text: \"Item 2\" },   { id: 3, text: \"Item 3\" }, ]);  function addItem() {   items.value = [     ...items.value,     {       id: Date.now(),       text: `New item ${Date.now()}`,     },   ]; };  provide('listItems', items); &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;button @click=\"addItem\">Add item&lt;\/button>   &lt;pre>{{ items }}&lt;\/pre>   &lt;hr \/>   &lt;ChildComp \/> &lt;\/template><\/code><\/pre>\n<p>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u0411\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0438\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0445.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0435, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 1 input, \u0430, \u0441\u043a\u0430\u0436\u0435\u043c, 10 \u0438\u043b\u0438 15. \u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u0438\u0445 Form.vue \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 2-3? \u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c 1, 2 ,5 ,10 v-model \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0443\u0436\u0430\u0441\u043d\u043e! \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 v-model.<\/p>\n<h3>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Props\/Emits (\u043e\u0431\u044a\u0435\u043a\u0442\u044b)<\/h3>\n<h4>\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0441 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443<\/h4>\n<p>\u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b, \u043d\u0430 \u0443\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0438\u0434\u0435\u044f \u0441 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 v-model. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcbiAgXG5jb25zdCBhcnIgPSByZWYoW1xuICB7IGlkOiAxLCBtc2c6ICdtc2cnIH0sXG4gIHsgaWQ6IDIsIG1zZzogJ21zZycgfSxcbl0pO1xuPC9zY3JpcHQ+XG5cbjx0ZW1wbGF0ZT5cbiAgPHByZT57eyBhcnIgfX08L3ByZT5cbiAgPEZvcm0gdi1mb3I9XCJpdGVtIG9mIGFyclwiIDprZXk9XCJpdGVtLmlkXCIgdi1tb2RlbDptc2dUZXh0PVwiaXRlbS5tc2dcIiAvPlxuPC90ZW1wbGF0ZT4iLCJpbXBvcnQtbWFwLmpzb24iOiJ7XG4gIFwiaW1wb3J0c1wiOiB7XG4gICAgXCJ2dWVcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvdnVlLnJ1bnRpbWUuZXNtLWJyb3dzZXIuanNcIlxuICB9XG59IiwiRm9ybS52dWUiOiI8c2NyaXB0IHNldHVwPlxuZGVmaW5lUHJvcHMoe1xuICBtc2dUZXh0OiBTdHJpbmcsXG59KTtcblxuZGVmaW5lRW1pdHMoWyd1cGRhdGU6bXNnVGV4dCddKTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxpbnB1dCA6dmFsdWU9XCJtc2dUZXh0XCIgQGlucHV0PVwiJGVtaXQoJ3VwZGF0ZTptc2dUZXh0JywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbjwvdGVtcGxhdGU+In0=\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref } from 'vue'; import Form from '.\/Form.vue';    const arr = ref([   { id: 1, msg: 'msg' },   { id: 2, msg: 'msg' }, ]); &lt;\/script>  &lt;template>   &lt;pre>{{ arr }}&lt;\/pre>   &lt;Form v-for=\"item of arr\" :key=\"item.id\" v-model:msgText=\"item.msg\" \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> defineProps({   msgText: String, });  defineEmits(['update:msgText']); &lt;\/script>  &lt;template>   &lt;pre>{{ arr }}&lt;\/pre>   &lt;input :value=\"msgText\" @input=\"$emit('update:msgText', $event.target.value)\"> &lt;\/template><\/code><\/pre>\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440. \u0415\u0433\u043e \u0446\u0435\u043b\u044c, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0432 v-model \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a \u0431\u044b \u043c\u044b \u043f\u0438\u043b\u0438\u043b\u0438 \u0441\u0443\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0438\u0434\u0438\u043c. \u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c v-model \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<h4>\u041f\u0440\u044f\u043c\u043e\u0439 props \u0438 emit<\/h4>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c v-model \u0441 Object \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u044f\u043c\u043e\u0439 props \u0438 emit (\u0441\u043c\u043e\u0442\u0440\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440). \u041e\u0434\u043d\u0430\u043a\u043e, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 template, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435, \u0430 \u0432 emit \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442. \u0420\u0435\u0448\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0443\u044e \u043a\u043b\u044e\u0447 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3Qgb2JqID0gcmVmKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBvYmoudmFsdWUubXNnID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGRpdj5vYmo6IHt7IG9iaiB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiXG4gIH1cbn0iLCJGb3JtLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcblxuY29uc3QgY2hhbmdlID0gKGtleSwgbmV3VmFsdWUpID0+IHtcbiAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB7IC4uLnByb3BzLm1vZGVsVmFsdWUsIFtrZXldOiBuZXdWYWx1ZSB9KTtcbn07XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDI+Rm9ybTwvaDI+XG4gIDxpbnB1dCBcbiAgXHQ6dmFsdWU9XCJtb2RlbFZhbHVlLm1zZ1wiXG4gICAgQGlucHV0PVwiY2hhbmdlKCdtc2cnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXG4gID5cbjwvdGVtcGxhdGU+In0=\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043c App.vue:<\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref } from 'vue'; import Form from '.\/Form.vue';  const obj = ref({ msg: 'Hello World!' });  const change = () => {   obj.value.msg = Math.random().toString(36).slice(2, 7); } &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;div>obj: {{ obj }}&lt;\/div>   &lt;div>     &lt;button @click=\"change\">       \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c     &lt;\/button>   &lt;\/div>   &lt;hr \/>   &lt;Form v-model=\"obj\" \/> &lt;\/template><\/code><\/pre>\n<p> \u0418\u0437\u043c\u0435\u043d\u0438\u043c Form.vue:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: Object,   } });    const emit = defineEmits(['update:modelValue']);  const change = (key, newValue) => {   emit('update:modelValue', { ...props.modelValue, [key]: newValue }); }; &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    :value=\"modelValue.msg\"     @input=\"change('msg', $event.target.value)\"   > &lt;\/template><\/code><\/pre>\n<p>\u0427\u0442\u043e-\u0442\u043e \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u0410\u0445 \u0434\u0430, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c v-model \u043d\u0430 &lt;input>! \u041c\u044b \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 writable computed. \u0421\u0442\u043e\u0438\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h4>Writable computed<\/h4>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041f\u043b\u043e\u0445\u043e\u0439 \u043a\u043e\u0434! \u041d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0443\u0432\u0438\u0434\u0435\u043d\u043d\u043e\u0435!<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3Qgb2JqID0gcmVmKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBvYmoudmFsdWUubXNnID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGRpdj5vYmo6IHt7IG9iaiB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiXG4gIH1cbn0iLCJGb3JtLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcblxuY29uc3QgbG9jYWxDb21wdXRlZCA9IGNvbXB1dGVkKHtcbiAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gcHJvcHMubW9kZWxWYWx1ZVxuICAgIH0sXG4gICAgc2V0KG5ld1ZhbHVlKSB7XG4gICAgICAgIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgbmV3VmFsdWUpO1xuICAgIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjx0ZW1wbGF0ZT5cbiAgPGgyPkZvcm08L2gyPlxuICA8aW5wdXQgXG4gIFx0di1tb2RlbD1cImxvY2FsQ29tcHV0ZWQubXNnXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043c Form.vue:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: Object,   } });    const emit = defineEmits(['update:modelValue']);  const localComputed = computed({   get() {         return props.modelValue     },     set(newValue) {         emit('update:modelValue', newValue);     } }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"localComputed.msg\"   > &lt;\/template><\/code><\/pre>\n<p> \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u2026 \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u0410 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c emit()\u2026  <\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ set(newValue) {   \/\/ emit('update:modelValue', newValue); } ~~~<\/code><\/pre>\n<p>\u042d\u0445, \u043e\u043d\u043e \u0438 \u0442\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u041c\u0430\u0433\u0438\u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0435\u0442. \u042d\u0442\u043e \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 JavaScript \u0441 c\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (Object). \u0422\u043e \u0435\u0441\u0442\u044c, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/p>\n<p>\u041f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c computed\u2026<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3Qgb2JqID0gcmVmKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBvYmoudmFsdWUubXNnID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGRpdj5vYmo6IHt7IG9iaiB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiXG4gIH1cbn0iLCJGb3JtLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcblxuY29uc3QgbG9jYWxDb21wdXRlZCA9IGNvbXB1dGVkKHtcbiAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gcHJvcHMubW9kZWxWYWx1ZS5tc2dcbiAgICB9LFxuICAgIHNldChuZXdWYWx1ZSkge1xuICAgICAgICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHsgLi4ucHJvcHMubW9kZWxWYWx1ZSwgbXNnOiBuZXdWYWx1ZSB9KTtcbiAgICB9XG59KTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdHYtbW9kZWw9XCJsb2NhbENvbXB1dGVkXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041a\u043e\u0434 \u043b\u0443\u0447\u0448\u0435, \u043d\u043e \u043f\u043b\u043e\u0445\u043e\u0439!<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: Object,   } });    const emit = defineEmits(['update:modelValue']);  const localComputed = computed({   get() {         return props.modelValue.msg     },     set(newValue) {         emit('update:modelValue', { ...props.modelValue, msg: newValue });     } }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"localComputed\"   > &lt;\/template><\/code><\/pre>\n<p>\u042d\u0432\u0440\u0438\u043a\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e.<\/p>\n<p>\u0425\u043e\u0442\u044f \u043a\u043e\u0434 \u0434\u0430\u043b\u0435\u043a \u043e\u0442 \u0438\u0434\u0435\u0430\u043b\u0430. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 2, 3, 5 \u0442\u0430\u043a\u0438\u0445 &lt;input> (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e), \u0433\u0434\u0435 \u043c\u044b \u043c\u0435\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435! \u041e\u043a, \u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c computed!<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ const localComputed = computed({   get() {         return props.modelValue.msg     },     set(newValue) {         emit('update:modelValue', { ...props.modelValue, msg: newValue });     } });  const localComputedTwo = computed({   get() {         return props.modelValue.msgTwo     },     set(newValue) {         emit('update:modelValue', { ...props.modelValue, msgTwo: newValue });     } }); ~~~<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043c\u0430\u043b\u043e \u0442\u043e\u0433\u043e, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c props \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u041d\u043e \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e 2 &lt;input>, \u0430 \u0434\u043b\u044f 10 \u043d\u0430\u043f\u0438\u0448\u0435\u043c 10 computed? \u0425\u043c, \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e, \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 App.vue, \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 ref(), \u0430 \u043d\u0435 reactive(). \u0421\u0442\u043e\u0438\u0442 \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 writable computed.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgcmVhY3RpdmUgfSBmcm9tICd2dWUnO1xuaW1wb3J0IEZvcm0gZnJvbSAnLi9Gb3JtLnZ1ZSc7XG5cbmNvbnN0IG9iaiA9IHJlYWN0aXZlKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBvYmoubXNnID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGRpdj5vYmo6IHt7IG9iaiB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiXG4gIH1cbn0iLCJGb3JtLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcblxuY29uc3QgbG9jYWxDb21wdXRlZCA9IGNvbXB1dGVkKHtcbiAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gcHJvcHMubW9kZWxWYWx1ZS5tc2dcbiAgICB9LFxuICAgIHNldChuZXdWYWx1ZSkge1xuICAgICAgICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHsgLi4ucHJvcHMubW9kZWxWYWx1ZSwgbXNnOiBuZXdWYWx1ZSB9KTtcbiAgICB9XG59KTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdHYtbW9kZWw9XCJsb2NhbENvbXB1dGVkXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 App.vue:<\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref, reactive } from 'vue'; import Form from '.\/Form.vue';  const obj = reactive({ msg: 'Hello World!' });  const change = () => {   obj.msg = Math.random().toString(36).slice(2, 7); } &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;div>obj: {{ obj }}&lt;\/div>   &lt;div>     &lt;button @click=\"change\">       \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c     &lt;\/button>   &lt;\/div>   &lt;hr \/>   &lt;Form v-model=\"obj\" \/> &lt;\/template><\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c. \u0412\u043e\u0442 \u043e\u0434\u043d\u043e \u0438\u0437 <strong>\u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439<\/strong> \u043c\u0435\u0436\u0434\u0443 <strong>ref<\/strong> \u0438 <strong>reactive<\/strong>. \u0425\u043e\u0442\u044f \u0438 \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>@update:model-value<\/code> \u0438 \u0447\u0435\u0440\u0435\u0437 Object.assign \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e obj. \u041c\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u043e\u0441\u0442 &#8212; \u0435\u0441\u043b\u0438 \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d Object, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0431\u0443\u0434\u0443 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c, \u0442\u043e ref, \u0438\u043d\u0430\u0447\u0435 reactive. \u0425\u043e\u0442\u044f \u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0433\u0434\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442 reactive \u0438\u0437-\u0437\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0431\u044b\u0442\u044c .value. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0438\u0437\u043b\u0438\u0448\u043d\u044e\u044e \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c.<\/p>\n<h3>Watch<\/h3>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043d\u0435 \u0441\u0430\u043c\u043e\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0441 writable computed. \u041d\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043d\u043e \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e input \u0432 \u043d\u0430\u0448\u0435\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0435.<\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c \u0438 \u043e\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0435\u0431\u0440\u044f\u043d\u043e\u0439 \u043f\u0443\u043b\u0435\u0439. \u041d\u043e \u043d\u0430\u0447\u043d\u0435\u043c \u043c\u044b \u0441 <strong>\u043f\u043b\u043e\u0445\u043e\u0439<\/strong> \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 computed \u0432\u0441\u0451 \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 reactive \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 props.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3Qgb2JqID0gcmVmKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBvYmoudmFsdWUubXNnID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGRpdj5vYmo6IHt7IG9iaiB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiXG4gIH1cbn0iLCJGb3JtLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcblxuY29uc3QgbG9jYWxPYmogPSByZWYocHJvcHMubW9kZWxWYWx1ZSk7IC8vIHRvUmVmKHByb3BzLCAnbW9kZWxWYWx1ZSk7XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDI+Rm9ybTwvaDI+XG4gIDxpbnB1dCBcbiAgXHR2LW1vZGVsPVwibG9jYWxPYmoubXNnXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041f\u043b\u043e\u0445\u043e\u0439 \u043a\u043e\u0434! \u041d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0443\u0432\u0438\u0434\u0435\u043d\u043d\u043e\u0435!<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: Object,   } });    const emit = defineEmits(['update:modelValue']);  const localObj = ref(props.modelValue); \/\/ toRef(props, 'modelValue'); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"localObj.msg\"   > &lt;\/template><\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u2026 \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c, \u043d\u043e \u043c\u044b \u0436\u0435 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c emit()?! \u0414\u0430 \u0438 vue\/eslint \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u201c\u0440\u0443\u0433\u0430\u0442\u044c\u0441\u044f\u201d \u043d\u0430 \u043c\u0443\u0442\u0430\u0446\u0438\u044e props. \u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e localObj \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u044f\u043c\u0430\u044f \u043c\u0443\u0442\u0430\u0446\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432!<\/p>\n<p><em>\u0421 toRef\/toRefs \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a \u0436\u0435<\/em>.<\/p>\n<p>\u0420\u0435\u0448\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u0438\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e\u0433\u043e &#8212; \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e\u0433\u043e.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3Qgb2JqID0gcmVmKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBvYmoudmFsdWUubXNnID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGRpdj5vYmo6IHt7IG9iaiB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiXG4gIH1cbn0iLCJGb3JtLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcblxuY29uc3QgbG9jYWxPYmogPSByZWYoeyAuLi5wcm9wcy5tb2RlbFZhbHVlIH0pO1xuXG53YXRjaChsb2NhbE9iai52YWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB7IC4uLm5ld1ZhbHVlfSk7XG59KTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdHYtbW9kZWw9XCJsb2NhbE9iai5tc2dcIlxuICA+XG48L3RlbXBsYXRlPiJ9\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: Object,   } });    const emit = defineEmits(['update:modelValue']);  const localObj = ref({ ...props.modelValue }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"localObj.msg\"   > &lt;\/template><\/code><\/pre>\n<p>\u042d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043b\u0438\u0448\u044c \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c watch \u0438 \u0432 \u043d\u0451\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c emit().<\/p>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041f\u043b\u043e\u0445\u043e\u0439 \u043a\u043e\u0434! \u041d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0443\u0432\u0438\u0434\u0435\u043d\u043d\u043e\u0435!<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ watch(localObj.value, (newValue) => {     emit('update:modelValue', newValue); }); ~~~<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e \u043e\u043d \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c? \u0425\u043e\u0440\u043e\u0448\u043e, \u044d\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f props.<\/p>\n<p>\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432 &lt;input>. \u0412 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c? \u0414\u0430, \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c.<\/p>\n<p>\u0421\u043d\u043e\u0432\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u2026 \u0418 \u043e\u043d\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u0438 \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c!<\/p>\n<p>\u0422\u0430\u043a, \u0441\u0442\u043e\u043f! \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e?! \u0414\u0430 \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u0430\u0448 watch \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u043b \u043f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 localObj \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u0435\u0433\u043e \u043d\u0430\u0432\u0435\u0440\u0445, \u0430 v-model \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435, \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &#8212; \u0441\u043a\u0440\u044b\u0442\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c.<\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u044f\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e.<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ watch(localObj.value, (newValue) => {     emit('update:modelValue', { ...newValue}); }); ~~~<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 emit \u0438 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u043c\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f props. \u041d\u0435\u0442 \u043d\u0435\u0442, \u0441\u0430\u043c props \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 emit(), \u043d\u043e \u0432\u043e\u0442 \u043c\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u043c. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430, script \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0441\u043e\u0437\u0434\u0430\u0432 \u043a\u043e\u043f\u0438\u044e \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u044d\u0442\u0443 \u043a\u043e\u043f\u0438\u044e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e localObj. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f props \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 localObj.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0439\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435, \u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 <strong>watch<\/strong>.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3Qgb2JqID0gcmVmKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBvYmoudmFsdWUubXNnID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGRpdj5vYmo6IHt7IG9iaiB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiXG4gIH1cbn0iLCJGb3JtLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcblxuY29uc3QgbG9jYWxPYmogPSByZWYoeyAuLi5wcm9wcy5tb2RlbFZhbHVlIH0pO1xuXG53YXRjaChsb2NhbE9iai52YWx1ZSwgKG5ld1ZhbHVlLCBvbGRhVmFsdWUpID0+IHtcbiAgY29uc29sZS5sb2cobmV3VmFsdWUgPT09IG9sZGFWYWx1ZSk7IC8vIHRydWVcbiAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB7IC4uLm5ld1ZhbHVlfSk7XG59KTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdHYtbW9kZWw9XCJsb2NhbE9iai5tc2dcIlxuICA+XG48L3RlbXBsYXRlPiJ9\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ watch(localObj.value, (newValue, oldaValue) => {   console.log(newValue === oldaValue); \/\/ true   emit('update:modelValue', { ...newValue}); }); ~~~<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 newValue \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e oldValue. \u041d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0440\u0430\u0432\u043d\u044b, \u0442\u043e \u043a\u0430\u043a \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 watch \u0431\u0435\u0437 \u043e\u043f\u0446\u0438\u0438 deep: true?<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432 watch \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ref(), \u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u044f\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u0431\u043b\u043e\u043a\u0435 template.<\/p>\n<p>\u041d\u0430\u0448\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f localObj \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 proxy (\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e reactive()). \u0415\u0441\u043b\u0438 \u0432 watch \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c localObj, \u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 proxy \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u043e \u0438 watch \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<pre><code class=\"javascript\">watch(localObj, (newValue, oldaValue) => {   \/\/ \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442   emit('update:modelValue', { ...newValue}); });<\/code><\/pre>\n<p>\u041d\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c localObj.value, \u0433\u0434\u0435 \u0442\u0430\u043a \u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e newValue === oldValue. \u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u0414\u0430 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 localObj.value \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 reactive \u043e\u0431\u044a\u0435\u043a\u0442 (proxy), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b watch \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e <strong>\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f<\/strong>!<\/p>\n<p>\u042d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435!<\/p>\n<pre><code class=\"javascript\">\/\/ ref -> reactive watch(localObj.value, (newValue, oldaValue) => {   console.log(newValue === oldaValue); \/\/ true   emit('update:modelValue', { ...newValue}); });  \/\/ ref deep watch(localObj, (newValue, oldaValue) => {   console.log(newValue === oldaValue); \/\/ true   emit('update:modelValue', { ...newValue}); }, { deep: true });  \/\/ function getter watch(() => localObj.value, (newValue, oldaValue) => {   console.log(newValue === oldaValue); \/\/ true   emit('update:modelValue', { ...newValue}); }, { deep: true });<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0431\u0443\u0434\u044c\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b, \u0435\u0441\u043b\u0438 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c localObj, \u0442\u043e \u0432 newValue \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0435\u0451 \u0440\u0435\u0448\u0438\u0442\u044c. \u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 v-model \u043d\u0430 &lt;input> \u0438 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u043d\u0430\u0448 watch \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 emit() \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f. \u041d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043b\u044f props. \u0412\u0435\u0434\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e\/\u0447\u0442\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442?! \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u0445 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 (\u0442\u043e\u0447\u043d\u0435\u0435 \u0441\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u0442, \u0430 \u0432\u043e\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f &#8212; \u043d\u0435\u0442).<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0443\u043c &#8212; \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c watch \u0434\u043b\u044f props.modelValue. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c?!<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3Qgb2JqID0gcmVmKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBvYmoudmFsdWUubXNnID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG59XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDE+QXBwPC9oMT5cbiAgPGRpdj5vYmo6IHt7IG9iaiB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiXG4gIH1cbn0iLCJGb3JtLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcblxuY29uc3QgbG9jYWxPYmogPSByZWYoeyAuLi5wcm9wcy5tb2RlbFZhbHVlIH0pO1xuXG53YXRjaCgoKSA9PiBsb2NhbE9iai52YWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgeyAuLi5uZXdWYWx1ZX0pO1xufSwgeyBkZWVwOiB0cnVlIH0pOyBcblxud2F0Y2goKCkgPT4gcHJvcHMubW9kZWxWYWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gIGxvY2FsT2JqLnZhbHVlID0geyAuLi5uZXdWYWx1ZSB9O1xufSwgeyBkZWVwOiB0cnVlIH0pO1xuPC9zY3JpcHQ+XG5cbjx0ZW1wbGF0ZT5cbiAgPGgyPkZvcm08L2gyPlxuICB7e3Byb3BzLm1vZGVsVmFsdWV9fSA8YnI+XG4gIHt7bG9jYWxPYmp9fSA8YnI+XG4gIDxpbnB1dCBcbiAgXHR2LW1vZGVsPVwibG9jYWxPYmoubXNnXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a props \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c (reactive), \u043d\u043e \u0441\u0430\u043c\u0438 \u043a\u043b\u044e\u0447\u0438 \u043d\u0435\u0442, \u043d\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 watch \u0444\u0443\u043d\u043a\u0446\u0438\u044e getter, \u0447\u0442\u043e\u0431\u044b watch \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ watch(() => props.modelValue, (newValue) => {   console.log('props.modelValue', newValue); }); ~~~<\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0438 \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e. \u0422\u0430\u043a\u0438\u043c watch \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u044c callstack. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c?  <\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ watch(() => props.modelValue, (newValue) => {   localObj.value = { ...newValue }; \/\/ \u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u043e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c }); ~~~<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c\u2026 \u041d\u043e \u043e\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u0434\u0430 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e <strong>\u043e\u0434\u0438\u043d \u0440\u0430\u0437! <\/strong>\u042d\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u043d\u043e? \u0414\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435. \u041f\u0435\u0440\u0432\u044b\u0439 watch \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442 \u0437\u0430 localObj.value, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043b \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u043c. \u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0432 \u0435\u0433\u043e, \u043c\u044b \u201c\u0441\u043b\u043e\u043c\u0430\u043b\u0438\u201d watch. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ watch(localObj.value, (newValue) => {     emit('update:modelValue', { ...newValue}); });  setTimeout(() => {   localObj.value = { msg: 'changed' }; }, 5000);  watch(() => props.modelValue, (newValue) => {   \/\/ localObj.value = { ...newValue }; }); ~~~<\/code><\/pre>\n<p>\u0418 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 getter<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: Object,   } });    const emit = defineEmits(['update:modelValue']);  const localObj = ref({ ...props.modelValue });  watch(() => localObj.value, (newValue) => {   emit('update:modelValue', { ...newValue}); }, { deep: true });   watch(() => props.modelValue, (newValue) => {   localObj.value = { ...newValue }; }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"localObj.msg\"   > &lt;\/template><\/code><\/pre>\n<p>\u0414\u0430! \u0412\u043e\u0442 \u043e\u043d\u0430! \u0414\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430!<\/p>\n<blockquote>\n<p>[Vue warn]: Maximum recursive updates exceeded in component &lt;Repl>. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u0438 \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435. \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435, \u0442\u043e \u043c\u044b \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 &lt;input>! \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0441\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0433\u043e props.modelValue, \u0430 \u043d\u0435 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c. \u0412\u043e\u0442 \u0442\u0430\u043a \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue ~~~ watch(() => props.modelValue, (newValue) => {   localObj.value = { ...newValue }; }, { deep: true }); ~~~<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e watch \u043c\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c watchEffect, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 &#8212; \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 callstack.<\/p>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u201c\u043a\u043e\u0441\u0442\u044b\u043b\u044c\u043d\u043e\u201d, \u043d\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438 \u043f\u0440\u044f\u043c\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 &#8212; \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e props, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c!<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3Qgb2JqID0gcmVmKHsgbXNnOiAnSGVsbG8gV29ybGQhJyB9KTtcbmNvbnN0IHVwZGF0ZWQgPSByZWYoZmFsc2UpO1xuICBcbmNvbnN0IGNoYW5nZSA9ICgpID0+IHtcbiAgb2JqLnZhbHVlLm1zZyA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpO1xuICB1cGRhdGVkLnZhbHVlID0gdHJ1ZTtcbn1cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm9iajoge3sgb2JqIH19PC9kaXY+XG4gIDxkaXY+dXBkYXRlZDoge3sgdXBkYXRlZCB9fTwvZGl2PlxuICA8ZGl2PlxuICAgIDxidXR0b24gQGNsaWNrPVwiY2hhbmdlXCI+XG4gICAgICDQmNC30LzQtdC90LjRgtGMXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8aHIgLz5cbiAgPEZvcm0gdi1tb2RlbD1cIm9ialwiIHYtbW9kZWw6bmVlZC11cGRhdGU9XCJ1cGRhdGVkXCIgLz5cbjwvdGVtcGxhdGU+IiwiaW1wb3J0LW1hcC5qc29uIjoie1xuICBcImltcG9ydHNcIjoge1xuICAgIFwidnVlXCI6IFwiaHR0cHM6Ly9zZmMudnVlanMub3JnL3Z1ZS5ydW50aW1lLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIHdhdGNoIH0gZnJvbSAndnVlJztcblxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIG1vZGVsVmFsdWU6IHtcbiAgICB0eXBlOiBPYmplY3QsXG4gIH0sXG4gIG5lZWRVcGRhdGU6IHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9XG59KTtcbiAgXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6bmVlZFVwZGF0ZSddKTtcblxuY29uc3QgbG9jYWxPYmogPSByZWYoeyAuLi5wcm9wcy5tb2RlbFZhbHVlIH0pO1xuXG53YXRjaCgoKSA9PiBsb2NhbE9iai52YWx1ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gIGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgeyAuLi5uZXdWYWx1ZX0pO1xufSwgeyBkZWVwOiB0cnVlIH0pOyBcblxud2F0Y2goKCkgPT4gcHJvcHMubmVlZFVwZGF0ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gIGlmIChuZXdWYWx1ZSkge1xuICAgIGVtaXQoJ3VwZGF0ZTpuZWVkVXBkYXRlJywgIW5ld1ZhbHVlKTtcbiAgXHRsb2NhbE9iai52YWx1ZSA9IHsgLi4ucHJvcHMubW9kZWxWYWx1ZSB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdHYtbW9kZWw9XCJsb2NhbE9iai5tc2dcIlxuICA+XG48L3RlbXBsYXRlPiJ9\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref } from 'vue'; import Form from '.\/Form.vue';  const obj = ref({ msg: 'Hello World!' }); const updated = ref(false);    const change = () => {   obj.value.msg = Math.random().toString(36).slice(2, 7);   updated.value = true; } &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;div>obj: {{ obj }}&lt;\/div>   &lt;div>updated: {{ updated }}&lt;\/div>   &lt;div>     &lt;button @click=\"change\">       \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c     &lt;\/button>   &lt;\/div>   &lt;hr \/>   &lt;Form v-model=\"obj\" v-model:need-update=\"updated\" \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: Object,   },   needUpdate: {     type: Boolean,   } });    const emit = defineEmits(['update:modelValue', 'update:needUpdate']);  const localObj = ref({ ...props.modelValue });  watch(() => localObj.value, (newValue) => {   emit('update:modelValue', { ...newValue}); }, { deep: true });   watch(() => props.needUpdate, (newValue) => {   if (newValue) {     emit('update:needUpdate', !newValue);   localObj.value = { ...props.modelValue };   } }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"localObj.msg\"   > &lt;\/template><\/code><\/pre>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0432\u0441\u0451 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0438\u0437\u044f\u0449\u043d\u043e \u0438 \u043f\u0440\u043e\u0441\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439! \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u043e \u0432\u0441\u0451 \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<h3>Composable \u043f\u043e\u0434\u0445\u043e\u0434<\/h3>\n<p>Vue 3 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043c\u043d\u043e\u0433\u043e\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u044b\u0445 mixins, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043d\u043e\u0441\u044f\u0442 \u043c\u043d\u043e\u0433\u043e \u201c\u0442\u0430\u0439\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0438\u201d \u0432 \u043d\u0430\u0448 \u043a\u043e\u0434 \u0438 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u044e\u0442 \u0435\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043b\u043e\u0433\u0438\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u043b\u043e\u043a\u0430\u0445!<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Composable \u0442\u044f\u043d\u0435\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c (<a href=\"https:\/\/vuejs.org\/guide\/reusability\/composables.html\" rel=\"noopener noreferrer nofollow\"><u>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/u><\/a>, <a href=\"https:\/\/vueschool.io\/articles\/vuejs-tutorials\/what-is-a-vue-js-composable\/\" rel=\"noopener noreferrer nofollow\"><u>VueSchool<\/u><\/a>). \u041c\u044b \u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0435\u0449\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437 ?.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0438\u0441\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0441 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435\u0441\u0435\u0442. \u0422\u0430\u043a\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u201c\u0432\u043d\u0435\u0448\u043d\u0438\u0445\u201d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u0421\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u201c\u0441\u043c\u044b\u0441\u043b\u043e\u0432\u043e\u0439\u201d \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435! \u042f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u0433, \u043f\u0440\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcbmltcG9ydCB7IG9iaiB9IGZyb20gJy4vQ29tcG9zYWJsZS5qcyc7XG5cbiAgXG5jb25zdCBjaGFuZ2UgPSAoKSA9PiB7XG4gIG9iai52YWx1ZS5tc2cgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbn1cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm9iajoge3sgb2JqIH19PC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBAY2xpY2s9XCJjaGFuZ2VcIj5cbiAgICAgINCY0LfQvNC10L3QuNGC0YxcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8Rm9ybSAvPlxuPC90ZW1wbGF0ZT4iLCJpbXBvcnQtbWFwLmpzb24iOiJ7XG4gIFwiaW1wb3J0c1wiOiB7XG4gICAgXCJ2dWVcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvdnVlLnJ1bnRpbWUuZXNtLWJyb3dzZXIuanNcIixcbiAgICBcInZ1ZS9zZXJ2ZXItcmVuZGVyZXJcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvc2VydmVyLXJlbmRlcmVyLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIHdhdGNoIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IG9iaiB9IGZyb20gJy4vQ29tcG9zYWJsZS5qcyc7XG48L3NjcmlwdD5cblxuPHRlbXBsYXRlPlxuICA8aDI+Rm9ybTwvaDI+XG4gIDxpbnB1dCBcbiAgXHR2LW1vZGVsPVwib2JqLm1zZ1wiXG4gID5cbjwvdGVtcGxhdGU+IiwiQ29tcG9zYWJsZS5qcyI6ImltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmV4cG9ydCBjb25zdCBvYmogPSByZWYoeyBtc2c6ICdIZWxsbyBXb3JsZCEnIH0pOyJ9\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"javascript\">\/\/ Composable.js import { ref } from 'vue';  export const obj = ref({ msg: 'Hello World!' });<\/code><\/pre>\n<p> \u0418\u0437\u043c\u0435\u043d\u0438\u043c App.vue:<\/p>\n<pre><code class=\"javascript\">&lt;script setup> import { ref } from 'vue'; import Form from '.\/Form.vue'; import { obj } from '.\/Composable.js';     const change = () => {   obj.value.msg = Math.random().toString(36).slice(2, 7); } &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;div>obj: {{ obj }}&lt;\/div>   &lt;div>     &lt;button @click=\"change\">       \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c     &lt;\/button>   &lt;\/div>   &lt;hr \/>   &lt;Form \/> &lt;\/template><\/code><\/pre>\n<p> \u0418\u0437\u043c\u0435\u043d\u0438\u043c Form.vue:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue'; import { obj } from '.\/Composable.js'; &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"obj.msg\"   > &lt;\/template> <\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 App.vue? \u0427\u0442\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c? \u0418\u043c\u043f\u043e\u0440\u0442 \u0447\u0435\u0433\u043e-\u0442\u043e, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Form.vue, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0442\u043e \u0437\u0430\u0432\u0438\u0441 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435.<\/p>\n<p>\u0421 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u043d\u0430\u043c \u043d\u0435\u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0430 \u0432\u043e\u0442 \u0441 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u043c \u0447\u0435\u0433\u043e-\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u201c\u043f\u043e\u043a\u043e\u043b\u0434\u043e\u0432\u0430\u0442\u044c\u201d.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcbmltcG9ydCB7IHVzZU9iakRhdGEgfSBmcm9tICcuL0NvbXBvc2FibGUuanMnO1xuXG5jb25zdCB7IG9iaiwgY2hhbmdlT2JqIH0gPSB1c2VPYmpEYXRhKCk7XG5cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm9iajoge3sgb2JqIH19PC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBAY2xpY2s9XCJjaGFuZ2VPYmpcIj5cbiAgICAgINCY0LfQvNC10L3QuNGC0YxcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8Rm9ybSAvPlxuPC90ZW1wbGF0ZT4iLCJpbXBvcnQtbWFwLmpzb24iOiJ7XG4gIFwiaW1wb3J0c1wiOiB7XG4gICAgXCJ2dWVcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvdnVlLnJ1bnRpbWUuZXNtLWJyb3dzZXIuanNcIixcbiAgICBcInZ1ZS9zZXJ2ZXItcmVuZGVyZXJcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvc2VydmVyLXJlbmRlcmVyLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIHdhdGNoIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IHVzZU9iakRhdGEgfSBmcm9tICcuL0NvbXBvc2FibGUuanMnO1xuXG5jb25zdCB7IG9iaiB9ID0gdXNlT2JqRGF0YSgpO1xuPC9zY3JpcHQ+XG5cbjx0ZW1wbGF0ZT5cbiAgPGgyPkZvcm08L2gyPlxuICA8aW5wdXQgdi1tb2RlbD1cIm9iai5tc2dcIj5cbjwvdGVtcGxhdGU+IiwiQ29tcG9zYWJsZS5qcyI6ImltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmNvbnN0IG9iaiA9IHJlZih7IG1zZzogJ0hlbGxvIFdvcmxkIScgfSk7XG5cbmV4cG9ydCBjb25zdCB1c2VPYmpEYXRhID0gKCkgPT4ge1xuICBjb25zdCBjaGFuZ2VPYmogPSAoKSA9PiB7XG4gICAgb2JqLnZhbHVlLm1zZyA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDcpO1xuICB9XG4gIFxuICByZXR1cm4ge1xuICAgIG9iaixcbiAgICBjaGFuZ2VPYmosXG4gIH1cbn07In0=\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<pre><code class=\"javascript\">\/\/ Composable.js import { ref } from 'vue';  const obj = ref({ msg: 'Hello World!' });  export const useObjData = () => {   const changeObj = () => {     obj.value.msg = Math.random().toString(36).slice(2, 7);   }      return {     obj,     changeObj,   } };<\/code><\/pre>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref } from 'vue'; import Form from '.\/Form.vue'; import { useObjData } from '.\/Composable.js';  const { obj, changeObj } = useObjData();  &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;div>obj: {{ obj }}&lt;\/div>   &lt;div>     &lt;button @click=\"changeObj\">       \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c     &lt;\/button>   &lt;\/div>   &lt;hr \/>   &lt;Form \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue'; import { useObjData } from '.\/Composable.js';  const { obj } = useObjData(); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input v-model=\"obj.msg\"> &lt;\/template><\/code><\/pre>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043c\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c! \u0410 React-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0443\u0432\u0438\u0434\u044f\u0442 \u0437\u0434\u0435\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0435.<\/p>\n<h3>\u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438<\/h3>\n<p>\u041d\u0438 \u043e\u0434\u0438\u043d \u043f\u043e\u0445\u043e\u0434 <strong>\u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f<\/strong> \u0441\u0435\u0440\u0435\u0431\u0440\u044f\u043d\u043e\u0439 \u043f\u0443\u043b\u0435\u0439! \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 Vuex\/Pinia \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u0434\u0430\u0447\u0438. \u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443, \u0432\u044b\u043d\u043e\u0441\u044f \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0432 utils.js, Vuex\/Pinia \u0438\u043b\u0438 composable (use\u2026 \u0444\u0443\u043d\u043a\u0446\u0438\u0438).<\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u201c\u043a\u043e\u0432\u044b\u0440\u044f\u043b\u0441\u044f\u201d, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 <a href=\"https:\/\/github.com\/quasarframework\/quasar\" rel=\"noopener noreferrer nofollow\"><u>Quasar<\/u><\/a> \u0438 <a href=\"https:\/\/github.com\/vuetifyjs\/vuetify\/tree\/next\" rel=\"noopener noreferrer nofollow\"><u>Vuetify<\/u><\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/668072\/\"> https:\/\/habr.com\/ru\/post\/668072\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p> Vue 3 \u043f\u0440\u0438\u043d\u0451\u0441 \u0432 \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u044f \u0441\u0442\u0430\u043b \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0430 \u043f\u043e\u0440\u043e\u0439 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0446\u0435\u043b\u044b\u0439 \u0437\u043e\u043e\u043f\u0430\u0440\u043a \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u043e\u0441\u0442\u0438, \u043b\u0438\u0431\u043e \u0432\u0441\u0451 \u0432 state manager, \u043b\u0438\u0431\u043e \u0432 composable (composition API), \u043b\u0438\u0431\u043e <strong>\u043c\u0443\u0442\u0430\u0446\u0438\u044f props \u0432\u043d\u0443\u0442\u0440\u0438<\/strong> \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432!<\/p>\n<p>\u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043d\u0430\u043c \u0432\u043e Vue 3.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h3>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044f \u0442\u0432\u0435\u0440\u0434\u043e \u0443\u0431\u0435\u0436\u0434\u0451\u043d, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0438\u0436\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u0435\u0440\u0435\u0431\u0440\u044f\u043d\u043e\u0439 \u043f\u0443\u043b\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u0435\u0442 \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0426\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u0438\u043c\u044b\u0445 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0438\u0437 \u0441\u0435\u0431\u044f \u043d\u0435\u043a\u0438\u0439 \u0447\u0435\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0447\u0442\u043e-\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u043c \u043e \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445!<\/p>\n<p>\u0421\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e:<\/p>\n<ol>\n<li>\n<p>props\/emits<\/p>\n<\/li>\n<li>\n<p>provide\/inject<\/p>\n<\/li>\n<li>\n<p>composable (composition API)<\/p>\n<\/li>\n<li>\n<p>state manager (Vuex\/Pinia)<\/p>\n<\/li>\n<\/ol>\n<p><strong>props\/emits<\/strong> &#8212; \u043f\u0440\u044f\u043c\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438! \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 (\u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438).<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u0435\u043d \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (\u201c<a href=\"https:\/\/vuejs.org\/guide\/components\/provide-inject.html#prop-drilling\" rel=\"noopener noreferrer nofollow\"><u>props drilling<\/u><\/a>\u201d) \u0438 \u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u043d\u0435\u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445.<\/p>\n<p><strong>provide\/inject<\/strong> &#8212; \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u201c<a href=\"https:\/\/vuejs.org\/guide\/components\/provide-inject.html#prop-drilling\" rel=\"noopener noreferrer nofollow\"><u>props drilling<\/u><\/a>\u201d \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\/\u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432\/\u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f, \u043a\u0442\u043e \u0438\u0437 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a \u0436\u0435 \u201c\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u201d \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443.<\/p>\n<p><strong>composable<\/strong> &#8212; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a \u0436\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u201c\u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u0430\u201d \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438 \u201c\u0441\u043e\u0431\u043b\u0430\u0437\u043d\u0438\u0442\u044c\u0441\u044f\u201d \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0432 composable \u0444\u0430\u0439\u043b\u044b.<\/p>\n<p><strong>Vuex\/Pinia<\/strong> &#8212; \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u0441 composable. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0443\u0436 \u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043b\u044e\u0431\u0430\u044f \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0441 \u0441\u043e\u0431\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u0442\u044c \u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u044c (\u043f\u043e\u043a\u0430) \u0442\u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0441\u043c\u044b\u0441\u043be \u0438 \u0447\u0442\u043e-\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043c\u0435\u043d\u044f\u044e\u0442, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u0441 \u043f\u0440\u044f\u043c\u043e\u0439 \u0441\u0432\u044f\u0437\u044c\u044e \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438.  <\/p>\n<p>\u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u0432\u0441\u0435 \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043c\u043e\u0451 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0441\u043f\u043e\u0440\u0438\u043c\u043e\u0439 \u0438\u0441\u0442\u0438\u043d\u043e\u0439. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043d\u0435\u043e\u0441\u043f\u043e\u0440\u0438\u043c\u044b\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u0435 \u043e\u0442\u0447\u0435\u0442 \u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432.  <\/p>\n<h3>\u0421 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435.<\/h3>\n<p><strong>props\/emits <\/strong>&#8212; \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c (\u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c) props \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439-\u0442\u043e props \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u043d \u043e\u0431 \u044d\u0442\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f emit(). \u0414\u0430 \u201c<a href=\"https:\/\/vuejs.org\/guide\/components\/provide-inject.html#prop-drilling\" rel=\"noopener noreferrer nofollow\"><u>props drilling<\/u><\/a>\u201d \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e.   <\/p>\n<figure class=\"full-width\"><figcaption>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Props\/Emits<\/figcaption><\/figure>\n<p><strong>provide\/inject<\/strong> &#8212; \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<figure class=\"full-width\"><figcaption>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Provide\/Inject<\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 props\/emits \u0434\u0430\u043d\u043d\u044b\u0435 <strong>\u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435<\/strong>! \u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u0447\u0435\u0440\u0435\u0437 provide \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.  <\/p>\n<p><strong>Vuex\/Pinia<\/strong> (state managers).<\/p>\n<figure class=\"full-width\"><figcaption>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia<\/figcaption><\/figure>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0445\u0440\u0430\u043d\u0438\u0442\u044c <strong>\u0432\u0441\u0451<\/strong> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 state manager &#8212; \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0432\u0441\u0451, \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u0435\u043c, \u0432\u044b\u043d\u043e\u0441\u0438\u043c. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439\/\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u201c\u0447\u0442\u043e-\u0442\u043e\u201d \u0442\u0440\u0435\u0442\u044c\u0435, \u0438\u043c\u0435\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u044d\u0442\u043e\u043c \u201c\u0447\u0451\u043c-\u0442\u043e\u201d. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e, \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u044d\u0442\u043e\u043c \u201c\u0447\u0435\u043c-\u0442\u043e\u201d, \u0430 \u0432 \u0434\u043e\u0431\u0430\u0432\u043e\u043a \u043d\u0430\u0447\u043d\u0443\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b <strong>\u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e<\/strong>.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0435\u0431\u044f \u044f \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u0447\u0442\u043e \u0432 state manager \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438. \u041e\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 Props\/Emits \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<figure class=\"full-width\"><figcaption>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Vuex\/Pinia + Props\/Emits<\/figcaption><\/figure>\n<p>\u0410 \u0447\u0442\u043e \u0436\u0435 \u0441 <strong>Composable ( Composition API)<\/strong>? \u041f\u043e\u0434\u0445\u043e\u0434 \u0441 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 use\u2026 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Vuex\/Pinia.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430, \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043d\u043e. <strong>Vuex\/Pinia<\/strong> &#8212; \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Vuex\/Pinia \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c. \u0421 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 Composable \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u0422\u043e \u0435\u0441\u0442\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0432\u0430\u0448\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e, \u0441\u0445\u0435\u043c\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u043e\u0439, \u0447\u0442\u043e \u0432\u044b\u0448\u0435. <s>\u0414\u0430 \u0438 \u043f\u043e\u043b\u0435\u043d\u0438\u043b\u0441\u044f \u044f \u0435\u0451 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c.<\/s><\/p>\n<h3>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Props\/Emits (\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b)  <\/h3>\n<h4>\u041f\u0440\u044f\u043c\u043e\u0439 props \u0438 emits<\/h4>\n<p>\u0421\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u044d\u0442\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 v-model. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043d\u0438\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0447\u0435\u0440\u0435\u0437 v-model.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3QgbXNnID0gcmVmKCdIZWxsbyBXb3JsZCEnKTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBtc2cudmFsdWUgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbn1cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm1zZzoge3sgbXNnIH19PC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBAY2xpY2s9XCJjaGFuZ2VcIj5cbiAgICAgINCY0LfQvNC10L3QuNGC0YxcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8Rm9ybSB2LW1vZGVsPVwibXNnXCIgLz5cbjwvdGVtcGxhdGU+IiwiaW1wb3J0LW1hcC5qc29uIjoie1xuICBcImltcG9ydHNcIjoge1xuICAgIFwidnVlXCI6IFwiaHR0cHM6Ly9zZmMudnVlanMub3JnL3Z1ZS5ydW50aW1lLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmRlZmluZVByb3BzKHtcbiAgbW9kZWxWYWx1ZToge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgfVxufSk7XG4gIFxuZGVmaW5lRW1pdHMoWyd1cGRhdGU6bW9kZWxWYWx1ZSddKTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdDp2YWx1ZT1cIm1vZGVsVmFsdWVcIlxuICAgIEBpbnB1dD1cIiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsICRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0412 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 (App.vue) \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u043a\u043d\u043e\u043f\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 Form.vue \u0447\u0435\u0440\u0435\u0437 v-model:  <\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref } from 'vue'; import Form from '.\/Form.vue';  const msg = ref('Hello World!');  const change = () => {   msg.value = Math.random().toString(36).slice(2, 7); } &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;div>msg: {{ msg }}&lt;\/div>   &lt;div>     &lt;button @click=\"change\">       \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c     &lt;\/button>   &lt;\/div>   &lt;hr \/>   &lt;Form v-model=\"msg\" \/> &lt;\/template><\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 Form.vue \u0443\u043a\u0430\u0436\u0435\u043c props \u0438 emits:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref } from 'vue';  defineProps({   modelValue: {     type: String,   } });    defineEmits(['update:modelValue']); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    :value=\"modelValue\"     @input=\"$emit('update:modelValue', $event.target.value)\"   > &lt;\/template><\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c v-model \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445.<\/p>\n<h4>Writable computed<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c v-model \u043d\u0430 &lt;input> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>writable computed<\/strong> (get\/set).<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3QgbXNnID0gcmVmKCdIZWxsbyBXb3JsZCEnKTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBtc2cudmFsdWUgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbn1cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm1zZzoge3sgbXNnIH19PC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBAY2xpY2s9XCJjaGFuZ2VcIj5cbiAgICAgINCY0LfQvNC10L3QuNGC0YxcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8Rm9ybSB2LW1vZGVsPVwibXNnXCIgLz5cbjwvdGVtcGxhdGU+IiwiaW1wb3J0LW1hcC5qc29uIjoie1xuICBcImltcG9ydHNcIjoge1xuICAgIFwidnVlXCI6IFwiaHR0cHM6Ly9zZmMudnVlanMub3JnL3Z1ZS5ydW50aW1lLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQgfSBmcm9tICd2dWUnO1xuXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgbW9kZWxWYWx1ZToge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgfVxufSk7XG4gIFxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFsndXBkYXRlOm1vZGVsVmFsdWUnXSk7XG4gIFxuY29uc3QgbG9jYWxDb21wdXRlZCA9IGNvbXB1dGVkKHtcbiAgZ2V0KCkge1xuICAgIHJldHVybiBwcm9wcy5tb2RlbFZhbHVlO1xuICB9LFxuICBzZXQobmV3VmFsdWUpIHtcbiAgICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIG5ld1ZhbHVlKVxuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMj5Gb3JtPC9oMj5cbiAgPGlucHV0IFxuICBcdHYtbW9kZWw9XCJsb2NhbENvbXB1dGVkXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>App.vue \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f, \u0430 \u0432\u043e\u0442 Form.vue \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed } from 'vue';  const props = defineProps({   modelValue: {     type: String,   } });    const emit = defineEmits(['update:modelValue']);    const localComputed = computed({   get() {     return props.modelValue;   },   set(newValue) {     emit('update:modelValue', newValue)   } }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"localComputed\"   > &lt;\/template><\/code><\/pre>\n<p>\u041c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0422\u043e \u0435\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 (App.vue), \u0442\u043e \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (Form.vue).<\/p>\n<p>\u0422\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 props \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e (\u0447\u0435\u0440\u0435\u0437 ref()) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c 2 watch.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgRm9ybSBmcm9tICcuL0Zvcm0udnVlJztcblxuY29uc3QgbXNnID0gcmVmKCdIZWxsbyBXb3JsZCEnKTtcblxuY29uc3QgY2hhbmdlID0gKCkgPT4ge1xuICBtc2cudmFsdWUgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbn1cbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8ZGl2Pm1zZzoge3sgbXNnIH19PC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBAY2xpY2s9XCJjaGFuZ2VcIj5cbiAgICAgINCY0LfQvNC10L3QuNGC0YxcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8Rm9ybSB2LW1vZGVsPVwibXNnXCIgLz5cbjwvdGVtcGxhdGU+IiwiaW1wb3J0LW1hcC5qc29uIjoie1xuICBcImltcG9ydHNcIjoge1xuICAgIFwidnVlXCI6IFwiaHR0cHM6Ly9zZmMudnVlanMub3JnL3Z1ZS5ydW50aW1lLmVzbS1icm93c2VyLmpzXCJcbiAgfVxufSIsIkZvcm0udnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIHdhdGNoIH0gZnJvbSAndnVlJztcblxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIG1vZGVsVmFsdWU6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH1cbn0pO1xuICBcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0cyhbJ3VwZGF0ZTptb2RlbFZhbHVlJ10pO1xuICBcbmNvbnN0IGxvY2FsID0gcmVmKHByb3BzLm1vZGVsVmFsdWUpO1xuICBcbndhdGNoKGxvY2FsLCAobmV3VmFsdWUpID0+IHtcbiAgZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBuZXdWYWx1ZSk7XG59KTtcbiAgXG53YXRjaCgoKSA9PiBwcm9wcy5tb2RlbFZhbHVlLCAobmV3VmFsdWUpID0+IHtcbiAgbG9jYWwudmFsdWUgPSBuZXdWYWx1ZTtcbn0pO1xuPC9zY3JpcHQ+XG5cbjx0ZW1wbGF0ZT5cbiAgPGgyPkZvcm08L2gyPlxuICA8aW5wdXQgXG4gIFx0di1tb2RlbD1cImxvY2FsXCJcbiAgPlxuPC90ZW1wbGF0ZT4ifQ==\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c watchers \u0432 Form.vue:<\/p>\n<pre><code class=\"javascript\">\/\/ Form.vue &lt;script setup> import { ref, computed, watch } from 'vue';  const props = defineProps({   modelValue: {     type: String,   } });    const emit = defineEmits(['update:modelValue']);    const local = ref(props.modelValue);    watch(local, (newValue) => {   emit('update:modelValue', newValue); });    watch(() => props.modelValue, (newValue) => {   local.value = newValue; }); &lt;\/script>  &lt;template>   &lt;h2>Form&lt;\/h2>   &lt;input    v-model=\"local\"   > &lt;\/template><\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u043c, \u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c. \u203c\ufe0f\u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 watchers, \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 callstack? \u0415\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e watch \u0441\u0440\u0430\u0432\u043d\u0438\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043d\u043e \u043d\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e. <\/p>\n<h4>Provide\/Inject<\/h4>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 provide\/inject \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0441 \u0447\u0435\u043c \u0432\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 &#8212; \u0441 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432 provider. \u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/vuejs.org\/guide\/components\/provide-inject.html\" rel=\"noopener noreferrer nofollow\"><u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/u><\/a>. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u044f \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b, \u043d\u043e \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c <strong>Symbol<\/strong>, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiwgcHJvdmlkZSB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgQ2hpbGQgZnJvbSAnLi9DaGlsZC52dWUnO1xuICBcbmNvbnN0IG1zZyA9IHJlZignSGVsbG8gV29ybGQhJyk7XG5jb25zdCB1cGRhdGVNc2cgPSAobmV3VmFsdWUpID0+IG1zZy52YWx1ZSA9IG5ld1ZhbHVlO1xucHJvdmlkZSgnbXNnS2V5Jywge1xuICBtc2csXG4gIHVwZGF0ZU1zZyxcbn0pO1xuPC9zY3JpcHQ+XG5cbjx0ZW1wbGF0ZT5cbiAgPGgxPnt7IG1zZyB9fTwvaDE+XG4gIDxDaGlsZCAvPlxuPC90ZW1wbGF0ZT4iLCJpbXBvcnQtbWFwLmpzb24iOiJ7XG4gIFwiaW1wb3J0c1wiOiB7XG4gICAgXCJ2dWVcIjogXCJodHRwczovL3NmYy52dWVqcy5vcmcvdnVlLnJ1bnRpbWUuZXNtLWJyb3dzZXIuanNcIlxuICB9XG59IiwiQ2hpbGQudnVlIjoiPHNjcmlwdCBzZXR1cD5cbmltcG9ydCBDaGlsZERlZXAgZnJvbSAnLi9DaGlsZERlZXAudnVlJztcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxDaGlsZERlZXAgLz5cbjwvdGVtcGxhdGU+IiwiQ2hpbGREZWVwLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyBpbmplY3R9IGZyb20gJ3Z1ZSc7XG4gIFxuY29uc3QgeyBtc2csIHVwZGF0ZU1zZyB9ID0gaW5qZWN0KCdtc2dLZXknKTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxpbnB1dCA6dmFsdWU9XCJtc2dcIiBAaW5wdXQ9XCJ1cGRhdGVNc2coJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbjwvdGVtcGxhdGU+In0=\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script setup> import { ref, provide } from 'vue'; import Child from '.\/Child.vue';    const msg = ref('Hello World!'); const updateMsg = (newValue) => msg.value = newValue; provide('msgKey', {   msg,   updateMsg, }); &lt;\/script>  &lt;template>   &lt;h1>{{ msg }}&lt;\/h1>   &lt;Child \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/Child.vue &lt;script setup> import ChildDeep from '.\/ChildDeep.vue'; &lt;\/script>  &lt;template>   &lt;ChildDeep \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/ ChildDeep.vue &lt;script setup> import { inject} from 'vue';    const { msg, updateMsg } = inject('msgKey'); &lt;\/script>  &lt;template>   &lt;input :value=\"msg\" @input=\"updateMsg($event.target.value)\"> &lt;\/template><\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Options Api \u0432\u043e Vue 3 \u0438\/\u0438\u043b\u0438 \u043d\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c provide\/inject, \u0442\u043e \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432.<\/p>\n<p><a href=\"https:\/\/sfc.vuejs.org\/#eyJBcHAudnVlIjoiPHNjcmlwdD5cbmltcG9ydCBDaGlsZENvbXAgZnJvbSAnLi9DaGlsZENvbXAudnVlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiBcIkFwcFwiLFxuICBjb21wb25lbnRzOiB7XG4gICAgQ2hpbGRDb21wLFxuICB9LFxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7IGxpc3RJdGVtczogdGhpcy5pdGVtcyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IFtcbiAgICAgICAgeyBpZDogMSwgdGV4dDogXCJJdGVtIDFcIiB9LFxuICAgICAgICB7IGlkOiAyLCB0ZXh0OiBcIkl0ZW0gMlwiIH0sXG4gICAgICAgIHsgaWQ6IDMsIHRleHQ6IFwiSXRlbSAzXCIgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGFkZEl0ZW0oKSB7XG4gICAgICB0aGlzLml0ZW1zID0gW1xuICAgICAgICAuLi50aGlzLml0ZW1zLFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IERhdGUubm93KCksXG4gICAgICAgICAgdGV4dDogYE5ldyBpdGVtICR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5BcHA8L2gxPlxuICA8YnV0dG9uIEBjbGljaz1cImFkZEl0ZW1cIj5BZGQgaXRlbTwvYnV0dG9uPlxuICA8cHJlPnt7IGl0ZW1zIH19PC9wcmU+XG4gIDxociAvPlxuICA8Q2hpbGRDb21wIC8+XG48L3RlbXBsYXRlPiIsImltcG9ydC1tYXAuanNvbiI6IntcbiAgXCJpbXBvcnRzXCI6IHtcbiAgICBcInZ1ZVwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy92dWUucnVudGltZS5lc20tYnJvd3Nlci5qc1wiLFxuICAgIFwidnVlL3NlcnZlci1yZW5kZXJlclwiOiBcImh0dHBzOi8vc2ZjLnZ1ZWpzLm9yZy9zZXJ2ZXItcmVuZGVyZXIuZXNtLWJyb3dzZXIuanNcIlxuICB9XG59IiwiQ2hpbGRDb21wLnZ1ZSI6IjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2dWUnO1xuICBcbmNvbnN0IGl0ZW1zID0gaW5qZWN0KCdsaXN0SXRlbXMnKTtcbjwvc2NyaXB0PlxuXG48dGVtcGxhdGU+XG4gIDxoMT5DaGlsZCBjb21wb25lbnQ8L2gxPlxuICA8cHJlPnt7IGl0ZW1zIH19PC9wcmU+XG48L3RlbXBsYXRlPiJ9\" rel=\"noopener noreferrer nofollow\"><u>\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430<\/u><\/a><\/p>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041d\u0435\u0442 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438!<\/p>\n<pre><code class=\"javascript\">\/\/ App.vue &lt;script> import ChildComp from '.\/ChildComp.vue';  export default {   name: \"App\",   components: {     ChildComp,   },   provide() {     return { listItems: this.items }   },    data() {     return {       items: [         { id: 1, text: \"Item 1\" },         { id: 2, text: \"Item 2\" },         { id: 3, text: \"Item 3\" },       ],     };   },   methods: {     addItem() {       this.items = [         ...this.items,         {           id: Date.now(),           text: `New item ${Date.now()}`,         },       ];     },   }, }; &lt;\/script>  &lt;template>   &lt;h1>App&lt;\/h1>   &lt;button @click=\"addItem\">Add item&lt;\/button>   &lt;pre>{{ items }}&lt;\/pre>   &lt;hr \/>   &lt;ChildComp \/> &lt;\/template><\/code><\/pre>\n<pre><code class=\"javascript\">\/\/ ChildComp.vue &lt;script setup> import { inject } from 'vue';    const items = inject('listItems'); &lt;\/script>  &lt;template>   &lt;h1>Child component&lt;\/h1>   &lt;pre>{{<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-333696","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/333696","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=333696"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/333696\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=333696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=333696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=333696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}