vue3 setup pinia props & emit 사용법 예제
view 에서만 모든걸 다뤄버리면 너무 난해해지고 ,,, 또 setup 쓰다보니 코드가 스파게티.. 완전 난리도아니었다
그래서 컴포넌트로 최대한 뺐는데
사실 props 는 종종 썼었는데 emit 은 사용안해봤어서 정리해보려고 한다
예제는 모달창띄우기.
// view 부모컴포넌트
<simple-modal
v-model="modalFunc.flag.value"
// props , 자식컴포넌트에선 value 라는 이름으로 받으면 된다
:value="modalFunc.data.value"
// emit , 자식컴포넌트에선 closeModal 이라는 이름으로 올려주면 된다
@closeModal="modalFunc.close()"
@openModal="modalFunc.open()"
@submitModal="modalFunc.submit()"
/>
<script setup>
const modalFunc = {
flag: ref(false),
data: ref(''),
// 단순히 클로즈가 아니라 온오프 기능을 함께 가지고 있게 할수도있겠고...
close: () => {
modalFunc.flag.value = false
},
// 오픈은 val 을 통해서 어떤 data를 가진 modal을 띄울지 정한다
open: (val) => {
modalFunc.flag.value = true
modalFunc.data.value = val
}
// submit같은경우는 그냥 자식컴포넌트로 내려버려도 괜찮을듯...
// 단 위에서 다른 컴포넌트랑 상호작용해야하는것들만 위로 올리기
submit: (val) => {
// 이런느낌으로???
otherModal.open('welcome')
modalFunc.flag.value = true
}
}
부모컴포넌트 대강 만들었던거랑 유사하게 만들었는데
원래는 플래그고 데이터고 클로즈 오픈 다 떨어져있어서 여기저기 왔다갔다 해야해서 짜증났었는데 그냥 하나로 묶어버렸다...
코드가 좀 길어질 수 있다는 단점이 있는데 여기저기 코드찾으러 안다녀도 되니까 정말 편하다...
그리고 최대한 자식컴포넌트한테 많은걸 넘겨주고싶었는데 그건 좀 ... 힘들었다
자식컴포넌트는
// 이런식으로 하면 중간값이 변수여도 잘 나옴 []안에 값을 잘 넣어보자
{{ modalType[props.value].title }}
{{ modalType[props.value].text }}
<script setup>
// props는 defineProps를 통해서 적용한다 사용은 props.value 이런식으로
const props = defineProps({
value: {
type: String,
required: true
}
})
// 위로 올려줄 이벤트 이름 작성
let emit = defineEmits(['closeModal' , 'openModal', 'submitModal' ])
function closeModal() {
// 이 안에 다른 로직 넣어도 실행된다
emit('closeModal')
}
function openModal() {
emit('openModal')
}
function submitModal() {
// 서브밋같은경우에 변경사항이 있다면 이쪽에 적어주는것도 좋은 방법
// 서브밋버튼을 누를시 router.push 한다던가... 하는 방식
emit('submitModal')
}
// prop.value를 통해 home, hello, bye 중 어떤걸 내보낼지 정함
const modalTyep = {
home: {
title: ~~
text: ~~
},
hello: {
title: ~~
text: ~~
},
bye: {
title: ~~
text: ~~
}
}
이런식으로 최대한 컴포넌트에 많은것들을 주려고 했으나 마냥 쉽지만은 않았다.
이번엔 코드 수정을 통해 이렇게 나왔는데 다음엔 짤때부터 이 기반으로 짜고 그 이후에 수정을 통해 업그레이드 해야겠다