{"id":30311,"date":"2025-09-26T16:18:34","date_gmt":"2025-09-26T13:18:34","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=30311"},"modified":"2025-09-26T16:20:04","modified_gmt":"2025-09-26T13:20:04","slug":"vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/","title":{"rendered":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r"},"content":{"rendered":"<p><body><\/p>\n<h2>Giri\u015f: Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenlerin G\u00fcc\u00fc<\/h2>\n<p>Vue.js, esnekli\u011fi ve \u00f6\u011frenme kolayl\u0131\u011f\u0131 sayesinde modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bir JavaScript \u00e7er\u00e7evesidir. Geleneksel olarak Vue bile\u015fenleri, Options API ad\u0131 verilen bir nesne tabanl\u0131 yakla\u015f\u0131mla tan\u0131mlan\u0131r. Ancak, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar geli\u015ftirirken veya nesne y\u00f6nelimli programlama (OOP) ilkelerine daha yatk\u0131n geli\u015ftiriciler i\u00e7in, s\u0131n\u0131f tabanl\u0131 bile\u015fenler daha d\u00fczenli ve y\u00f6netilebilir bir yap\u0131 sunabilir.<\/p>\n<p>Bu makalede, Vue.js&#8217;i TypeScript ile birle\u015ftirerek s\u0131n\u0131f tabanl\u0131 bile\u015fenler yazman\u0131n inceliklerini ke\u015ffedece\u011fiz. TypeScript&#8217;in sundu\u011fu tip g\u00fcvenli\u011fi ve s\u0131n\u0131f tabanl\u0131 yap\u0131n\u0131n getirdi\u011fi d\u00fczen, kodunuzun daha sa\u011flam, okunabilir ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flayacakt\u0131r. \u00d6zellikle Java, C# gibi dillerden gelen veya Angular gibi di\u011fer \u00e7er\u00e7evelerde s\u0131n\u0131f tabanl\u0131 yap\u0131larla \u00e7al\u0131\u015fmaya al\u0131\u015fk\u0131n geli\u015ftiriciler i\u00e7in bu yakla\u015f\u0131m olduk\u00e7a cazip olabilir.<\/p>\n<h2>Neden S\u0131n\u0131f Tabanl\u0131 Yakla\u015f\u0131m?<\/h2>\n<p>Vue.js&#8217;te s\u0131n\u0131f tabanl\u0131 bile\u015fenler kullanmak, Options API&#8217;ye k\u0131yasla baz\u0131 \u00f6nemli avantajlar sunar. Bu avantajlar, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda kendini daha belirgin bir \u015fekilde g\u00f6sterir.<\/p>\n<h3>Geli\u015fmi\u015f Tip G\u00fcvenli\u011fi ve Otomatik Tamamlama<\/h3>\n<p>TypeScript&#8217;in en b\u00fcy\u00fck faydas\u0131 tip g\u00fcvenli\u011fidir. S\u0131n\u0131f tabanl\u0131 bile\u015fenler, TypeScript ile do\u011fal bir uyum i\u00e7indedir. Bile\u015feninizin prop&#8217;lar\u0131n\u0131, veri \u00f6zelliklerini, hesaplanm\u0131\u015f \u00f6zelliklerini ve metotlar\u0131n\u0131 a\u00e7\u0131k\u00e7a tiplendirebilirsiniz. Bu sayede, geli\u015ftirme a\u015famas\u0131nda potansiyel hatalar\u0131 yakalar, kodunuzun daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flars\u0131n\u0131z. Ayr\u0131ca, IDE&#8217;niz (Visual Studio Code gibi) bu tipleri anlayarak m\u00fckemmel otomatik tamamlama ve IntelliSense deste\u011fi sunar, bu da geli\u015ftirme h\u0131z\u0131n\u0131z\u0131 art\u0131r\u0131r ve yaz\u0131m hatalar\u0131n\u0131 azalt\u0131r.<\/p>\n<h3>Nesne Y\u00f6nelimli Programlama (OOP) \u0130lkelerine Uyum<\/h3>\n<p>S\u0131n\u0131f tabanl\u0131 yakla\u015f\u0131m, bile\u015fenlerinizi birer s\u0131n\u0131f olarak tan\u0131mlaman\u0131za olanak tan\u0131r. Bu, kal\u0131t\u0131m, soyutlama ve kaps\u00fclleme gibi OOP ilkelerini uygulayabilece\u011finiz anlam\u0131na gelir. \u00d6rne\u011fin, ortak i\u015flevselli\u011fe sahip bile\u015fenler i\u00e7in bir temel s\u0131n\u0131f olu\u015fturabilir ve di\u011fer bile\u015fenlerin bu s\u0131n\u0131ftan t\u00fcremesini sa\u011flayabilirsiniz. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve daha mod\u00fcler bir yap\u0131 olu\u015fturur.<\/p>\n<h3>Daha Okunabilir ve Bak\u0131m\u0131 Kolay Kod<\/h3>\n<p>Options API&#8217;de <code>data<\/code>, <code>methods<\/code>, <code>computed<\/code>, <code>watch<\/code> gibi farkl\u0131 se\u00e7enekler aras\u0131nda gezinmek bazen karma\u015f\u0131k olabilir. S\u0131n\u0131f tabanl\u0131 bile\u015fenlerde ise t\u00fcm bu \u00f6\u011feler bir s\u0131n\u0131f\u0131n \u00fcyeleri olarak tan\u0131mlan\u0131r: veri \u00f6zellikleri s\u0131n\u0131f\u0131n alanlar\u0131d\u0131r, metotlar s\u0131n\u0131f\u0131n metotlar\u0131d\u0131r, hesaplanm\u0131\u015f \u00f6zellikler ise getter\/setter metotlar\u0131d\u0131r. Bu yap\u0131, bile\u015fenin t\u00fcm mant\u0131\u011f\u0131n\u0131 tek bir yerde, daha tutarl\u0131 ve anla\u015f\u0131l\u0131r bir \u015fekilde g\u00f6rmenizi sa\u011flar. \u00d6zellikle uzun bile\u015fen dosyalar\u0131nda bu d\u00fczen, kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h3>B\u00fcy\u00fck Projelerde \u00d6l\u00e7eklenebilirlik<\/h3>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, bile\u015fenlerinizin karma\u015f\u0131kl\u0131\u011f\u0131 da artar. S\u0131n\u0131f tabanl\u0131 bile\u015fenler, karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek i\u00e7in daha iyi bir yap\u0131 sunar. Tip g\u00fcvenli\u011fi ve OOP ilkelerinin uygulanabilirli\u011fi sayesinde, daha b\u00fcy\u00fck ekiplerin birlikte \u00e7al\u0131\u015fmas\u0131 ve kod taban\u0131n\u0131 daha kolay anlamas\u0131 m\u00fcmk\u00fcn olur. Bu da b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve \u00f6l\u00e7eklenebilirli\u011fi destekler.<\/p>\n<h2>\u00d6n Gereksinimler ve Proje Kurulumu<\/h2>\n<p>S\u0131n\u0131f tabanl\u0131 Vue bile\u015fenleri yazmaya ba\u015flamadan \u00f6nce, projenizin do\u011fru \u015fekilde ayarland\u0131\u011f\u0131ndan emin olmal\u0131y\u0131z.<\/p>\n<h3>Vue CLI Kurulumu<\/h3>\n<p>E\u011fer hen\u00fcz kurulu de\u011filse, Vue CLI&#8217;y\u0131 global olarak kurman\u0131z gerekmektedir. Vue CLI, Vue projelerini h\u0131zl\u0131 bir \u015fekilde olu\u015fturmak ve y\u00f6netmek i\u00e7in kullan\u0131lan standart bir ara\u00e7t\u0131r.<\/p>\n<pre><code class=\"language-bash\">npm install -g @vue\/cli\r\n<h2>veya<\/h2>\r\nyarn global add @vue\/cli<\/code><\/pre>\n<h3>Yeni Bir Vue Projesi Olu\u015fturma<\/h3>\n<p>\u015eimdi TypeScript deste\u011fiyle yeni bir Vue projesi olu\u015ftural\u0131m. Vue CLI size \u00e7e\u015fitli se\u00e7enekler sunacakt\u0131r; burada &#8220;Manually select features&#8221; se\u00e7ene\u011fini se\u00e7erek TypeScript&#8217;i etkinle\u015ftirmemiz \u00f6nemlidir.<\/p>\n<pre><code class=\"language-bash\">vue create my-class-vue-app<\/code><\/pre>\n<p>Proje olu\u015fturma s\u0131ras\u0131nda a\u015fa\u011f\u0131daki gibi se\u00e7enekleri i\u015faretlemelisiniz:<\/p>\n<ul>\n<li><code>Manually select features<\/code><\/li>\n<li><code>TypeScript<\/code><\/li>\n<li><code>Router<\/code> (iste\u011fe ba\u011fl\u0131, ama genellikle kullan\u0131l\u0131r)<\/li>\n<li><code>Vuex<\/code> (iste\u011fe ba\u011fl\u0131, ama genellikle kullan\u0131l\u0131r)<\/li>\n<li><code>Class-style Component syntax<\/code> (kesinlikle i\u015faretlenmeli!)<\/li>\n<li><code>Babel<\/code> (TypeScript ile birlikte kullan\u0131lmas\u0131 \u00f6nerilir)<\/li>\n<\/ul>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, s\u0131n\u0131f tabanl\u0131 bile\u015fenler i\u00e7in gerekli temel yap\u0131land\u0131rmaya sahip bir Vue projeniz olacakt\u0131r.<\/p>\n<h3>Gerekli K\u00fct\u00fcphanelerin Eklenmesi: vue-class-component ve vue-property-decorator<\/h3>\n<p>S\u0131n\u0131f tabanl\u0131 bile\u015fenler yazmak i\u00e7in iki ana k\u00fct\u00fcphaneye ihtiyac\u0131m\u0131z var:<\/p>\n<ol>\n<li><strong><code>vue-class-component<\/code><\/strong>: Bu k\u00fct\u00fcphane, Vue bile\u015fenlerini ES Class&#8217;lar\u0131 olarak tan\u0131mlaman\u0131z\u0131 sa\u011flayan temel bir dekorat\u00f6r olan <code>@Component<\/code>&#8216;i sa\u011flar. Vue CLI ile proje olu\u015ftururken &#8220;Class-style Component syntax&#8221; se\u00e7ene\u011fini i\u015faretlediyseniz, bu k\u00fct\u00fcphane otomatik olarak kurulur.<\/li>\n<li><strong><code>vue-property-decorator<\/code><\/strong>: Bu k\u00fct\u00fcphane, Vue&#8217;nun Options API \u00f6zelliklerini (prop&#8217;lar, watch&#8217;lar, emit&#8217;ler, ref&#8217;ler vb.) s\u0131n\u0131f tabanl\u0131 bile\u015fenlerde dekorat\u00f6rler arac\u0131l\u0131\u011f\u0131yla kullanmam\u0131z\u0131 sa\u011flayan bir dizi yard\u0131mc\u0131 dekorat\u00f6r sunar. Bu k\u00fct\u00fcphane, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerin g\u00fcc\u00fcn\u00fc tam olarak kullanmak i\u00e7in vazge\u00e7ilmezdir.<\/li>\n<\/ol>\n<p>E\u011fer Vue CLI kurulumu s\u0131ras\u0131nda otomatik olarak eklenmediyse veya manuel olarak eklemek isterseniz, a\u015fa\u011f\u0131daki komutlar\u0131 kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm install vue-class-component vue-property-decorator\r\n<h2>veya<\/h2>\r\nyarn add vue-class-component vue-property-decorator<\/code><\/pre>\n<p>Bu k\u00fct\u00fcphaneler kurulduktan sonra, s\u0131n\u0131f tabanl\u0131 Vue bile\u015fenleri geli\u015ftirmeye haz\u0131rs\u0131n\u0131z.<\/p>\n<h2>Temel S\u0131n\u0131f Tabanl\u0131 Bile\u015fen Yap\u0131s\u0131<\/h2>\n<p>\u015eimdi s\u0131n\u0131f tabanl\u0131 bir Vue bile\u015feninin temel yap\u0131s\u0131na ve Options API&#8217;deki kar\u015f\u0131l\u0131klar\u0131na bakal\u0131m.<\/p>\n<h3>@Component Dekorat\u00f6r\u00fc<\/h3>\n<p>Her s\u0131n\u0131f tabanl\u0131 Vue bile\u015feni, <code>vue-class-component<\/code> k\u00fct\u00fcphanesinden gelen <code>@Component<\/code> dekorat\u00f6r\u00fc ile i\u015faretlenmelidir. Bu dekorat\u00f6r, s\u0131n\u0131f\u0131 bir Vue bile\u015feni olarak tan\u0131r ve Vue&#8217;nun reaktif sistemine entegre eder. Options API&#8217;deki gibi <code>components<\/code>, <code>filters<\/code>, <code>directives<\/code> gibi se\u00e7enekleri bu dekorat\u00f6r\u00fcn i\u00e7ine bir nesne olarak ge\u00e7irebilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">\/\/ MyComponent.vue\r\nimport { Component, Vue } from 'vue-property-decorator';\r\n\r\n@Component({\r\n  \/\/ Options API'deki gibi di\u011fer bile\u015fenleri, filtreleri vb. tan\u0131mlayabilirsiniz.\r\n  \/\/ components: {\r\n  \/\/   ChildComponent,\r\n  \/\/ },\r\n  \/\/ filters: {\r\n  \/\/   myFilter: (value: string) => value.toUpperCase(),\r\n  \/\/ },\r\n})\r\nexport default class MyComponent extends Vue {\r\n  \/\/ Bile\u015feninizin mant\u0131\u011f\u0131 buraya gelecek\r\n}<\/code><\/pre>\n<p><code>export default class MyComponent extends Vue<\/code> ifadesi, bile\u015fenimizin <code>Vue<\/code> s\u0131n\u0131f\u0131ndan t\u00fcredi\u011fini g\u00f6sterir. Bu, Vue&#8217;nun dahili \u00f6zelliklerine ve ya\u015fam d\u00f6ng\u00fcs\u00fc metotlar\u0131na eri\u015fmemizi sa\u011flar.<\/p>\n<h3>Veri (Data) Y\u00f6netimi: S\u0131n\u0131f \u00d6zellikleri<\/h3>\n<p>Options API&#8217;de <code>data<\/code> fonksiyonu ile tan\u0131mlad\u0131\u011f\u0131n\u0131z reaktif veriler, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerde do\u011frudan s\u0131n\u0131f\u0131n \u00f6zellikleri olarak tan\u0131mlan\u0131r. Bu \u00f6zelliklere ba\u015flang\u0131\u00e7 de\u011ferleri atayabilir ve TypeScript sayesinde tiplerini belirtebilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">import { Component, Vue } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport default class MyComponent extends Vue {\r\n  message: string = 'Merhaba Vue!';\r\n  count: number = 0;\r\n  isActive: boolean = false;\r\n\r\n  \/\/ ... di\u011fer metotlar veya \u00f6zellikler\r\n}<\/code><\/pre>\n<p>Bu \u00f6zellikler, Vue&#8217;nun reaktif sistemi taraf\u0131ndan otomatik olarak izlenir. \u015eablonunuzda bu \u00f6zelliklere eri\u015febilir ve de\u011fi\u015fikliklerinde UI&#8217;\u0131n g\u00fcncellenmesini bekleyebilirsiniz.<\/p>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <p>{{ message }}<\/p>\r\n    <p>Say\u0131: {{ count }}<\/p>\r\n    <button @click=\"count++\">Say\u0131y\u0131 Art\u0131r<\/button>\r\n  <\/div>\r\n<\/template><\/code><\/pre>\n<h3>Hesaplanm\u0131\u015f \u00d6zellikler (Computed Properties): Getters ve Setters<\/h3>\n<p>Options API&#8217;deki <code>computed<\/code> \u00f6zellikleri, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerde getter ve setter metotlar\u0131 olarak tan\u0131mlan\u0131r. Bu metotlar, ba\u011fl\u0131 olduklar\u0131 reaktif verilere g\u00f6re dinamik olarak hesaplanan de\u011ferler d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-typescript\">import { Component, Vue } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport default class MyComponent extends Vue {\r\n  firstName: string = 'Ahmet';\r\n  lastName: string = 'Y\u0131lmaz';\r\n\r\n  get fullName(): string {\r\n    return <code>${this.firstName} ${this.lastName}<\/code>;\r\n  }\r\n\r\n  set fullName(newValue: string) {\r\n    const names = newValue.split(' ');\r\n    this.firstName = names[0];\r\n    this.lastName = names[1] || '';\r\n  }\r\n\r\n  \/\/ ...\r\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>fullName<\/code> bir hesaplanm\u0131\u015f \u00f6zelliktir. <code>get<\/code> metodu, <code>firstName<\/code> ve <code>lastName<\/code>&#8216;e ba\u011fl\u0131 olarak tam ad\u0131 d\u00f6nd\u00fcr\u00fcr. E\u011fer <code>fullName<\/code>&#8216;e bir de\u011fer atamak isterseniz (\u00f6rne\u011fin bir <code>v-model<\/code> ile), <code>set<\/code> metodu \u00e7al\u0131\u015f\u0131r ve <code>firstName<\/code> ile <code>lastName<\/code>&#8216;i g\u00fcnceller.<\/p>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <p>Tam Ad: {{ fullName }}<\/p>\r\n    <input type=\"text\" v-model=\"fullName\" \/>\r\n  <\/div>\r\n<\/template><\/code><\/pre>\n<h3>Metotlar (Methods): S\u0131n\u0131f Metotlar\u0131<\/h3>\n<p>Options API&#8217;deki <code>methods<\/code> nesnesinde tan\u0131mlad\u0131\u011f\u0131n\u0131z fonksiyonlar, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerde do\u011frudan s\u0131n\u0131f\u0131n metotlar\u0131 olarak tan\u0131mlan\u0131r. Bu metotlar, bile\u015fenin davran\u0131\u015flar\u0131n\u0131 ve i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7erir.<\/p>\n<pre><code class=\"language-typescript\">import { Component, Vue } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport default class MyComponent extends Vue {\r\n  count: number = 0;\r\n\r\n  increment(): void {\r\n    this.count++;\r\n  }\r\n\r\n  decrement(): void {\r\n    this.count--;\r\n  }\r\n\r\n  greet(name: string): string {\r\n    return <code>Merhaba, ${name}! Say\u0131: ${this.count}<\/code>;\r\n  }\r\n}<\/code><\/pre>\n<p>Bu metotlar\u0131 \u015fablonunuzda olay dinleyicileri arac\u0131l\u0131\u011f\u0131yla \u00e7a\u011f\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <p>Say\u0131: {{ count }}<\/p>\r\n    <button @click=\"increment\">Art\u0131r<\/button>\r\n    <button @click=\"decrement\">Azalt<\/button>\r\n    <p>{{ greet('D\u00fcnya') }}<\/p>\r\n  <\/div>\r\n<\/template><\/code><\/pre>\n<h2>Ya\u015fam D\u00f6ng\u00fcs\u00fc Kancalar\u0131 (Lifecycle Hooks)<\/h2>\n<p>Vue bile\u015fenleri, olu\u015fturulma, ba\u011flanma, g\u00fcncellenme ve yok edilme gibi farkl\u0131 a\u015famalarda belirli metotlar\u0131 tetikler. Options API&#8217;de <code>created()<\/code>, <code>mounted()<\/code> gibi isimlerle tan\u0131mlanan bu kancalar, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerde de ayn\u0131 isimlerle s\u0131n\u0131f metotlar\u0131 olarak kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { Component, Vue } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport default class MyComponent extends Vue {\r\n  message: string = 'Ho\u015f Geldiniz!';\r\n\r\n  created(): void {\r\n    \/\/ Bile\u015fen olu\u015fturuldu\u011funda \u00e7al\u0131\u015f\u0131r (DOM'a ba\u011flanmadan \u00f6nce)\r\n    console.log('Bile\u015fen olu\u015fturuldu!');\r\n    this.message = 'Veriler y\u00fcklendi!';\r\n  }\r\n\r\n  mounted(): void {\r\n    \/\/ Bile\u015fen DOM'a ba\u011fland\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r\r\n    console.log('Bile\u015fen DOM\\'a ba\u011fland\u0131!');\r\n    \/\/ Genellikle DOM manip\u00fclasyonlar\u0131 veya d\u0131\u015f k\u00fct\u00fcphane entegrasyonlar\u0131 burada yap\u0131l\u0131r\r\n  }\r\n\r\n  updated(): void {\r\n    \/\/ Bile\u015fenin verileri de\u011fi\u015fti\u011finde ve DOM g\u00fcncellendi\u011finde \u00e7al\u0131\u015f\u0131r\r\n    console.log('Bile\u015fen g\u00fcncellendi!');\r\n  }\r\n\r\n  beforeDestroy(): void {\r\n    \/\/ Bile\u015fen yok edilmeden hemen \u00f6nce \u00e7al\u0131\u015f\u0131r\r\n    console.log('Bile\u015fen yok edilmek \u00fczere!');\r\n    \/\/ Olay dinleyicilerini temizleme, abonelikleri iptal etme gibi i\u015flemler burada yap\u0131l\u0131r\r\n  }\r\n\r\n  destroyed(): void {\r\n    \/\/ Bile\u015fen yok edildi\u011finde \u00e7al\u0131\u015f\u0131r\r\n    console.log('Bile\u015fen yok edildi!');\r\n  }\r\n}<\/code><\/pre>\n<p>Bu metotlar, Vue&#8217;nun ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca otomatik olarak \u00e7a\u011fr\u0131l\u0131r ve bile\u015feninizin farkl\u0131 a\u015famalar\u0131nda belirli eylemleri ger\u00e7ekle\u015ftirmenizi sa\u011flar.<\/p>\n<h2>Bile\u015fenler Aras\u0131 \u0130leti\u015fim<\/h2>\n<p>Vue uygulamalar\u0131nda bile\u015fenler aras\u0131 ileti\u015fim, uygulaman\u0131n dinamizmini sa\u011flayan temel bir unsurdur. S\u0131n\u0131f tabanl\u0131 bile\u015fenlerde bu ileti\u015fim, \u00f6zel dekorat\u00f6rler arac\u0131l\u0131\u011f\u0131yla daha okunakl\u0131 ve tipli bir \u015fekilde y\u00f6netilir.<\/p>\n<h3>Prop&#8217;lar: @Prop Dekorat\u00f6r\u00fc ile Veri Aktar\u0131m\u0131<\/h3>\n<p>\u00dcst bile\u015fenden alt bile\u015fene veri aktar\u0131m\u0131 i\u00e7in prop&#8217;lar kullan\u0131l\u0131r. <code>vue-property-decorator<\/code> k\u00fct\u00fcphanesinden gelen <code>@Prop<\/code> dekorat\u00f6r\u00fc, s\u0131n\u0131f \u00f6zelliklerini prop olarak tan\u0131mlaman\u0131z\u0131 sa\u011flar. Bu dekorat\u00f6r, Options API&#8217;deki <code>props<\/code> nesnesinde tan\u0131mlad\u0131\u011f\u0131n\u0131z t\u00fcm se\u00e7enekleri (<code>type<\/code>, <code>required<\/code>, <code>default<\/code>, <code>validator<\/code>) kabul eder.<\/p>\n<pre><code class=\"language-typescript\">\/\/ ChildComponent.vue\r\nimport { Component, Prop, Vue } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport default class ChildComponent extends Vue {\r\n  @Prop({ type: String, required: true, default: 'Varsay\u0131lan Ba\u015fl\u0131k' })\r\n  readonly title!: string; \/\/ <code>!<\/code> i\u015fareti, de\u011fi\u015fkenin mutlaka atanaca\u011f\u0131n\u0131 belirtir.\r\n\r\n  @Prop({ type: Number, default: 0 })\r\n  initialCount!: number;\r\n\r\n  @Prop(Boolean)\r\n  isActive?: boolean; \/\/ \u0130ste\u011fe ba\u011fl\u0131 prop\r\n\r\n  \/\/ Bile\u015fen i\u00e7indeki veri\r\n  currentCount: number = this.initialCount;\r\n\r\n  created() {\r\n    console.log('ChildComponent title:', this.title);\r\n  }\r\n\r\n  \/\/ ...\r\n}<\/code><\/pre>\n<p>\u00dcst bile\u015fenden bu prop&#8217;lar\u0131 a\u015fa\u011f\u0131daki gibi ge\u00e7irebilirsiniz:<\/p>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <ChildComponent title=\"Ana Sayfa Ba\u015fl\u0131\u011f\u0131\" :initialCount=\"10\" :isActive=\"true\" \/>\r\n    <ChildComponent title=\"Hakk\u0131m\u0131zda\" \/> <!-- initialCount ve isActive varsay\u0131lan de\u011ferleri kullan\u0131r -->\r\n  <\/div>\r\n<\/template>\r\n\r\n<script lang=\"ts\">\r\nimport { Component, Vue } from 'vue-property-decorator';\r\nimport ChildComponent from '.\/ChildComponent.vue';\r\n\r\n@Component({\r\n  components: {\r\n    ChildComponent,\r\n  },\r\n})\r\nexport default class ParentComponent extends Vue {}\r\n<\/script><\/code><\/pre>\n<h3>Olaylar (Events): @Emit Dekorat\u00f6r\u00fc ile \u00d6zel Olaylar F\u0131rlatma<\/h3>\n<p>Alt bile\u015fenden \u00fcst bile\u015fene veri g\u00f6ndermek veya bir eylemi bildirmek i\u00e7in \u00f6zel olaylar (custom events) kullan\u0131l\u0131r. <code>@Emit<\/code> dekorat\u00f6r\u00fc, bir metodun \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda otomatik olarak bir olay f\u0131rlatmas\u0131n\u0131 sa\u011flar. Metodun d\u00f6n\u00fc\u015f de\u011feri, olay\u0131n payload&#8217;\u0131 olarak g\u00f6nderilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ ChildComponent.vue\r\nimport { Component, Prop, Emit, Vue } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport default class ChildComponent extends Vue {\r\n  @Prop(Number)\r\n  readonly count!: number;\r\n\r\n  \/\/ @Emit() dekorat\u00f6r\u00fc, metodun ad\u0131n\u0131 olay ad\u0131 olarak kullan\u0131r (incremented)\r\n  @Emit()\r\n  incremented(newCount: number): number {\r\n    \/\/ Bu metot \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda 'incremented' olay\u0131 f\u0131rlat\u0131l\u0131r\r\n    \/\/ newCount de\u011feri, olay\u0131n payload'\u0131 olur\r\n    return newCount;\r\n  }\r\n\r\n  \/\/ \u00d6zel bir olay ad\u0131 belirtebilirsiniz\r\n  @Emit('reset-count')\r\n  resetCount(): void {\r\n    \/\/ Bu metot \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda 'reset-count' olay\u0131 f\u0131rlat\u0131l\u0131r\r\n    \/\/ D\u00f6n\u00fc\u015f de\u011feri void oldu\u011fu i\u00e7in payload olmaz\r\n  }\r\n\r\n  onClick(): void {\r\n    this.incremented(this.count + 1); \/\/ \u00dcst bile\u015fene yeni say\u0131y\u0131 g\u00f6nder\r\n  }\r\n\r\n  onReset(): void {\r\n    this.resetCount(); \/\/ \u00dcst bile\u015fene say\u0131y\u0131 s\u0131f\u0131rlama iste\u011fi g\u00f6nder\r\n  }\r\n}<\/code><\/pre>\n<p>\u00dcst bile\u015fende bu olaylar\u0131 dinleyebilirsiniz:<\/p>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <p>Ana Bile\u015fen Say\u0131s\u0131: {{ parentCount }}<\/p>\r\n    <ChildComponent :count=\"parentCount\" @incremented=\"handleIncrement\" @reset-count=\"handleReset\" \/>\r\n  <\/div>\r\n<\/template>\r\n\r\n<script lang=\"ts\">\r\nimport { Component, Vue } from 'vue-property-decorator';\r\nimport ChildComponent from '.\/ChildComponent.vue';\r\n\r\n@Component({\r\n  components: {\r\n    ChildComponent,\r\n  },\r\n})\r\nexport default class ParentComponent extends Vue {\r\n  parentCount: number = 0;\r\n\r\n  handleIncrement(newCount: number): void {\r\n    this.parentCount = newCount;\r\n  }\r\n\r\n  handleReset(): void {\r\n    this.parentCount = 0;\r\n  }\r\n}\r\n<\/script><\/code><\/pre>\n<h3>v-model Entegrasyonu: @VModel Dekorat\u00f6r\u00fc<\/h3>\n<p><code>v-model<\/code>, bir bile\u015fen \u00fczerinde iki y\u00f6nl\u00fc veri ba\u011flama sa\u011flamak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir direktiftir. S\u0131n\u0131f tabanl\u0131 bile\u015fenlerde, <code>@VModel<\/code> dekorat\u00f6r\u00fc ile bu i\u015flevselli\u011fi kolayca uygulayabilirsiniz. Bu dekorat\u00f6r, Options API&#8217;deki <code>model<\/code> se\u00e7ene\u011fine benzer \u015fekilde \u00e7al\u0131\u015f\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ CustomInput.vue\r\nimport { Component, VModel, Vue } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport default class CustomInput extends Vue {\r\n  \/\/ <code>value<\/code> prop'\u0131 ve <code>input<\/code> olay\u0131 i\u00e7in v-model entegrasyonu\r\n  @VModel({ type: String })\r\n  readonly value!: string;\r\n\r\n  \/\/ \u0130\u00e7sel bir metot, de\u011feri g\u00fcncelleyip \u00fcst bile\u015fene <code>input<\/code> olay\u0131 ile g\u00f6nderir\r\n  onInput(event: Event): void {\r\n    const target = event.target as HTMLInputElement;\r\n    this.$emit('input', target.value); \/\/ v-model'in bekledi\u011fi olay\r\n  }\r\n}<\/code><\/pre>\n<p>Bu <code>CustomInput<\/code> bile\u015fenini \u00fcst bile\u015fende <code>v-model<\/code> ile kullanabilirsiniz:<\/p>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <p>Girilen De\u011fer: {{ myText }}<\/p>\r\n    <CustomInput v-model=\"myText\" \/>\r\n  <\/div>\r\n<\/template>\r\n\r\n<script lang=\"ts\">\r\nimport { Component, Vue } from 'vue-property-decorator';\r\nimport CustomInput from '.\/CustomInput.vue';\r\n\r\n@Component({\r\n  components: {\r\n    CustomInput,\r\n  },\r\n})\r\nexport default class ParentComponent extends Vue {\r\n  myText: string = 'Ba\u015flang\u0131\u00e7 De\u011feri';\r\n}\r\n<\/script><\/code><\/pre>\n<h3>Referanslar (Refs): @Ref Dekorat\u00f6r\u00fc<\/h3>\n<p>Bazen do\u011frudan bir DOM eleman\u0131na veya alt bile\u015fen \u00f6rne\u011fine eri\u015fmeniz gerekebilir. Options API&#8217;de <code>ref<\/code> niteli\u011fi ve <code>this.$refs<\/code> kullan\u0131l\u0131rd\u0131. S\u0131n\u0131f tabanl\u0131 bile\u015fenlerde ise <code>@Ref<\/code> dekorat\u00f6r\u00fc bu i\u015fi yapar.<\/p>\n<pre><code class=\"language-typescript\">import { Component, Ref, Vue } from 'vue-property-decorator';\r\nimport ChildComponent from '.\/ChildComponent.vue'; \/\/ Varsayal\u0131m b\u00f6yle bir alt bile\u015fenimiz var\r\n\r\n@Component({\r\n  components: {\r\n    ChildComponent,\r\n  },\r\n})\r\nexport default class MyComponent extends Vue {\r\n  @Ref('myInput')\r\n  readonly inputElement!: HTMLInputElement; \/\/ DOM eleman\u0131na referans\r\n\r\n  @Ref('childComp')\r\n  readonly childComponent!: ChildComponent; \/\/ Alt bile\u015fen \u00f6rne\u011fine referans\r\n\r\n  mounted() {\r\n    \/\/ inputElement'e eri\u015fim\r\n    this.inputElement.focus();\r\n    console.log('Input de\u011feri:', this.inputElement.value);\r\n\r\n    \/\/ childComponent'e eri\u015fim ve bir metodunu \u00e7a\u011f\u0131rma\r\n    \/\/ this.childComponent.someChildMethod();\r\n  }\r\n}<\/code><\/pre>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <input ref=\"myInput\" type=\"text\" placeholder=\"Odaklanacak input\" \/>\r\n    <ChildComponent ref=\"childComp\" \/>\r\n  <\/div>\r\n<\/template><\/code><\/pre>\n<h2>Geli\u015fmi\u015f \u00d6zellikler<\/h2>\n<h3>G\u00f6zlemciler (Watchers): @Watch Dekorat\u00f6r\u00fc<\/h3>\n<p>Belirli bir veri \u00f6zelli\u011finin veya hesaplanm\u0131\u015f \u00f6zelli\u011fin de\u011fi\u015fimini izlemek ve bu de\u011fi\u015fimde bir fonksiyonu tetiklemek i\u00e7in g\u00f6zlemciler (watchers) kullan\u0131l\u0131r. <code>@Watch<\/code> dekorat\u00f6r\u00fc, Options API&#8217;deki <code>watch<\/code> se\u00e7ene\u011finin s\u0131n\u0131f tabanl\u0131 kar\u015f\u0131l\u0131\u011f\u0131d\u0131r.<\/p>\n<pre><code class=\"language-typescript\">import { Component, Watch, Vue } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport default class MyComponent extends Vue {\r\n  question: string = '';\r\n  answer: string = 'Sorana kadar cevap veremem.';\r\n\r\n  \/\/ 'question' \u00f6zelli\u011fini izle\r\n  @Watch('question')\r\n  onQuestionChanged(newValue: string, oldValue: string): void {\r\n    this.answer = 'D\u00fc\u015f\u00fcn\u00fcyorum...';\r\n    if (newValue.includes('?')) {\r\n      this.getAnswer();\r\n    }\r\n  }\r\n\r\n  \/\/ Derinlemesine izleme ve hemen \u00e7al\u0131\u015ft\u0131rma\r\n  @Watch('someObject', { deep: true, immediate: true })\r\n  onSomeObjectChanged(newValue: any, oldValue: any): void {\r\n    console.log('someObject de\u011fi\u015fti veya ilk y\u00fcklendi:', newValue);\r\n  }\r\n\r\n  async getAnswer(): Promise<void> {\r\n    this.answer = 'Y\u00fckleniyor...';\r\n    \/\/ Bir API \u00e7a\u011fr\u0131s\u0131 sim\u00fclasyonu\r\n    await new Promise(resolve => setTimeout(resolve, 1000));\r\n    this.answer = 'Evet!'; \/\/ Veya ger\u00e7ek bir cevap\r\n  }\r\n}<\/code><\/pre>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <p>Soru: <input v-model=\"question\" \/><\/p>\r\n    <p>Cevap: {{ answer }}<\/p>\r\n  <\/div>\r\n<\/template><\/code><\/pre>\n<h3>Mixins Kullan\u0131m\u0131<\/h3>\n<p>Mixins, Vue&#8217;da bile\u015fenler aras\u0131nda yeniden kullan\u0131labilir i\u015flevsellik da\u011f\u0131tmak i\u00e7in g\u00fc\u00e7l\u00fc bir yoldur. S\u0131n\u0131f tabanl\u0131 bile\u015fenlerde mixin&#8217;ler, <code>@Component<\/code> dekorat\u00f6r\u00fcn\u00fcn <code>mixins<\/code> se\u00e7ene\u011fi arac\u0131l\u0131\u011f\u0131yla kullan\u0131l\u0131r. Ancak, TypeScript ile mixin kullan\u0131rken tip g\u00fcvenli\u011fini sa\u011flamak biraz daha karma\u015f\u0131k olabilir. Genellikle, mixin&#8217;leri TypeScript s\u0131n\u0131flar\u0131 olarak tan\u0131mlay\u0131p, mixin&#8217;i kullanacak bile\u015fenin bu s\u0131n\u0131flardan t\u00fcremesi tercih edilir.<\/p>\n<pre><code class=\"language-typescript\">\/\/ MyMixin.ts\r\nimport { Vue, Component } from 'vue-property-decorator';\r\n\r\n@Component\r\nexport class MyMixin extends Vue {\r\n  mixinMessage: string = 'Ben bir mixin mesaj\u0131y\u0131m!';\r\n\r\n  mixinMethod(): void {\r\n    console.log(this.mixinMessage);\r\n  }\r\n\r\n  created() {\r\n    console.log('Mixin created hook \u00e7al\u0131\u015ft\u0131!');\r\n  }\r\n}\r\n\r\n\/\/ Component.vue\r\nimport { Component, Vue } from 'vue-property-decorator';\r\nimport { MyMixin } from '.\/MyMixin';\r\n\r\n@Component({\r\n  mixins: [MyMixin], \/\/ Mixin'i bile\u015fene dahil et\r\n})\r\nexport default class MyComponent extends Vue {\r\n  componentMessage: string = 'Ben bile\u015fen mesaj\u0131y\u0131m!';\r\n\r\n  mounted() {\r\n    console.log(this.mixinMessage); \/\/ Mixin'den gelen \u00f6zelli\u011fe eri\u015fim\r\n    this.mixinMethod(); \/\/ Mixin'den gelen metodu \u00e7a\u011f\u0131rma\r\n  }\r\n}<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, mixin&#8217;lerinizi tipli bir \u015fekilde kullanman\u0131za olanak tan\u0131r. Ancak, TypeScript ile mixin&#8217;ler karma\u015f\u0131k tip birle\u015fimlerine yol a\u00e7abilir; bu nedenle Composition API gibi alternatifler daha modern ve tipli \u00e7\u00f6z\u00fcmler sunabilir.<\/p>\n<h3>Provide\/Inject ile Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu<\/h3>\n<p>Vue&#8217;da provide\/inject, \u00fcst bile\u015fenlerin alt bile\u015fenlerine (derinlik fark etmeksizin) veri veya fonksiyon sa\u011flamas\u0131na olanak tan\u0131yan bir ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131d\u0131r. S\u0131n\u0131f tabanl\u0131 bile\u015fenlerde <code>@Provide<\/code> ve <code>@Inject<\/code> dekorat\u00f6rleri kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\/\/ ParentComponent.vue\r\nimport { Component, Provide, Vue } from 'vue-property-decorator';\r\nimport ChildComponent from '.\/ChildComponent.vue';\r\n\r\n@Component({\r\n  components: {\r\n    ChildComponent,\r\n  },\r\n})\r\nexport default class ParentComponent extends Vue {\r\n  @Provide()\r\n  \/\/ provideMessage, bu bile\u015fenin alt\u0131ndaki t\u00fcm bile\u015fenlere sa\u011flan\u0131r\r\n  provideMessage: string = 'Parent\\'tan gelen mesaj!';\r\n\r\n  @Provide('customKey') \/\/ \u00d6zel bir anahtar ile provide etme\r\n  providedNumber: number = 123;\r\n\r\n  @Provide()\r\n  \/\/ Bir metodu da provide edebilirsiniz\r\n  sayHello(name: string): string {\r\n    return <code>Merhaba, ${name}! Ben Parent.<\/code>;\r\n  }\r\n}<\/code><\/pre>\n<pre><code class=\"language-typescript\">\/\/ ChildComponent.vue\r\nimport { Component, Inject, Vue } from 'vue-property-decorator';\r\nimport GrandchildComponent from '.\/GrandchildComponent.vue';\r\n\r\n@Component({\r\n  components: {\r\n    GrandchildComponent,\r\n  },\r\n})\r\nexport default class ChildComponent extends Vue {\r\n  \/\/ Parent'tan provideMessage'\u0131 enjekte et\r\n  @Inject()\r\n  readonly provideMessage!: string;\r\n\r\n  \/\/ \u00d6zel anahtar ile enjekte et\r\n  @Inject('customKey')\r\n  readonly providedNumber!: number;\r\n\r\n  @Inject()\r\n  readonly sayHello!: (name: string) => string;\r\n\r\n  mounted() {\r\n    console.log('ChildComponent -> Enjekte edilen mesaj:', this.provideMessage);\r\n    console.log('ChildComponent -> Enjekte edilen say\u0131:', this.providedNumber);\r\n    console.log('ChildComponent -> Enjekte edilen metot:', this.sayHello('\u00c7ocuk'));\r\n  }\r\n}<\/code><\/pre>\n<pre><code class=\"language-html\"><template>\r\n  <div>\r\n    <p>Child Component: {{ provideMessage }}<\/p>\r\n    <GrandchildComponent \/>\r\n  <\/div>\r\n<\/template><\/code><\/pre>\n<p>Bu mekanizma, \u00f6zellikle derinlemesine i\u00e7 i\u00e7e ge\u00e7mi\u015f bile\u015fenler aras\u0131nda veri aktar\u0131m\u0131 yaparken prop drilling&#8217;i \u00f6nlemek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h2>Se\u00e7enekler API (Options API) ile Kar\u015f\u0131la\u015ft\u0131rma<\/h2>\n<p>Vue.js&#8217;te s\u0131n\u0131f tabanl\u0131 bile\u015fenler, Options API&#8217;ye alternatif bir yaz\u0131m bi\u00e7imi sunar. Her iki yakla\u015f\u0131m\u0131n da kendine g\u00f6re avantajlar\u0131 ve kullan\u0131m durumlar\u0131 vard\u0131r. Ancak s\u0131n\u0131f tabanl\u0131 yakla\u015f\u0131m\u0131n sundu\u011fu baz\u0131 belirgin avantajlar bulunmaktad\u0131r:<\/p>\n<ul>\n<li><strong>Tutarl\u0131l\u0131k ve Okunabilirlik:<\/strong> S\u0131n\u0131f tabanl\u0131 bile\u015fenlerde, bile\u015fenin t\u00fcm mant\u0131\u011f\u0131 (veri, metotlar, hesaplanm\u0131\u015f \u00f6zellikler, ya\u015fam d\u00f6ng\u00fcs\u00fc kancalar\u0131) tek bir s\u0131n\u0131f tan\u0131m\u0131 i\u00e7inde yer al\u0131r. Bu, Options API&#8217;deki gibi farkl\u0131 nesne anahtarlar\u0131 (<code>data<\/code>, <code>methods<\/code>, <code>computed<\/code>) aras\u0131nda gezinmek yerine, kodu yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru okuyarak bile\u015fenin t\u00fcm i\u015flevselli\u011fini anlamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>TypeScript ile Do\u011fal Uyum:<\/strong> S\u0131n\u0131flar, TypeScript&#8217;in tip sistemine do\u011fal olarak entegredir. Bu, geli\u015ftirme s\u0131ras\u0131nda daha g\u00fc\u00e7l\u00fc tip denetimi, otomatik tamamlama ve refactoring yetenekleri sa\u011flar. Options API&#8217;de TypeScript kullanmak m\u00fcmk\u00fcn olsa da, s\u0131n\u0131f tabanl\u0131 yakla\u015f\u0131m daha sorunsuz ve sezgisel bir deneyim sunar.<\/li>\n<li><strong>OOP \u0130lkeleri:<\/strong> Kal\u0131t\u0131m, soyutlama ve kaps\u00fclleme gibi nesne y\u00f6nelimli programlama ilkelerini uygulamak, s\u0131n\u0131f tabanl\u0131 bile\u015fenlerde daha kolayd\u0131r. Bu, \u00f6zellikle ortak i\u015flevselli\u011fe sahip bir\u00e7ok bile\u015fen oldu\u011funda kod tekrar\u0131n\u0131 azaltmaya ve daha mod\u00fcler bir yap\u0131 olu\u015fturmaya yard\u0131mc\u0131 olabilir.<\/li>\n<li><strong>Daha Az <code>this<\/code> Ba\u011flam\u0131 Sorunu:<\/strong> S\u0131n\u0131f metotlar\u0131, otomatik olarak s\u0131n\u0131f \u00f6rne\u011fine ba\u011fl\u0131d\u0131r. Options API&#8217;de bazen metotlarda <code>this<\/code> ba\u011flam\u0131 sorunlar\u0131yla kar\u015f\u0131la\u015f\u0131labilir (\u00f6zellikle callback fonksiyonlar\u0131nda), ancak s\u0131n\u0131f metotlar\u0131nda bu genellikle daha az bir problemdir.<\/li>\n<\/ul>\n<p>\u00d6te yandan, Options API, Vue&#8217;ya yeni ba\u015flayanlar i\u00e7in daha basit bir giri\u015f noktas\u0131 olabilir ve k\u00fc\u00e7\u00fck, basit bile\u015fenler i\u00e7in hala olduk\u00e7a etkilidir. Vue 3 ile birlikte gelen Composition API ise hem Options API&#8217;nin hem de s\u0131n\u0131f tabanl\u0131 yakla\u015f\u0131m\u0131n baz\u0131 avantajlar\u0131n\u0131 bir araya getirerek, i\u015flevselli\u011fi daha esnek bir \u015fekilde organize etme imkan\u0131 sunar.<\/p>\n<p>Se\u00e7im, projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fcne, ekibinizin al\u0131\u015fkanl\u0131klar\u0131na ve tercihlerinize ba\u011fl\u0131d\u0131r. Ancak b\u00fcy\u00fck, karma\u015f\u0131k ve tip g\u00fcvenli\u011finin kritik oldu\u011fu projelerde s\u0131n\u0131f tabanl\u0131 yakla\u015f\u0131m veya Composition API genellikle daha uygun \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<h2>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>S\u0131n\u0131f tabanl\u0131 Vue bile\u015fenleri yazarken, kodunuzun kalitesini art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir.<\/p>\n<h3>Tutarl\u0131l\u0131k<\/h3>\n<p>Projeniz genelinde s\u0131n\u0131f tabanl\u0131 bile\u015fenler kullanmaya karar verdiyseniz, bu yakla\u015f\u0131m\u0131 tutarl\u0131 bir \u015fekilde uygulay\u0131n. Kar\u0131\u015f\u0131k bir Options API ve Class API kullan\u0131m\u0131, kod taban\u0131n\u0131 karma\u015f\u0131kla\u015ft\u0131rabilir ve okunabilirli\u011fi azaltabilir. Ekibinizle bir stil rehberi belirleyin ve buna uyun.<\/p>\n<h3>Tip G\u00fcvenli\u011fini \u00d6n Planda Tutma<\/h3>\n<p>TypeScript&#8217;in g\u00fcc\u00fcnden tam olarak yararlan\u0131n. Prop&#8217;lar\u0131, veri \u00f6zelliklerini, metot parametrelerini ve d\u00f6n\u00fc\u015f tiplerini her zaman tiplendirin. <code>any<\/code> kullanmaktan ka\u00e7\u0131n\u0131n. Bu, hatalar\u0131 erken yakalaman\u0131za ve kodunuzun daha sa\u011flam olmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<pre><code class=\"language-typescript\">\/\/ K\u00f6t\u00fc\r\n\/\/ myData: any = {};\r\n\r\n\/\/ \u0130yi\r\ninterface User {\r\n  id: number;\r\n  name: string;\r\n  email: string;\r\n}\r\nuser: User | null = null;<\/code><\/pre>\n<h3>K\u00fc\u00e7\u00fck ve Odaklanm\u0131\u015f Bile\u015fenler Olu\u015fturma<\/h3>\n<p>Her bile\u015fenin tek bir sorumlulu\u011fu olmas\u0131na dikkat edin (Single Responsibility Principle). B\u00fcy\u00fck, monolitik bile\u015fenler yerine, daha k\u00fc\u00e7\u00fck ve yeniden kullan\u0131labilir alt bile\u015fenlere ay\u0131r\u0131n. Bu, hem okunabilirli\u011fi hem de test edilebilirli\u011fi art\u0131r\u0131r.<\/p>\n<h3>Dekorat\u00f6rleri Ak\u0131ll\u0131ca Kullanma<\/h3>\n<p><code>@Prop<\/code>, <code>@Emit<\/code>, <code>@Watch<\/code> gibi dekorat\u00f6rler kodunuzu d\u00fczenler ve niyetinizi a\u00e7\u0131k\u00e7a belirtir. Ancak, her \u015feyi dekorat\u00f6rlerle yapmak zorunda de\u011filsiniz. Basit veri \u00f6zellikleri veya metotlar i\u00e7in standart s\u0131n\u0131f syntax&#8217;\u0131n\u0131 kullanmak da tamamen kabul edilebilir.<\/p>\n<h3>Ya\u015fam D\u00f6ng\u00fcs\u00fc Kancalar\u0131n\u0131 Do\u011fru Kullanma<\/h3>\n<p>Hangi ya\u015fam d\u00f6ng\u00fcs\u00fc kancas\u0131n\u0131n ne zaman \u00e7a\u011fr\u0131ld\u0131\u011f\u0131n\u0131 anlay\u0131n ve i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 buna g\u00f6re yerle\u015ftirin. \u00d6rne\u011fin, DOM manip\u00fclasyonlar\u0131n\u0131 <code>mounted()<\/code> i\u00e7inde, d\u0131\u015f kaynaklar\u0131 temizlemeyi <code>beforeDestroy()<\/code> i\u00e7inde yap\u0131n.<\/p>\n<h3>Test Edilebilirlik<\/h3>\n<p>S\u0131n\u0131f tabanl\u0131 bile\u015fenler, genellikle Options API bile\u015fenlerinden daha kolay test edilebilir. Metotlar\u0131n\u0131z\u0131 ve \u00f6zelliklerinizi izole bir \u015fekilde test edebilece\u011finiz anlam\u0131na gelir. Testler yazarken bile\u015fenlerinizi ba\u011f\u0131ml\u0131l\u0131klardan ar\u0131nd\u0131rmaya \u00f6zen g\u00f6sterin.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Vue.js ve TypeScript ile s\u0131n\u0131f tabanl\u0131 bile\u015fenler yazmak, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar i\u00e7in g\u00fc\u00e7l\u00fc ve verimli bir yakla\u015f\u0131md\u0131r. TypeScript&#8217;in sundu\u011fu tip g\u00fcvenli\u011fi, s\u0131n\u0131f tabanl\u0131 yap\u0131n\u0131n getirdi\u011fi d\u00fczen ve <code>vue-property-decorator<\/code> gibi k\u00fct\u00fcphanelerin sa\u011flad\u0131\u011f\u0131 dekorat\u00f6rler sayesinde, daha okunabilir, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir bir kod taban\u0131 olu\u015fturabilirsiniz.<\/p>\n<p>Bu yakla\u015f\u0131m, nesne y\u00f6nelimli programlama ilkelerine yatk\u0131n geli\u015ftiriciler i\u00e7in do\u011fal bir uyum sa\u011flarken, ayn\u0131 zamanda modern JavaScript&#8217;in g\u00fcc\u00fcn\u00fc Vue ekosistemine ta\u015f\u0131r. Her ne kadar Vue 3 ile Composition API pop\u00fclerlik kazansa da, s\u0131n\u0131f tabanl\u0131 bile\u015fenler hala bir\u00e7ok projede ge\u00e7erli ve tercih edilen bir y\u00f6ntem olmaya devam etmektedir. Projenizin ihtiya\u00e7lar\u0131na ve ekibinizin deneyimine g\u00f6re do\u011fru yakla\u015f\u0131m\u0131 se\u00e7mek, ba\u015far\u0131l\u0131 bir uygulama geli\u015ftirmenin anahtar\u0131d\u0131r.<\/p>\n<p>Umar\u0131z bu makale, Vue.js ve TypeScript ile s\u0131n\u0131f tabanl\u0131 bile\u015fenlerin d\u00fcnyas\u0131na ad\u0131m atman\u0131z i\u00e7in size sa\u011flam bir temel sa\u011flam\u0131\u015ft\u0131r. \u0130yi kodlamalar!<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Giri\u015f: Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenlerin G\u00fcc\u00fc\n  Vue.js, esnekli\u011fi ve \u00f6\u011frenme kolayl\u0131\u011f\u0131 sayesinde modern web uygulama","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1402],"tags":[],"class_list":{"0":"post-30311","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-vue","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r\" \/>\n<meta property=\"og:description\" content=\"Giri\u015f: Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenlerin G\u00fcc\u00fc  Vue.js, esnekli\u011fi ve \u00f6\u011frenme kolayl\u0131\u011f\u0131 sayesinde modern web uygulama\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-26T13:18:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-26T13:20:04+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r\",\"datePublished\":\"2025-09-26T13:18:34+00:00\",\"dateModified\":\"2025-09-26T13:20:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/\"},\"wordCount\":2794,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Vue\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/\",\"name\":\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-09-26T13:18:34+00:00\",\"dateModified\":\"2025-09-26T13:20:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r","og_description":"Giri\u015f: Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenlerin G\u00fcc\u00fc  Vue.js, esnekli\u011fi ve \u00f6\u011frenme kolayl\u0131\u011f\u0131 sayesinde modern web uygulama","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-09-26T13:18:34+00:00","article_modified_time":"2025-09-26T13:20:04+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r","datePublished":"2025-09-26T13:18:34+00:00","dateModified":"2025-09-26T13:20:04+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/"},"wordCount":2794,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Vue"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/","name":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-09-26T13:18:34+00:00","dateModified":"2025-09-26T13:20:04+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ve-typescript-ile-sinif-tabanli-bilesenler-nasil-yazilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js ve TypeScript ile S\u0131n\u0131f Tabanl\u0131 Bile\u015fenler Nas\u0131l Yaz\u0131l\u0131r"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=30311"}],"version-history":[{"count":2,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30311\/revisions"}],"predecessor-version":[{"id":30313,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30311\/revisions\/30313"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}