React İle Web Uygulamaları İçin Dinamik Bir Anket Katılım Modülü Nasıl Yapılır?

React İle Web Uygulamaları İçin Dinamik Bir Anket Katılım Modülü Nasıl Yapılır?
React İle Web Uygulamaları İçin Dinamik Bir Anket Katılım Modülü Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 standartlarına uygun olarak, TypeScript desteği olan bir React projesi kullanmanızı öneriyoruz. Node.js'in en son LTS sürümünü ve paket yöneticisi olarak npm veya pnpm kullanmanız süreçteki uyumluluğu artıracaktır.

Gerekli araçlar şunlardır:

  • Node.js (v20 veya üzeri)
  • React 19 veya üzeri bir sürüm
  • Vite (hızlı geliştirme sunucusu için)
  • Opsiyonel: Form yönetimi için React Hook Form kütüphanesi

Anket Veri Yapısını Tanımlama

Dinamik bir modül oluşturmanın ilk adımı, verinin nasıl bir yapıda tutulacağını belirlemektir. Anket sorularını bir dizi (array) içerisinde nesneler olarak tutmak, modülün esnekliğini artırır. Aşağıdaki örnekte, farklı soru tiplerini destekleyen bir veri yapısı kurguluyoruz.

const surveyQuestions = [
  {
    id: 'q1',
    type: 'text',
    question: 'Uygulamamızı nasıl buldunuz?',
    required: true
  },
  {
    id: 'q2',
    type: 'radio',
    question: 'Hangi özelliği daha sık kullanıyorsunuz?',
    options: ['Dashboard', 'Ayarlar', 'Profil'],
    required: true
  }
];

Bu yapı, veritabanından gelen JSON formatındaki sorularla kolayca eşleşebilir. id alanı, yanıtları eşleştirmek için benzersiz bir anahtar görevi görür.

Dinamik Form Bileşeni Geliştirme

Şimdi, bu veriyi arayüze dökecek olan ana bileşeni oluşturuyoruz. React'in useState hook'u ile anket yanıtlarını yerel durumda tutacağız. Form bileşenimiz, soru tipine göre farklı input elemanları render etmelidir.

import { useState } from 'react';

const SurveyForm = ({ questions }) => {
  const [answers, setAnswers] = useState({});

  const handleChange = (id, value) => {
    setAnswers(prev => ({ ...prev, [id]: value }));
  };

  return (
    
      {questions.map(q => (
        
{q.question} {q.type === 'text' && ( handleChange(q.id, e.target.value)} /> )} {q.type === 'radio' && q.options.map(opt => (
handleChange(q.id, e.target.value)} /> {opt}
))}
))} ); };

Bu kod bloğu, questions dizisini döngüye alarak her soru için uygun HTML elementini üretir. handleChange fonksiyonu, kullanıcının yaptığı her değişikliği answers nesnesine güncel olarak işler.

Kullanıcı Girdilerinin Doğrulanması (Validation)

Bir anket modülünde verilerin doğruluğu kritiktir. Kullanıcı zorunlu alanları boş bırakmamalıdır. React'te basit bir doğrulama mantığı ile formun gönderilmesini engelleyebiliriz.

const handleSubmit = (e) => {
  e.preventDefault();
  const isInvalid = questions.some(q => q.required && !answers[q.id]);
  
  if (isInvalid) {
    alert('Lütfen tüm zorunlu alanları doldurun.');
    return;
  }
  console.log('Gönderilen Veri:', answers);
};

Bu fonksiyon, form gönderilmeden önce answers nesnesini kontrol eder. Eğer zorunlu bir alan eksikse, kullanıcıyı uyarır ve işlem durdurulur.

Güvenlik Uyarısı: Kullanıcıdan alınan verileri asla doğrudan DOM'a yazmayın. XSS (Cross-Site Scripting) saldırılarını önlemek için verileri her zaman sanitize edin ve sunucu tarafında mutlaka doğrulayın. İstemci tarafındaki doğrulama sadece kullanıcı deneyimi içindir, güvenlik için yeterli değildir.

Anket Yöntemlerinin Karşılaştırılması

Dinamik anket modülleri oluştururken farklı yaklaşımlar mevcuttur. Aşağıdaki tablo, farklı yöntemlerin avantaj ve dezavantajlarını özetlemektedir.

Yöntem Avantaj Dezavantaj
Yerel Durum (useState) Hızlı ve basit kurulum Karmaşık formlarda performans kaybı
React Hook Form Yüksek performans ve kolay doğrulama Ek kütüphane bağımlılığı
Formik Gelişmiş hata yönetimi Öğrenme eğrisi daha dik

Veri Gönderimi ve API Entegrasyonu

Anket yanıtlarını bir sunucuya göndermek için fetch veya axios kullanabilirsiniz. Veri gönderimi sırasında "yükleniyor" durumunu yönetmek, kullanıcıyı bilgilendirmek açısından önemlidir.

const submitSurvey = async (data) => {
  try {
    const response = await fetch('/api/survey-submit', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(data)
    });
    if (response.ok) alert('Anket başarıyla gönderildi!');
  } catch (error) {
    console.error('Hata:', error);
  }
};

Bu fonksiyon, veriyi JSON formatında sunucuya iletir. Sunucu tarafında gelen verinin tipini ve içeriğini kontrol etmek, güvenlik açısından en önemli adımdır.

Sıkça Sorulan Sorular

React anket modülünde performans nasıl optimize edilir?

Formun her tuş vuruşunda yeniden render olmasını engellemek için useMemo veya useCallback kullanabilir, büyük formlarda ise React Hook Form gibi kütüphanelere geçiş yaparak render sayısını minimize edebilirsiniz.

Anket soruları dinamik olarak nasıl güncellenir?

Soruları bir state içerisinde tutarak, bir API çağrısı sonrası bu state'i güncellediğinizde React otomatik olarak bileşeni yeniden render edecektir.

Çok adımlı (stepper) anket nasıl yapılır?

Anket sorularını gruplandırarak bir step state'i oluşturun. Her adımda sadece ilgili grubun sorularını göstererek kullanıcıyı yormayan bir akış oluşturabilirsiniz.

Veri güvenliği için ne yapmalıyım?

Kullanıcı verilerini gönderirken HTTPS protokolünü kullandığınızdan emin olun. Ayrıca, sunucu tarafında SQL Injection ve XSS saldırılarına karşı girdi temizleme (sanitization) işlemlerini mutlaka uygulayın.

React 19'un yeni özellikleri anket modülünü nasıl etkiler?

React 19 ile gelen "Actions" yapısı, form gönderimlerini çok daha kolay yönetmenizi sağlar. useActionState hook'u sayesinde form durumlarını (bekliyor, başarılı, hata) daha az kodla yönetebilirsiniz.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce, veritabanı güvenliği, yetkilendirme ve girdi doğrulaması gibi konularda profesyonel güvenlik standartlarını uyguladığınızdan emin olun.

Anket Modülünde İleri Seviye Hata Ayıklama ve İzleme

Dinamik anket modülleri, kullanıcıların farklı cihazlarda ve ağ koşullarında etkileşime girdiği karmaşık yapılardır. Uygulamanızın üretim ortamında (production) beklenmedik hatalar vermesini önlemek için hata ayıklama süreçlerini otomatize etmeniz gerekir.

ErrorBoundary ile Hata Yakalama

Anket bileşenlerinizden biri çöktüğünde tüm sayfanın beyaz bir ekrana dönüşmesini engellemek için React ErrorBoundary yapısını kullanmalısınız. Bu, özellikle dinamik olarak oluşturulan soru bileşenlerinde kritik öneme sahiptir.


class SurveyErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    console.error("Anket bileşeni hatası:", error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      return 
Anketi yüklerken bir sorun oluştu. Lütfen sayfayı yenileyin.
; } return this.props.children; } }

Anket Modülünü Test Etme Stratejileri

Dinamik formlar, kullanıcı girdilerine göre şekillendiği için uçtan uca (E2E) testler ile doğrulanmalıdır. Jest ve React Testing Library ikilisi, formun doğru şekilde render edilip edilmediğini kontrol etmek için idealdir.

Kullanıcı Etkileşimlerini Simüle Etme

Form elemanlarının doğru değerleri alıp almadığını test etmek için user-event kütüphanesini kullanabilirsiniz. Aşağıdaki örnek, bir anket seçeneğinin seçilip seçilmediğini kontrol eder:


import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import SurveyComponent from './SurveyComponent';

test('kullanıcı bir seçeneği işaretlediğinde form durumu güncellenir', async () => {
  render();
  const radioBtn = screen.getByLabelText(/Evet/i);
  await userEvent.click(radioBtn);
  expect(radioBtn).toBeChecked();
});

Test Kapsamı Tablosu

Test Türü Odak Noktası Araç
Birim Testi Validation fonksiyonları Jest
Bileşen Testi Form render ve state yönetimi React Testing Library
E2E Testi Kullanıcı akışı ve API entegrasyonu Playwright veya Cypress

Anket Modülü İçin İleri İpuçları

  • Debounce Kullanımı: Kullanıcı her tuşa bastığında API'ye istek atmak yerine, lodash.debounce kullanarak girdilerin tamamlanmasını bekleyin.
  • Yerelleştirme (i18n): Anket sorularını bir JSON dosyasında tutarak react-i18next ile çok dilli destek ekleyin.
  • Progressive Enhancement: JavaScript devre dışı kalsa bile temel form gönderiminin çalışması için formAction özelliklerini sunucu tarafı render (SSR) ile destekleyin.

Sonuç

React ile dinamik bir anket katılım modülü geliştirmek, bileşen yapısını anlamak ve durum yönetimini doğru kurgulamakla başlar. Bu rehberde, basit bir form yapısından başlayarak, veri doğrulama ve API entegrasyonuna kadar olan süreci inceledik. Bir sonraki adım olarak, bu modüle "çok adımlı form" (stepper) yapısını ekleyerek kullanıcı deneyimini daha da ileriye taşıyabilirsiniz. Başarılar dileriz.

Bu yazıya tepkinizi paylaşın:
Mert Demir

Teknik konuları sadeleştirerek geniş kitlelere ulaştırma konusunda tutkuluyum. Ev işleri, bakım ve organizasyon temalı rehberlerimde kaliteyi ön planda tutuyorum.

Yorumlar (0)

Yorum Yaz