작성
·
1.1K
1
let itemsReactive = reactive([
{ id: 1, name: '딸기1', check: true },
{ id: 2, name: '딸기2', check: true },
{ id: 3, name: '딸기3', check: true },
{ id: 4, name: '딸기4', check: true },
]);
const deleteItemReactive = id => {
let tempItems = itemsReactive.filter(item => item.id !== id);
itemsReactive = tempItems;
};
const updateItemReactive = id => {
let tempItem = itemsReactive.find(item => item.id === id);
tempItem.check = !tempItem.check;
};
위 코드에서 updateItemReactive 함수는 check값이 true, false 바뀌는 것을 확인할 수 있는데
deleteItemReactive 함수를 사용하면 반응이 안되고 있습니다.
vuejs devtools로 확인해보니까 바뀌기 전에는 ItemsReactive = Reactive이고 배열 안에 요소들은 Object인데
deleteItemReactive 함수를 실행하면
ItemsReactive = Array 이고 배열 안 요소들이 Reactive로 바뀌는 것을 확인했습니다. 왜 이렇게 나오는지 모르겠습니다.
답변 1
0
안녕하세요 :)
deleteItemReact 함수 호출시 반응이 안되는 이유는 itemsReactive = tempItems;
값(메모리) 자체를 변경하기 때문입니다.
만약 배열의 전체값을 변경하고 싶다면 아래 처럼 ref
함수를 사용하여 문제를 해결할 수 있습니다.
let itemsReactive = ref([
{ id: 1, name: '딸기1', check: true },
{ id: 2, name: '딸기2', check: true },
{ id: 3, name: '딸기3', check: true },
{ id: 4, name: '딸기4', check: true },
]);
const deleteItemReactive = (id) => {
let tempItems = itemsReactive.value.filter((item) => item.id !== id);
itemsReactive.value = tempItems;
};
const updateItemReactive = (id) => {
let tempItem = itemsReactive.value.find((item) => item.id === id);
tempItem.check = !tempItem.check;
};
관련하여 설명은 해당 강의 [반응형 기초 강의 5분 31초] 쯤 보시면 같은 맥락이기 때문에 한번 보시는 것을 권장드려요.
이렇게 반응이 안되는 이유는 자바스크립트 언어 특성상 변수에 새로운 값이 할당 하기 때문이에요.
(참고 Call By Value & Call By Reference)
감사합니다 🙂
안녕하세요 글쓰신분이랑 비슷한 생각을 해서 질문드립니다! 그러면 반영이 되지 않는 이유가 ItemsReactive가 가지고 있던 reactive 속성들이 새로운 데이터에 의해 덮어진거라고 생각을 하는게 맞는걸까요..?