OPEN HYPER STEP
← 목록으로 (Vue 3)
VUE · 23 / 34
vue
CHAPTER 23 / 34
읽기 약 2
FUNCTION

Vue 3 실전: 상태 관리 (Pinia 없이)


핵심 개념

provide/inject와 reactive로 전역 상태 관리를 구현합니다. Pinia 없이도 컴포넌트 간 상태 공유가 가능합니다. 전역 상태를 지우며 컴포넌트 간 동기화가 어떻게 끊기는지 확인하십시오.

코드 분석
VUE📋 코드 (38줄)
<div id='state' style='font-family:monospace;padding:16px;background:#0d1117;color:#e8e8e8'>
<div id='state-out'></div>
</div>
<script src='https://unpkg.com/vue@3/dist/vue.global.js'></script>
<script>
const{createApp,reactive,provide,inject,computed}=Vue;
const store={
  state:reactive({units:[],alertLevel:'LOW'}),
  addUnit(model,threat){this.state.units.push({id:Date.now(),model,threat});this.updateAlert();},
  removeUnit(id){this.state.units=this.state.units.filter(u=>u.id!==id);this.updateAlert();},
  updateAlert(){const max=Math.max(0,...this.state.units.map(u=>u.threat));this.state.alertLevel=max>=9?'CRITICAL':max>=7?'HIGH':max>=4?'MEDIUM':'LOW';}
};
const UnitList={
  setup(){const s=inject('store');return{s};},
  template:`<div>
    <div v-for='u in s.state.units' :key='u.id' style='display:flex;justify-content:space-between;padding:4px 0;font-size:11px;border-bottom:1px solid #111;'>
      <span style='color:#f59e0b;'>{{u.model}}</span>
      <span style='color:#888;'>{{u.threat}}</span>
      <button @click='s.removeUnit(u.id)' style='background:none;color:#10b981;border:none;cursor:pointer;font-size:10px;'>✕</button>
    </div>
  </div>`
};
createApp({
  components:{UnitList},
  setup(){
    provide('store',store);
    store.addUnit('T-800',8);store.addUnit('T-1000',10);
    const color=computed(()=>store.state.alertLevel==='CRITICAL'?'#10b981':store.state.alertLevel==='HIGH'?'#f59e0b':'#22c55e');
    const addRandom=()=>store.addUnit('T-'+Math.floor(Math.random()*900+100),Math.floor(Math.random()*10)+1);
    return{store,color,addRandom};
  },
  template:`<div>
    <div :style='{color:color}' style='font-size:12px;margin-bottom:12px;'>ALERT: {{store.state.alertLevel}}</div>
    <unit-list/>
    <button @click='addRandom' style='margin-top:8px;background:#333;color:#888;border:none;padding:6px 12px;cursor:pointer;font-size:10px;font-family:monospace;'>ADD RANDOM</button>
  </div>`
}).mount('#state-out');
</script>

AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

이 Vue 3 'Vue 3 실전: 상태 관리 (Pinia 없이)' 코드에서
반응성 시스템 관련 버그와 watch 누수를
찾아서 수정해줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

'Vue 3 실전: 상태 관리 (Pinia 없이)'를 활용한 실전 Vue 컴포넌트를
Composition API + script setup 문법으로 만들어줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

이 Vue 'Vue 3 실전: 상태 관리 (Pinia 없이)' 사용 패턴 전체를 분석하고
번들 크기·렌더링 성능·반응성 효율을
종합 점검해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

Vue 3 'Vue 3 실전: 상태 관리 (Pinia 없이)'가 React의 대응 기능 대비
어떤 장단점이 있는지 솔직하게 평가하고
실무 선택 기준을 알려줘.

⭐ 이것만 기억하세요
Vue 3 실전: 상태 관리 (Pinia 없이) 이 3가지만 확실히 잡으세요
1.컴포넌트마다 독립된 상태를 갖고 있으면 같은 데이터를 여러 곳에서 동기화해야 하는 문제가 생깁니다
2.reactive 객체를 모듈 스코프에 선언하고 Composable로 export하면 Pinia 없이도 글로벌 상태를 공유할 수 있습니다
3.다음 챕터에서 마우스로 요소를 끌어 재배치하는 드래그 앤 드롭을 구현합니다


공유하기
진행도 23 / 34