• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

토글 부분에서 리팩토링이 되지 않아 질문드립니다.

23.04.06 16:34 작성 23.04.06 17:24 수정 조회수 200

1

저는 getTime() 으로 타임을 받아서 value 부분을 객체로 만들어서 넘기고 있었습니다.

store에서 sort 기능을 추가하였고

완료된건을 아래로 넘기는 작업을하고 완료되지않은 건은 위로 올려서 나뉘게 작업하였습니다.

그런대 이전에 store을 쓰지않을때는 단순하게 토글할때 sort를 함수로 만들어서 호출하였더니 잘되었습니다.

store에 함수로 만들고 호출하고 나서는 리팩토링이 되지 않습니다 ㅠㅠ

새로고침했을때는 잘 작동합니다. 또한 console창에도 바뀐 로직으로 잘 뜹니다.

toggleOneItem 부분 봐주시면 감사합니다

fetch부분에서는 잘되어서 리스트 가져올땐 잘되었는대 ㅠㅠ 토글하면서 잘 안돼더라구요!

제가 어떤것을 실수 했을까요..?

 

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);
//글로벌하게 Vuex를 쓰겠다는 의미
//해당 라이브러리를 사용하기 위한 초기화 코드를 실행하는 구문
//뷰에 연결해야 vuex를 사용할 수 있다
let sortItem = [];

function sortlist(state) {
    const trueItem = state.filter(
        (item) => item.completed === true
    );
    const falseItem = state.filter(
        (item) => item.completed === false
    );

    trueItem.sort(function (a, b) {
        return b.value.time - a.value.time; //내림차순
    });

    falseItem.sort(function (a, b) {
        return b.value.time - a.value.time; //내림차순
    });
    sortItem = [...falseItem, ...trueItem];
    return  sortItem;
}
const storage = {
    fetch() { //네트워크의 리소스를 쉽게 비동기적으로 가져오기
        //app에 있는 created를 store에 붙이기
        let arr = [];
        if (localStorage.length > 0) {
            for (let i = 0; i < localStorage.length; i++) {
                if (localStorage.key(i) !== "loglevel:webpack-dev-server") {
                    const item = localStorage.getItem(localStorage.key(i));
                    arr.push(JSON.parse(item)); //arr배열을 만들어서 푸시해주기
                    sortlist(arr);  
                }
            }
        }
        return sortItem; // {} 단위밖에서는 arr을 호출할 수 없으므로 return 반환
    },
};

// //다른 컴포넌트에서 this.$store 로 사용할 수 있음

export const store = new Vuex.Store({
    state: {
        headText: "TODO it!", //헤더에 들어갈 값 등록하기
        //todoItems: [],
        todoItems: storage.fetch(), //위에 만들어준 값을 넣어준다
    },
    getters: {
        getTotalNum(state) { //인자는 state
            return state.todoItems.length;
        },
        getTrueNum(state) { //인자는 state
            const trueItem = state.todoItems.filter(
                (item) => item.completed === true
            );
            return trueItem.length;
        },
    },
    mutations:{
        addOneItem(state, value) { 
            //console.log(value)
            const obj = { completed: false, value: value }; //const를 쓰면 재선언할 수 없어 디버깅할 때 충돌을 줄일 수 있음
            //오브젝트로 만들어줬기 때문에 obj를 찍게 되면 object object가 찍힘, 따라서 문자열로 변환해 주는것
            localStorage.setItem(value.item, JSON.stringify(obj)); //JavaScript 값이나 객체를 JSON 문자열로 변환
            if(!state.todoItems.some(element => element.value.item == value.item)){
                state.todoItems.unshift(obj);
            }else{
                alert('이미 작성된 내용입니다.');
            }           
        },
        removeOneItem(state, payload) {
            //console.log(payload);
            localStorage.removeItem(payload.todoItem.value.item); //객체일때 로컬스트리지에서 삭제하기
            state.todoItems.splice(payload.index, 1); //현재 리스트에서 삭제하기
        },
        toggleOneItem(state, payload) {
            //todoItem.completed = !todoItem.completed; //이벤트로 넘어온값을 바꾸는 것을 안티패턴이라고 하며 어짜피 props로 내려준 값이 변경되므로 아래와같이 변경한것
            state.todoItems[payload.index].completed = !state.todoItems[payload.index].completed;
            //localStorage 갱신하기
            localStorage.removeItem(payload.todoItem.value.item); //localStorage는 업데이트 기능이 없으므로 삭제 후
            localStorage.setItem(payload.todoItem.value.item, JSON.stringify(payload.todoItem)); //새로 추가해준다, 이때 completed 값이 바꼈으므로 바뀐값이 들어오게 된다.
            sortlist(state.todoItems); //리팩토링이안돼네...추후에 해결할것 ㅠㅠ
        },
        clearAllItems(state) {
            localStorage.clear();
            state.todoItems = [];
        },
    },
});

답변 1

답변을 작성해보세요.

0

안녕하세요, 강의 내용을 따라하지 않고 직접 작성하신 건 제가 봐드리기가 어려울 것 같아요.. 코드가 의도하시는 대로 동작을 안하면 중간 중간 debugger나 console.log()로 값을 확인해 가면서 디버깅해 보시겠어요? 그리고 filter().sort() 형태로 체이닝 하시는게 더 간결한 코드가 될 것 같습니다 :)