inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex

리스트 제거 전 경고창이 나오도록 만들어 보았는데요

해결된 질문

687

hhhitihh

작성한 질문수 6

1



삭제 버튼을 누를 시 모달창이 뜨면서 해당 리스트가 'toDelete'에 저장되고, 
모달창에서 '진행하기' 버튼을 누르면 'toDelete'에 저장된 리스트를 지우는 방식으로 해결하였습니다.
일단 지금 코드만으로도 원하는 대로 작동도 잘 되긴 하는데, 

모달창과 트렌지션 그룹이 각기 분리되어 있어,
트랜지션 그룹 내부 li에 선언된 반복문 index와
해당 인덱스가 지닌 값 addedItem 을
직접 모달창에서 받을 수 있도록 전달하는 방법을 몰라서
이렇게 했는데, 혹시 방법이 있을까요?

만약 전달이 가능하다면
toDelete라는 객체를 굳이 선언할 필요가 없고 코드가 더 깔끔해지지 않을까 싶네요. 

아니면, 더 깔끔한 방법은 없을지? 

몇 차례의 시도 중에 li 안에 모달창을 선언하는 것도 해봤는데,
그렇게 하니까 모달창이 storedItem의 개수만큼 늘어나는데다 작동이 안되네요. 

아래는 코드입니다.  

<template>

  <div>

    <transition-group name="list" tag="ul">

      <li v-for="(addedItem, index) in this.storedItems" v-bind:key="addedItem.item">

        <span v-on:click="toggleComplete({addedItem, index})" v-bind:class="{checkCompleted: addedItem.completed}">완료</span>

        <span v-bind:class="{textCompleted: addedItem.completed}">{{addedItem.item}}</span>

        <span class="remove" v-on:click="showDeleteInfo(addedItem, index)">삭제</span>    

      </li>

    </transition-group>

    <DeleteModal v-if="showModal2" @close="showModal2 = false">

      <h3 slot="header">

        경고!

        <i class="closeModalBtn fas fa-times" @click="showModal2 = false, cancelDeletion()"></i>

      </h3>

      <p slot="body">

        {{toDelete.value.item}}의 삭제를 진행하시겠습니까?<br>

        이 작업은 되돌릴 수 없습니다. 

      </p>

      <button slot="deleteInfo" v-on:click="removeItemByModal()" @click="showModal2 = false">

        진행하기

      </button>

    </DeleteModal><!--리스트 삭제 경고 모달창-->

  </div>

</template>

<script>

import { mapGetters, mapMutations } from 'vuex'

import DeleteModal from './common/Modal.vue' // 트랜지션 모달 임포트

export default {

  data(){

    return{

      toDelete:{

        value:'',

        indexOfValue:''

      }, // 삭제 버튼을 누른 리스트의 정보를 담는 곳

      showModal2: false,

    }

  },

  methods:{

    showDeleteInfo(addedItem, index){

      this.toDelete.indexOfValue = index; // 삭제 버튼을 누른 리스트의 인덱스

      this.toDelete.value = JSON.parse(sessionStorage.getItem(addedItem.item)); 

      // 삭제 버튼을 누른 리스트가 가진 정보

      this.showModal2 = !this.showModal2; // 모달창 토글

      console.log(this.toDelete);

    },

    cancelDeletion(){ // 취소 시 저장된 정보 제거

      this.toDelete.indexOfValue = '';

      this.toDelete.value = '';

      console.log(this.toDelete);

    },

    ...mapMutations({

      removeItems: 'removeOneItem',

      toggleComplete: 'toggleOneItem' 

    }),

    removeItemByModal(){

      sessionStorage.removeItem(this.toDelete.value.item);

      this.storedItems.splice(this.toDelete.indexOfValue, 1) 

      // 삭제 대기로 저장된 리스트 제거 

    },

  },

  computed:{

    ...mapGetters(['storedItems'])

  },

  components:{

    DeleteModal

  }

}

</script>

컨펌창 vuex es6 vuejs javascript

답변 1

0

캡틴판교

안녕하세요 hhh님, 좋은 질문이네요 :) 보통은 모달 안에 데이터를 넘기는 것보다 모달의 액션을 바깥 컴포넌트에 알려줘서 해당 데이터를 조작하는 것이 더 컴포넌트 활용도를 높일 수 있습니다. 이 부분 유의해서 컴포넌트를 설계해 보시면 좋을 것 같아요! :)

Chrome 개발자 모드 확장이 안됨

0

251

1

깃 권한 요청드립니다

0

118

1

vue.js 중급 리포지토리 권한 관련

0

118

1

vuex + axios 질문 있습니다!

1

198

2

깃 권한 요청드립니다!

0

161

1

강의 깃주소 문의

0

142

1

router-view에 props를 어떻게 넘길 수 있나요?

1

277

2

Vue가 인식되지 않는 현상

0

205

1

기초강좌는 어디있나요?

1

190

2

App.vue가 필요한 이유

0

192

1

getter가 정의되어 있지 않아 오류가 발생합니다.

1

253

1

뷰 라이프사이클

1

187

1

TSLint 말고 TSLint Vue 설치해도 되나요?

1

367

3

로컬 스토리지는 어디에 있나요?

1

279

1

vuex 실행시 새로고침해야지만 리스트에 나타나는 현상

1

387

2

export default 관련한 질문

0

354

2

깃허브 vue-todo 접근불가에 따른 확인요청

1

354

2

깃허브에 문제있는것 같습니다.

1

273

2

인프런 강의 재생 화면 구성 변경 문의드립니다

1

302

2

addTodo Helper 함수 적용

1

242

1

vuex 헬퍼 전역 설정

1

244

2

github 권한요청드립니다.

1

255

2

이벤트 위치에 대한 궁금증 입니다.

1

220

2

구조 차이에 대한 문의

1

343

2