<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Onur Elibol</title>
    <description>The latest articles on DEV Community by Onur Elibol (@onurelibol).</description>
    <link>https://dev.to/onurelibol</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F514092%2Ff152926e-278e-454e-b07b-6682cda1c5c0.jpeg</url>
      <title>DEV Community: Onur Elibol</title>
      <link>https://dev.to/onurelibol</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/onurelibol"/>
    <language>en</language>
    <item>
      <title>Frontend Developerlar için İş başvurusu ve Kariyer tavsiyeleri</title>
      <dc:creator>Onur Elibol</dc:creator>
      <pubDate>Sun, 21 Mar 2021 22:10:43 +0000</pubDate>
      <link>https://dev.to/onurelibol/frontend-developerlar-icin-i-s-basvurusu-ve-kariyer-tavsiyeleri-31gk</link>
      <guid>https://dev.to/onurelibol/frontend-developerlar-icin-i-s-basvurusu-ve-kariyer-tavsiyeleri-31gk</guid>
      <description>&lt;p&gt;Herkese merhaba!&lt;/p&gt;

&lt;p&gt;Yazılım dünyasına adım atmaya hazırlanan arkadaşlar ile, bu zamana kadar edindiğim tecrübeleri derleyip paylaşmak istedim. Bu yazıyı, ağırlıklı olarak Frontend developerlar için hazırlamış olsam da, değineceğim bir çok nokta yazılım dünyasındaki herhangi bir iş başvurusu için de kullanılabilir. Yazıya iş başvurusu yapmadan önce nelere dikkat edilmeli, iş başvurusu yaparken şansınızı artıracak, önemli olabilecek, aklıma gelen şeyleri dahil etmeye çalıştım. &lt;strong&gt;Bahsettiğim her madde, şirketten şirkete farklılık gösterebilir.&lt;/strong&gt; Bunların dışında bir kaç kişisel tavsiyemi de ekledim. &lt;/p&gt;

&lt;p&gt;Çayınızı kahvenizi aldıysanız başlayalım :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Başvurmadan önce nelere dikkat etmeliyim?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Başvurmadan önce dikkat etmeniz gerekenlerden birincisi, eğer ilan ingilizce verilmiş ise ve ingilizce bir gereklilik olarak belirtilmiş ise, ve yeterli ingilizce derecesine sahip değilseniz başvurmayı tekrar gözden geçirin derim :) Global düzeyde iş yapan şirketler, adayları pre-screening'den geçirirler. İngilizce yeterliliğiniz yok ise, ya pre-screening'den önce elenirsiniz, ya da pre-screening'de İK ile karşılaştığınızda hızlı bir şekilde elenirsiniz.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;İngilizceye önem verin, yeterli olmaya değil, çok iyi bir noktaya getirmeye çalışın. Globalde faaliyet gösteren şirketlerde iş yapmak istiyorsanız, kendinizi alanınızda daha iyi bir noktaya taşımak istiyorsanız, ingilizce çok çok çok önemli. Dokümantasyonları okuyabilip daha iyi anlamak, yeni çıkan herşeyi hızlıca öğrenebilmek, iletişim kurabilmek adına ingilizce yazılım dünyasının olmazsa olmazı.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Bunun dışında, yeterlilik kısmında "mutlaka gerekli" olan teknolojilere dikkat edin. 1-2 tanesi eksik ise sorun olmayabilir, nitekim tamamı eksik ise muhtemelen dönüş alamayabilirsiniz. Biraz da şans işi bu kısım, çünkü bazı şirketler spesifik bi alanda uzmanlaşmış birini ararken, diğerleri verdikleri ilan üzerinden hem uzman, hem de yetiştirmek için başlangıç seviyesinde birini arıyor olabilirler.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Linkedin profilinizi mutlaka tamamlayın, güncel tutun. Unutmayın, Linkedin Facebook veyahut Instagram değil, profesyonel sayılabilecek bir resminizi koyun. Teknik bilginizi, iş/staj deneyimlerinizi ekleyin. Linkedin üzerinde aktif olmaya çalışın, okuduklarınızı paylaşın, ilgi duyduğunuz alanlarda bulunan gruplara katılın. Head hunter'lar buradan size kolaylıkla erişebilsin.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CV'de nelere dikkat etmeliyim?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;En önemli etkenlerden birisi, CV'nizin göze hitap etmesi. Özellikle Frontend geliştiriciler için, bunun kritik önem taşıdığını düşünüyorum. Beyaz sayfanın üzerine gelişi güzel, rapor gibi yazılmış bir CV, akşama kadar 147 adet başvurunun üzerinden geçmiş olan, IK'da çalışan Sevda hanımın gözüne hitap etmediği (edemediği) için arada kaynayabilir (bkz. burası çokomelli). Sabır gösterip CV'ye baktığında ise, neyin nerede yazdığını kolay bir şekilde takip edemeyeceği için sizi pas geçebilir (bkz. UX). Becerilerinizi henüz CV yazma aşamasında göstermeye başlayın. Bildiğiniz teknolojileri, okuduğunuz okulu, iş deneyiminizi, diğer olması gereken herşeyi, bir web uygulaması yapar gibi ciddiye alarak güzel bir layout ile yapın. Sıfırdan uğraşmak istemezseniz, ufak bir arama ile bir sürü template bulabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkcmni766zk2lzep6haz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkcmni766zk2lzep6haz.png" alt="cv_sample"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eğer başvuracağınız iş ilanı ingilizce ise, CV'nizi ingilizce olarak hazırlayıp gönderin.&lt;/strong&gt; Başvurduğunuz şirket Global bir şirket ise, İK bölümü Türkiye'de olmayabilir. Bu durumda CV'nizden birşey anlaşılmayacağı için büyük ihtimalle pas geçerler.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Bir diğer önemli nokta ise yazım hataları. CV'nizi yazdıktan sonra mutlaka ama mutlaka herşeyi dikkatlice kontrol edin. CV'nize bakan İK olabilir, başka bir yazılımcı da olabilir (muhtemelen işiniz daha zor olur bu durumda). &lt;em&gt;"CV'de bir sürü yazım hatası var, acaba nasıl kod yazıyo?"&lt;/em&gt; gibi bir soru oluşturacak hatalar olmasın. Netice olarak yaptığımız iş dikkat gerektiren bir iş ve dikkatsiz olduğunuz izlenimini bırakmak istemezsiniz.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mutlaka ama mutlaka github profil linkiniz, var ise bitirdiğiniz projelerin linki CV'de bulunsun.&lt;/strong&gt; Neyi nasıl yaptığınızı, yazdığınız kodu, ne seviyede olduğunuzu gösterebilmek adına çok önemli. (Github ile ilgili daha derin bilgi yazının ilerleyen kısımlarında).&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;İş/staj deneyiminizin altında, kısada olsa bu süreçte neler yaptığınızı, hangi teknolojileri kullandığınızı açıklayın.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;İlgi çekebilecek kısa bir giriş kısmı yazın. Bu kısımda hangi teknolojilere hakimsiniz, hangi alanda kendinizi geliştirmek istiyorsunuz, hangi konularda kendinize güveniyorsunuz bunları kısa ve net bir şekilde yazın.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Hi! My name is X and I have been passionate about development of robust system infrastructure, with consideration of customer needs, functionality, latest technology and programming standards. My main domain is X, however, I am interested in Y and Z also.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;ul&gt;
&lt;li&gt;Mezuniyet belgesi, transkript vs. gibi ekstra dökümanları &lt;strong&gt;göndermeyin, CV'nize eklemeyin.&lt;/strong&gt; İşin açıkçası Türkiye'de bunları CV'de görmeyi bekleyen şirketler varmı bilmiyorum, fakat globalde bu tarz belgelerin hiç bir önemi yok.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Doğruluğu olmayan, emin olmadığınız ve arkasında duramayacağınız hiç bir şeyi eklemeyin. Bilmediğiniz veyahut çok üstünkörü bildiğiniz bir teknolojiye aşırı hakimmiş gibi göstermeyin. Unutmayın, CV'nize eklediğiniz her şey karşı taraftan size yol, su, soru, assignment olarak dönebilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Github ve hobi projelerimde nelere dikkat etmeliyim?
&lt;/h2&gt;

&lt;p&gt;Bu bölümdeki bilgilerin çoğunu özellikle Frontend developerlar için yazıyorum. Diğer alanlar için de prensip olarak uygulanabilecek bir kaç şey olabilir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bu noktada en önemli tavsiyem, bolca hobi projesi yapıp Github'a ekleyin. Yazdığınız her satır kod Github'da bulunsun. Hobi projesi için, &lt;em&gt;"ama benim aklıma bir şey gelmiyor"&lt;/em&gt; dediğinizi duyar gibiyim :) Bu projelerin çok ileri seviyede olması gerekmiyor. Kendi portfolyönüzü oluşturduğunuz kişisel bir web sayfası, basit bir to do list uygulaması, basit bir oyun (quiz, adam asmaca), film kütüphanesi gibi şeyler yapılabilir. &lt;strong&gt;Burada önemli olan şey yaptığınız projenin ne kadar karmaşık olması değil, sizin, yazılım dünyasına olan ilginizi ve öğrenme hevesinizi gösterebilmeniz.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;İkinci önemli olan şey ise bir önceki maddede bahsettiğim hobi projelerinizin düzgün bir şekilde çalışması. Örneğin kişisel web sayfası yaptıysanız, deploy ettiğiniz yerde çalışıyor olsun. Evet, yaptığınız şey basit olabilir, ama özenle yapılmış olsun, hataya yer bırakmayın. Unutmayın, profesyonelliğe adım atmak istiyorsunuz, yaptığınız işler de olabildiğince profesyonel bir şekilde yapılmış olsun, gelişigüzel yapılmış görünmesin. Portfolyönüzü teknik anlamda kontrol eden kişiye temiz ve dikkatli çalıştığınızı, size güvenebileceğini gösterin.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Yine hobi projelerinizle alakalı olarak; &lt;strong&gt;kodunuzu mutlaka ama mutlaka ingilizce yazın.&lt;/strong&gt; Yazılım dünyasının dili ingilizcedir. Türkiye içerisinde ufak/orta çaplı bir şirkete başvurduğunuzda bu sorun olmayabilir, nitekim globalde iş yapan bir şirkete başvuracaksanız, bu çok önemli. İngilizce kod yazmayı prensip haline getirin. Global standartları takip edin ve uygulamaya çalışın.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;create-react-app&lt;/code&gt; veyahut &lt;code&gt;vue/cli&lt;/code&gt; ile oluşturduğunuz projelerde, &lt;code&gt;README.md&lt;/code&gt; dosyasını olduğu gibi bırakmayın. Projenizle ilgili ufakta olsa bir açıklama yazın, bir yere deploy ettiyseniz linkini koyun.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.gitignore&lt;/code&gt; dosyasını oluşturup, repository'de &lt;strong&gt;bulunmaması&lt;/strong&gt; gerekenleri (.DS_Store, thumbs.db vs.) mutlaka ekleyin. JavaScript projeleri için, &lt;code&gt;node_modules&lt;/code&gt; klasörü örneğin. Bu klasörün repository'de bulunması amatörce bir hata olarak algılanabilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ayrica bkz.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr5cnp9uq8yyxg2fb265.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzr5cnp9uq8yyxg2fb265.png" alt="node_modules"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github kullanmak sizin için standart olsun. Her proje, her satır, her karakter için Github kullanın ve Github'i en efektif şekilde kullanmaya çalışın. Bütün değişikliklerinizi tek commit içerisine koyup çarşamba pazarının dijital hali gibi göndermeyin. Her yaptığınız değişikliği ayrı ayrı commitler ile gönderin.
Bunun sebeplerinden birisi, projenizin repository'de geçmişini çok net bir şekilde gösterebilmek. İkinci sebebi de kendiniz için, yaptığınız bir değişiklikte projeniz çalışmamaya başlar ise, o noktaya rahatlıkla dönebilmeniz ve hataya neyin sebep olduğunu bulabilmek (Git'in binbir faydasından sadece birisi). Command Line üzerinden &lt;code&gt;git&lt;/code&gt; kullanmak hoşunuza gitmiyor ise, ücretsiz olarak &lt;a href="https://www.sourcetreeapp.com/" rel="noopener noreferrer"&gt;Source Tree&lt;/a&gt; kullanıp işleri kolaylaştırabilirsiniz. Git kullanımının bir çok farklı metodolojisi var, bu konuyu da derinlemesine araştırmanızı tavsiye ederim.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Bunların dışında kodunuza özen gösterin, yazım hataları, indentation, code-style'a dikkat edin, tutarlılık olsun.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek vermek gerekirse, bir yerde&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;yazdıysanız, başka bir yerde&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;gibi bir tutarsızlık olmasın (bununla ilgili ek bilgi Bonus kısmında, bkz. ESLint).&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;Yukarıda bahsettiğim şeyler dışında iletmek istediğim bir kaç kişisel tavsiyem ve  bir kaç ek bilgi daha var. Uygulayıp uygulamamak sizlere kalmış. Nitekim global anlamda iş yapabilmek ve kendinizi/yaptığınız işi bir üst seviyeye taşıyabilmek adına uygulamanızı tavsiye ederim.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yukarda en son &lt;em&gt;"kodunuzda tutarsızlık olmasın"&lt;/em&gt; demiştim. Bu tarz hataları gidermek için ve JavaScript'te best-practice olan şeyleri hızlıca uygulayabilmek için &lt;strong&gt;ESLint&lt;/strong&gt; ve &lt;strong&gt;Prettier&lt;/strong&gt; gibi araçları &lt;strong&gt;mutlaka kullanın.&lt;/strong&gt; &lt;a href="https://www.google.com/search?q=eslint+nedir+nasil+kullanilir&amp;amp;oq=eslint+nedir+nasil+kullanilir&amp;amp;aqs=chrome..69i57.2904j0j7&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8" rel="noopener noreferrer"&gt;(bkz. ESLint nedir?)&lt;/a&gt; Her IDE'de (VS Code, IntelliJ vs.) kodunuzu otomatik olarak düzeltmek için bir fonksiyon vardır (Format Document), en kısa zamanda bunu uygulamaya başlayın ve alışkanlık haline getirin.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Temiz kod yazmaya özen gösterin. Yazılım dünyasında her şey teknik anlamda guru olmaktan ibaret değil. Bir noktadan sonra kaç dil bildiğinizin veyahut ne kadar hızlı iş çıkardığınızın pek bir önemi kalmıyor. Yazdığınız kodun temiz olması, kolaylıkla maintain edilebilmesi, sizden sonra projeye göz atan kişinin yazdığınız kodu kolaylıkla anlayabilmesi de çok önemli. Her şey kod yazıp çalıştırmaktan ibaret değil. Tavsiyem, &lt;strong&gt;kod yazarken kitap yazdığınızı ve sizden sonra başka birisinin bunu okuyacağını/anlamaya çalışacağını aklınızda bulundurarak kod yazın.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Temiz kod demiş iken Uncle Bob'u es geçmeyelim:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/7EmboKQH8lM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teknik yanınızın dışında, teknik olmayan yanınızı da geliştirmeye çalışın. Daha önce de dediğim gibi, her şey teknolojiden ibaret değil. Karakter olarak şirket kültürüne ve katılacağınız ekibe uygun olup olmadığınız da önemli.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Kendinizi ilerletmek adına, veyahut bir yol çizebilmek adına aşağıda vereceğim yol haritasına mutlaka göz atın. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://roadmap.sh/frontend" rel="noopener noreferrer"&gt;Frontend Developer Roadmap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Baktınız mı? Gözünüz korktumu? Korkmasın :) Yol haritasındaki her şeyi bilmenize gerek yok, bilmeye de imkan yok zaten. Fakat uzmanlaşmak istediğiniz alanda neleri bilmeniz gerektiğine en azından bir göz atın. Vakit buldukça bu haritadan seçip öğrenmeye çalışın, en azından neyin ne olduğu konusunda fikir edinin.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Yeterli seviyeye geldiğinizde açık kaynak kodlu projelerde yer almaya çalışın. Bu sizin ne kadar ilgili olduğunuzu, öğrenme hevesinizi, becerilerinizi gösterebilmek için en iyi fırsatlardan birisi. &lt;em&gt;"Nereden başlayacağım?"&lt;/em&gt; derseniz, Github üzerinde yüz binlerce proje mevcut. Herhangi birini gözünüze kestirip, forklayıp, değişiklikleri yapıp pull request göndererek başlayabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Bütün bunların dışında eklemek istediğim bir şey var. Yazılım dünyasında iş başvurusu yaptığınızda, &lt;strong&gt;hangi üniversiteden mezun olduğunuzun çok büyük bir önemi yok.&lt;/strong&gt;
Bu madde belki her şirket/rol için geçerli olmayabilir, netekim yazılım dünyasında hangi okuldan mezun olduğunuzun dışında, bir çok önemli faktör var.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;Kod yazmayı üniversitede öğrenmiş de olabilirsiniz, veyahut YouTube/Udemy üzerinden dersler ile de öğrenmiş olabilirsiniz. Ama diplomadan önce yazılım dünyası ile ne kadar ilgili olduğunuz, neler bildiğiniz/yapabildiğiniz, yeni teknolojileri öğrenme arzunuz, problem çözmeyi sevmeniz, temiz kod yazabilmeniz, daha önce yaptığınız işler gibi bir sürü önemli faktör var. Bu saydıklarım olmadan, Stanford'dan bile mezun olsanız farketmiyor. Bu "üniversite eğitimine gerek yok" demek değil tabiiki. Anlatmak istediğim şey, iş başvurusu yaptığınızda tek önemli faktörün üniversite ismi veyahut diploma notu olmadığı.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Son söz olarak, bu tavsiyelerin her birini yapmak zorunda değilsiniz. Yazdıklarım, &lt;em&gt;"yazılım dünyasında iş nasıl bulunur"&lt;/em&gt;'un kuralları veyahut formülü değil, nacizane tavsiyelerimdir.&lt;/p&gt;

&lt;p&gt;Bol şans diliyorum :)&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>kariyer</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Creating custom components with Vuetify - Inheriting props/events/slots in Composition API</title>
      <dc:creator>Onur Elibol</dc:creator>
      <pubDate>Sat, 14 Nov 2020 11:46:51 +0000</pubDate>
      <link>https://dev.to/onurelibol/creating-custom-components-with-vuetify-inheriting-props-events-slots-in-composition-api-56ef</link>
      <guid>https://dev.to/onurelibol/creating-custom-components-with-vuetify-inheriting-props-events-slots-in-composition-api-56ef</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;Lately I have been working on customising Vuetify components to have default component look/feel and I wanted to share some best practices that I have learned. In this article, I will try to show you how to inherit/forward props, events and slots from the parent component with minimal effort. I took Vuetify as an example here, but the practices could be applied on any other UI framework that offers props/events/slots. Hope it will be useful for someone at some point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why
&lt;/h2&gt;

&lt;p&gt;Basically the main reason is that you sometimes have a use-case to cover, and you need to create a re-usable/customisable component based on a Vuetify (or any other UI framework) component. Well here comes the why; when you create a custom component, you don't want to lose what the UI framework you use offers by default. &lt;/p&gt;

&lt;p&gt;I am going to define 2 different use-cases here to base my examples on. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;First use-case is to be able to use Vuetify components with pre-defined props, for example &lt;code&gt;v-text-field&lt;/code&gt; by default outlined, with a standard color etc. But you still want to be able override &lt;code&gt;outlined&lt;/code&gt; or &lt;code&gt;color&lt;/code&gt; property outside even if they are defined by default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Second use-case is building a custom component based on Vuetify components. Let's say you are going to build a component that is a combination of &lt;code&gt;v-text-field&lt;/code&gt; and &lt;code&gt;v-card&lt;/code&gt;. But you still want to be able to use default props/events/slots of &lt;code&gt;v-text-field&lt;/code&gt; on your custom component without defining it all manually.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the next version of Vuetify (v3.0 Titan), this cases &lt;strong&gt;will be&lt;/strong&gt; covered easily actually. Here is an example how it is going to look like: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fusb10dc3rnwbzerf2f2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fusb10dc3rnwbzerf2f2u.png" alt="vuetify3"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=aXY4upCtiPI" rel="noopener noreferrer"&gt;Vuetify 3 updates&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But as long as we don't have any access to these stuff yet, we are still stuck with the current approach. So here comes how we can do it with minimal effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  How
&lt;/h2&gt;

&lt;p&gt;Now when you are using Vuetify, all the components have some sort of pre-defined props/events/slots. To cover both use-cases above, most important thing is inheriting these props/events/slots from the parent component. So how do we do that?&lt;/p&gt;

&lt;p&gt;Lets start with creating our custom text field with pre-defined props:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// CustomTextField.vue&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;outlined&lt;/span&gt;
    &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;v =&amp;gt; $emit('input', v)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Great, now we can use it like:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Parent.vue&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;v-model&lt;/code&gt; is sugar syntax for &lt;code&gt;:value="value" @input="v =&amp;gt; $emit('input', v)"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We have created our CustomTextField and it is by default outlined and has primary color. Now what about if we want to use &lt;code&gt;flat&lt;/code&gt; or &lt;code&gt;dense&lt;/code&gt; or any other prop that &lt;code&gt;v-text-field&lt;/code&gt; has on&lt;code&gt;custom-text-field&lt;/code&gt;? Or what if we need to override &lt;code&gt;outlined&lt;/code&gt; and &lt;code&gt;color&lt;/code&gt; property at some point, how are we going to do that? Basically we can't, as &lt;code&gt;outlined&lt;/code&gt; and &lt;code&gt;color&lt;/code&gt; is defined statically here and nothing is changing them.&lt;/p&gt;

&lt;p&gt;So currently adding these props to our custom component as below would &lt;strong&gt;NOT&lt;/strong&gt; work (for now):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;dense&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;outlined&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;false&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This because of we are not inheriting any props that were sent from Parent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inheriting Props
&lt;/h3&gt;

&lt;p&gt;To inherit props from parent, we can use a small trick that would help us. In Vue, each parent component sends the attributes that are added itself. To access those we can simply use &lt;code&gt;$attrs&lt;/code&gt; in our template to bind everything that were sent from parent like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// CustomTextField.vue&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;
    &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$attrs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;outlined&lt;/span&gt;
    &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;v =&amp;gt; $emit('input', v)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;inheritAttrs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And voila! Now our &lt;code&gt;&amp;lt;v-text-field&amp;gt;&lt;/code&gt; inside CustomTextField component inherits all attributes that were added to &lt;code&gt;&amp;lt;custom-text-field&amp;gt;&lt;/code&gt;. So we can now easily use every prop that &lt;code&gt;v-text-field&lt;/code&gt; provides on &lt;code&gt;&amp;lt;custom-text-field&amp;gt;&lt;/code&gt; and override anything pre-defined props inside like this: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Parent.vue&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;dense&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;outlined&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;false&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  IMPORTANT
&lt;/h4&gt;

&lt;p&gt;The way &lt;code&gt;$attrs&lt;/code&gt; behave differs between Vue 2.x and 3.x! Some differences are: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Vue 2.x &lt;code&gt;$attrs&lt;/code&gt; does not include &lt;code&gt;styles&lt;/code&gt; and &lt;code&gt;classes&lt;/code&gt; that were sent from parent&lt;/li&gt;
&lt;li&gt;In Vue 3.x &lt;code&gt;$attrs&lt;/code&gt; includes &lt;code&gt;styles&lt;/code&gt; and &lt;code&gt;classes&lt;/code&gt; that were sent from parent. Also &lt;code&gt;$listeners&lt;/code&gt; are now included inside &lt;code&gt;$attrs&lt;/code&gt; which I will talk about later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information check details at &lt;a href="https://v3.vuejs.org/guide/migration/attrs-includes-class-style.html#overview" rel="noopener noreferrer"&gt;Vue 3 docs.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Inheriting Events
&lt;/h3&gt;

&lt;p&gt;Alright, we are now inheriting props from parent so we can use our custom text field as we are using &lt;code&gt;v-text-field&lt;/code&gt; with props. So what about events? How can we forward all the events that are happening on &lt;code&gt;&amp;lt;v-text-field&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;custom-text-field&amp;gt;&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;The solution is simple here as well:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// CustomTextField.vue&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;
    &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$attrs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;outlined&lt;/span&gt;
    &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$listeners&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;v =&amp;gt; $emit('input', v)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;inheritAttrs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We just bind &lt;code&gt;$listeners&lt;/code&gt; with &lt;code&gt;v-on&lt;/code&gt; and thats it! So now we can easily add any event that &lt;code&gt;&amp;lt;v-text-field&amp;gt;&lt;/code&gt; provides to &lt;code&gt;&amp;lt;custom-text-field&amp;gt;&lt;/code&gt; like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Parent.vue&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;
  &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;dense&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;outlined&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;false&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;blur&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;onFocus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;keypress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;onKeypress&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  IMPORTANT
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;$listeners is removed in Vue 3.x and is included inside $attrs&lt;/strong&gt;. So if you are using Vue 3.x, binding the component with &lt;code&gt;$attrs&lt;/code&gt; will be enough to bind &lt;code&gt;$listeners&lt;/code&gt;, like here:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// bind props, attrs, class, style in Vue 3.x&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$attrs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;For more information check details at &lt;a href="https://v3.vuejs.org/guide/migration/listeners-removed.html#overview" rel="noopener noreferrer"&gt;Vue 3 docs.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Inheriting Slots
&lt;/h3&gt;

&lt;p&gt;Slots are a little bit different than props or events. There is for sure different ways to do this, but here is what I am doing to forward all the slots that were sent from parent to child.&lt;/p&gt;

&lt;p&gt;I start with picking all the slot names that were sent from the parent inside a computed: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// CustomTextField.vue&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parentSlots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slots&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parentSlots&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then inside the &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt; part I am looping through the slots to declare all the slots dynamically like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// CustomTextField.vue&lt;/span&gt;
&lt;span class="c1"&gt;// Vue 2.x way, binding $listeners with v-on not needed in Vue 3.x&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;
    &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$attrs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;outlined&lt;/span&gt;
    &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$listeners&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;v =&amp;gt; $emit('input', v)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Dynamically&lt;/span&gt; &lt;span class="nx"&gt;inherit&lt;/span&gt; &lt;span class="nx"&gt;slots&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slot in parentSlots&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;slot&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/v-text-field&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parentSlots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slots&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parentSlots&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Note that &lt;strong&gt;#&lt;/strong&gt; is shorthand for &lt;code&gt;v-slot&lt;/code&gt;. Here we could also use:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slot in parentSlots&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;props&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;slot&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;props&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;to forward slot props as well. But the &lt;code&gt;v-text-field&lt;/code&gt; component then does not render the slots that has not any props. I suppose this is a bug in Vuetify. &lt;a href="https://github.com/vuetifyjs/vuetify/issues/12583" rel="noopener noreferrer"&gt;Issue here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great! So now we are even forwarding &lt;a href="https://vuetifyjs.com/en/api/v-text-field/#slots" rel="noopener noreferrer"&gt;v-text-field slots&lt;/a&gt; from parent to child which means we can use slots of &lt;code&gt;&amp;lt;v-text-field&amp;gt;&lt;/code&gt; like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Parent.vue&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;
  &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;dense&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;outlined&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;false&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;blur&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;onFocus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;keypress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;onKeypress&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Custom&lt;/span&gt; &lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Custom&lt;/span&gt; &lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/custom-text-field&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  BONUS: Custom usage of props/events/slots
&lt;/h3&gt;

&lt;p&gt;We are now done with inheritance. But what if you need to use some of your &lt;code&gt;$attrs&lt;/code&gt; on another element? For example inside your custom component, you have &lt;code&gt;&amp;lt;v-text-field&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;v-card&amp;gt;&lt;/code&gt; and you want share &lt;code&gt;color&lt;/code&gt; property in both. At this point there are different ways to go. But as long as I like to keep things organised, I use computed to organise/control it from one point.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// CustomTextField.vue&lt;/span&gt;
&lt;span class="c1"&gt;// Vue 2.x way, binding $listeners with v-on not needed in Vue 3.x&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;
      &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[textFieldDefaults, $attrs]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$listeners&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;v =&amp;gt; $emit('input', v)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slot in parentSlots&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;slot&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/v-text-field&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cardDefaults&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;am&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/v-card-text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/v-card&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/template&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parentSlots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slots&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textFieldDefaults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;outlined&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;dense&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cardDefaults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parentSlots&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;textFieldDefaults&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cardDefaults&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;So what is happening here? We have created 2 computed variables, one for &lt;code&gt;v-text-field&lt;/code&gt; defaults and one for &lt;code&gt;v-card&lt;/code&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;code&gt;textFieldDefaults&lt;/code&gt; we define our default text field props and then binding it with &lt;code&gt;v-bind=[textFieldDefaults, $attrs]&lt;/code&gt;. If any of default values were sent from top, values inside &lt;code&gt;$attrs&lt;/code&gt; overrides our default props.&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;cardDefaults&lt;/code&gt; we only take &lt;code&gt;color&lt;/code&gt; property. If you wish, you could easily add any other prop or listener that were sent from the parent here. &lt;/li&gt;
&lt;li&gt;Both &lt;code&gt;textFieldDefaults&lt;/code&gt; and &lt;code&gt;cardDefaults&lt;/code&gt; must be declared as computed, to be able make them reactive and listen to the changes that are happening in parent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;To sum up, Vue offers many different options for us to achieve what we need to do. It is very easy to create custom components that are based on any UI framework without losing what the framework already offers us. There could be for sure some edge cases, but I think with the approach I tried to explain above, you can solve most of them. Hopefully, this post helped you to understand the concept!&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

</description>
      <category>vue</category>
      <category>vuetify</category>
      <category>javascript</category>
      <category>components</category>
    </item>
  </channel>
</rss>
