개발자정보

React 17.0.2 + TypeScript 4.3.5 + MobX 조합으로 작성된 예제이며, observer를 사용한 함수형 컴포넌트(const Monitor = observer(() => {...}) 버전입니다.요구사항을 충족합니다:모니터링 주기: DAILY, WEEKLY, MONTHLY 라디오Start Time 입력은 항상 표시WEEKLY 선택 시 요일 라디오MONTHLY 선택 시 1~31일 콤보박스

쿠카곰돌이 2025. 5. 27. 09:32
반응형

monitorStore.ts

import { makeAutoObservable } from "mobx";

export type MonitoringCycle = 'DAILY' | 'WEEKLY' | 'MONTHLY';

export class MonitorStore {
  cycle: MonitoringCycle = 'DAILY';
  startTime: string = '';
  dayOfWeek: string = 'MON';
  dayOfMonth: number = 1;

  constructor() {
    makeAutoObservable(this);
  }

  setCycle = (cycle: MonitoringCycle) => {
    this.cycle = cycle;
  };

  setStartTime = (time: string) => {
    this.startTime = time;
  };

  setDayOfWeek = (day: string) => {
    this.dayOfWeek = day;
  };

  setDayOfMonth = (day: number) => {
    this.dayOfMonth = day;
  };
}

export const monitorStore = new MonitorStore();

 

Monitor.tsx

import React from 'react';
import { observer } from 'mobx-react-lite';
import { monitorStore } from './monitorStore';

export const Monitor = observer(() => {
  const store = monitorStore;

  const handleCycleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    store.setCycle(e.target.value as any);
  };

  const handleStartTimeChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    store.setStartTime(e.target.value);
  };

  const handleDayOfWeekChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    store.setDayOfWeek(e.target.value);
  };

  const handleDayOfMonthChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
    store.setDayOfMonth(Number(e.target.value));
  };

  const renderDayOfWeekOptions = () => {
    const days = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'];
    return (
      <div>
        <label>요일 선택: </label>
        {days.map(day => (
          <label key={day} style={{ marginRight: 10 }}>
            <input
              type="radio"
              name="dayOfWeek"
              value={day}
              checked={store.dayOfWeek === day}
              onChange={handleDayOfWeekChange}
            />
            {day}
          </label>
        ))}
      </div>
    );
  };

  const renderDayOfMonthOptions = () => {
    return (
      <div>
        <label>날짜 선택: </label>
        <select value={store.dayOfMonth} onChange={handleDayOfMonthChange}>
          {Array.from({ length: 31 }, (_, i) => i + 1).map(day => (
            <option key={day} value={day}>
              {day}일
            </option>
          ))}
        </select>
      </div>
    );
  };

  return (
    <div style={{ padding: 20, fontFamily: 'Arial' }}>
      <h3>모니터링 주기 설정</h3>

      <div style={{ marginBottom: 10 }}>
        <label>주기 선택: </label>
        {(['DAILY', 'WEEKLY', 'MONTHLY'] as const).map((type) => (
          <label key={type} style={{ marginRight: 10 }}>
            <input
              type="radio"
              name="cycle"
              value={type}
              checked={store.cycle === type}
              onChange={handleCycleChange}
            />
            {type}
          </label>
        ))}
      </div>

      <div style={{ marginBottom: 10 }}>
        <label>Start Time: </label>
        <input
          type="text"
          value={store.startTime}
          onChange={handleStartTimeChange}
          placeholder="HH:mm"
        />
      </div>

      {store.cycle === 'WEEKLY' && renderDayOfWeekOptions()}
      {store.cycle === 'MONTHLY' && renderDayOfMonthOptions()}
    </div>
  );
});

 

반응형