Props는 부모 컴포넌트에서 자식 컴포넌트의 값을 변경해도 괜찮지만, 자식에서 부모의 값을 변경하는것은 하지말라고 한다.
<input class="CheckInput"
v-model="todolist.isdone"
type="checkbox">
//TodoList.vue
기존의 코드에서 v-model을 통하여 todolist.isdone값의 수정을 하였으나,
todolist[]는 부모컴포넌트인 App.vue에 있다.
따라서 v-model 대신 index값을 부모컴포넌트로 전달하여, 부모컴포넌트 안에서 수정을 하려고 한다.
<ul class="list-group "
v-for="(i,index) in todolist"
v-bind:key="i.id">
<li class="list-group-item d-flex align-items-center mt-2">
<div class="form-check flex-grow-1">
<input class="CheckInput"
:value="todolist.isdone"
@change="toggleTodo(index)"
type="checkbox">
<label class="checkLabel"
:class="{todoStyle:i.isdone}"
>{{i.sbj}} </label>
</div>
<div>
<button class= "btn btn-danger btn-sm"
@click="deleteitem(index)">삭제</button>
</div>
</li>
</ul>
//TodoList.vue (자식)
:value (v-bind:value) 로 todolist.isdone을 지정하여주고
@change(v-on:change)로 체크박스에 변화가 있을떄 toggleTodo함수를 index를 매개변수로 호출한다
setup(props,context){
const toggleTodo = (index)=>{
context.emit('toggle-todo',index);
};
return {
toggleTodo,
}
}
//Todolist.vue Script
setup function에서 ToggleTodo 함수를 선언하고 (index)매개변수를 받는다,
context.emit으로 부모 컴포넌트에게 toggle-todo라는 이벤트명으로 index값을 전달한다.
부모는 이를 수신하기 위하여 v-on:이벤트명을 호출
<TodoList :todolist="todolist" @toggle-todo="toggleTodo" />
//app.vue
@toggle-todo로 이벤트를 호출하고 부모컴포넌트에서 toggleTodo 함수를 호출한다.
var toggleTodo=(index)=>{
todolist.value[index].isdone=!todolist.value[index].isdone
};
//app.vue Script
toggleTodo를 선언하고 이벤트로 담겨온 index를 매개변수로 사용,
todolist배열의 index번째의 isdone(T/F)값을 Not을 통하여 바꿔준다.
선생님의 도움을 받아서 자문을 구한결과
기존의 setup 및 emit방식은 구방식이라
자식 컴포넌트의 TodoList.vue 수정을 하였다.
<script setup>
import { defineProps, defineEmits } from "vue";
const props = defineProps({
todolist: {
type: Array,
required: true,
},
});
const emit = defineEmits(["toggle-todo"]);
const toggleTodo = (index) => {
emit("toggle-todo", index);
};
//props:['todolist']//받아오는 이름 + 위에서 사용하는 이름 props는 return역할을 함께함
</script>
<script setup>
요 setup을 script에 넣어버리고
단 emit의 경우 context에 있었기 때문에
import { defineProps, defineEmits } from "vue";
따로 import를 해주어야한다.
총평 : 진자 진자 강의 들으면서 일단 따라쓰고 복기하는데 너무 어렵다...
더 자세한 설명은 유튜브 코지 코더 Kossie Coder 강의를 수강하면 도움이 될듯..?
'FrontEnd > Vue3' 카테고리의 다른 글
Vue3 To do list 만들기 (9) DB연결 및 추가, 삭제 async await 을 곁들인 (0) | 2022.06.24 |
---|---|
Vue3 To do list 만들기 (8) 검색기능 추가하기 (0) | 2022.06.24 |
Vue3 To do list 만들기 (6) props 부모->자식 데이터 전송 (0) | 2022.06.23 |
Vue3 To do list 만들기 (5) 데이터 emit (자식 컴포넌트 ->부모 컴포넌트) (0) | 2022.06.21 |
Vue3 컴포넌트 만들기 (0) | 2022.06.21 |