{"id":197,"date":"2021-09-24T07:36:00","date_gmt":"2021-09-24T07:36:00","guid":{"rendered":"https:\/\/webdevs.blog\/pl\/?p=197"},"modified":"2026-02-20T07:28:18","modified_gmt":"2026-02-20T07:28:18","slug":"dziedziczenie-atrybutow-w-vue-js","status":"publish","type":"post","link":"https:\/\/webdevs.blog\/pl\/dziedziczenie-atrybutow-w-vue-js\/","title":{"rendered":"Dziedziczenie atrybut\u00f3w w Vue.js"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"720\" src=\"https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2021\/09\/Projekt-bez-tytulu-1_Easy-Resize.com-1.jpg\" alt=\"\" class=\"wp-image-199\" srcset=\"https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2021\/09\/Projekt-bez-tytulu-1_Easy-Resize.com-1.jpg 1280w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2021\/09\/Projekt-bez-tytulu-1_Easy-Resize.com-1-300x169.jpg 300w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2021\/09\/Projekt-bez-tytulu-1_Easy-Resize.com-1-1024x576.jpg 1024w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2021\/09\/Projekt-bez-tytulu-1_Easy-Resize.com-1-768x432.jpg 768w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2021\/09\/Projekt-bez-tytulu-1_Easy-Resize.com-1-640x360.jpg 640w, https:\/\/webdevs.blog\/pl\/wp-content\/uploads\/sites\/2\/2021\/09\/Projekt-bez-tytulu-1_Easy-Resize.com-1-700x394.jpg 700w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n\n\n\n<p>Podczas tworzenia aplikacji przy u\u017cyciu Vue.js (oraz podobnych framework\u00f3w), bardzo prawdopodone, \u017ce zajdzie potrzeba stworzenia komponentu pola wej\u015bciowego. W trakcie rozwoju projektu, mo\u017ce si\u0119 okaza\u0107 \u017ce pole mo\u017ce przybiera\u0107 r\u00f3\u017cne formy, np. pole z podpowiedzi\u0105, etykiet\u0105, prefiksem, sufiksem, ikon\u0105, wiadomo\u015bci\u0105 o walidacji itp.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/webdevs.blog\/wp-content\/uploads\/2021\/09\/text-inputs.svg\" alt=\"\" class=\"wp-image-322\"\/><figcaption class=\"wp-element-caption\">R\u00f3\u017cne typy p\u00f3l wej\u015bciowych<\/figcaption><\/figure>\n\n\n\n<p>Z punktu widzenia kodu <kbd>HTML<\/kbd>, sam element pola nie wystarczy, aby zbudowa\u0107 widoczne na przyk\u0142adzie uk\u0142ady. Wymagane jest do tego wi\u0119cej element\u00f3w HTML. Sp\u00f3jrz na przyk\u0142ady poni\u017cej:<\/p>\n\n\n\n<p><em>Default input:<\/em><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Default input\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"example\"<\/span> \/&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em>Input with hint<\/em>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Default input\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"example\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Nam pretium mi tempor eros interdum.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em>Input with label:<\/em><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Name<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Default input\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"example\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em>Input with prefix<\/em>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Prefix<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Default input\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"example\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em>Input with suffix<\/em>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Default input\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"example\"<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Suffix<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><em>All in one:<\/em><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Name<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Prefix<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Default input\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"example\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Suffix<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Nam pretium mi tempor eros interdum.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">U\u017cycie dyrektywy v-model oraz nas\u0142uchiwanie na zdarzenia w utworzonym komponencie<\/h2>\n\n\n\n<p>Podczas przypisywania dyrektywy <kbd>v-model<\/kbd> w komponencie:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">InputField<\/span> <span class=\"hljs-attr\">v-model<\/span>=<span class=\"hljs-string\">\"inputValue\"<\/span>\/&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>kod nie zadzia\u0142a w\u0142a\u015bciwie i nie przypisze odpowiednich danych do komponentu, a tak\u017ce nie b\u0119dzie odpowiednio nas\u0142uchiwa\u0142 na zdarzenia, je\u017celi pole wej\u015bciowe b\u0119dzie otoczone dodatkowymi elementami HTML (jak na przyk\u0142adzie). Dzieje si\u0119 tak przez domy\u015bly mechanizm dziedziczenia atrybut\u00f3w. Vue automatycznie przeniesie atrybuty i funkcje nas\u0142uchuj\u0105ce na zdarzenia na najwy\u017cszy element otaczaj\u0105cy komponent. To powoduje problem przy zarz\u0105dzaniu stanem formularza. Na szcz\u0119\u015bcie, to zachowanie mo\u017ce zosta\u0107 zmienione poprzez u\u017cycie w\u0142a\u015bciwo\u015bci <kbd>inheritAttrs<\/kbd> w skrypcie komponentu w exportowanym obiekcie:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&lt;script&gt;\n  <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n    <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">'input-field'<\/span>,\n    <span class=\"hljs-attr\">data<\/span>: {\n      <span class=\"hljs-attr\">inputValue<\/span>: <span class=\"hljs-string\">''<\/span>\n    },\n    <span class=\"hljs-attr\">inheritAttrs<\/span>: <span class=\"hljs-literal\">false<\/span>\n    <span class=\"hljs-comment\">\/\/ &#91;...]<\/span>\n  }\n&lt;<span class=\"hljs-regexp\">\/script&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ustawiaj\u0105c w\u0142a\u015bciwo\u015b\u0107 <kbd>inheritAttrs<\/kbd> na <kbd>false<\/kbd>, Vue nie powi\u0105\u017ce atrybut\u00f3w bezpo\u015brednio z elementem otaczaj\u0105cym komponent. Zamiast tego programista mo\u017ce zdecydowa\u0107, gdzie powinny one by\u0107 powi\u0105zane. Aby to zrobi\u0107, powi\u0105\u017c zmienne globalne $attrs i $listeners z elementem pola:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Name<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>  \n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Prefix<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">placeholder<\/span>=<span class=\"hljs-string\">\"Default input\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"example\"<\/span> <span class=\"hljs-attr\">v-bind<\/span>=<span class=\"hljs-string\">\"$attrs\"<\/span> <span class=\"hljs-attr\">v-on<\/span>=<span class=\"hljs-string\">\"$listeners\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Suffix<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>Nam pretium mi tempor eros interdum.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dzi\u0119ki temu wszystkie zdarzenia b\u0119d\u0105 emitowane do komponentu nadrz\u0119dnego, a dane przekazywane do wybranego elementu.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>By default, parent scope attribute bindings that are not recognized as props will \u201cfallthrough\u201d and be applied to the root element of the child component as normal HTML attributes. When authoring a component that wraps a target element or another component, this may not always be the desired behavior. By setting inheritAttrs to false, this default behavior can be disabled. The attributes are available via the $attrs instance property (also new in 2.4) and can be explicitly bound to a non-root element using v-bind.\n\nNote: this option does not affect class and style bindings.<\/p>\n<cite>https:\/\/vuejs.org\/v2\/api\/#inheritAttrs<\/cite><\/blockquote>\n\n\n\n<p><\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Podczas tworzenia aplikacji przy u\u017cyciu Vue.js (oraz podobnych framework\u00f3w), bardzo prawdopodone, \u017ce zajdzie potrzeba stworzenia komponentu pola wej\u015bciowego. W trakcie rozwoju projektu, mo\u017ce si\u0119 okaza\u0107 \u017ce pole mo\u017ce przybiera\u0107 r\u00f3\u017cne formy, np. pole z podpowiedzi\u0105, etykiet\u0105, prefiksem, sufiksem, ikon\u0105, wiadomo\u015bci\u0105 o walidacji itp. Z punktu widzenia kodu HTML, sam element pola nie wystarczy, aby zbudowa\u0107 [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":199,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,4],"tags":[60,61,59],"class_list":["post-197","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ciekawostki","category-web-development","tag-attribute-inheritance","tag-v-model","tag-vue-js"],"_links":{"self":[{"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/posts\/197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/comments?post=197"}],"version-history":[{"count":3,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/posts\/197\/revisions"}],"predecessor-version":[{"id":706,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/posts\/197\/revisions\/706"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/media\/199"}],"wp:attachment":[{"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/media?parent=197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/categories?post=197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webdevs.blog\/pl\/wp-json\/wp\/v2\/tags?post=197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}