inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

[퀴즈] slot 퀴즈 풀이 및 모달 컴포넌트 기능 구현

중복 값을 넣었을 때 inputText 유지 하는 방법 좀 가르쳐 주세요.

562

k22

작성한 질문수 1

0

안녕하세요 선생님

저는 inputText에 값을 넣고 이벤트를 실행 했을 경우
중복 값이 있는 경우 : Modal 창 띄우고 inputText 값 유지
중복 값이 없는 경우 : 기존 로직 실행
을 하려고 합니다.
TodoInput.vue에서 이벤트를 주고 App.vue에서 중복 체크   한 후 validate 값을 props를 통하여 TodoInput.vue에 전달 하였습니다. 
화면에 보여졌을때나 devTools의 vue를 보면 props 값이 부모와 일치 한데 메소드에서 props를 사용하려고 하면 부모 데이터의 이전 값이 표시가 됩니다. 메소드에서 부모와 동일한 props 데이터를 받는 방법이 있을까요?
소스 보시고 답변 해주시면 감사하겠습니다.

App.vue

<template>
  <div id="app">
    <TodoHeader></TodoHeader>
    <TodoInput v-on:addTodoItem="addOneItem" v-bind:propsdata="validate" ></TodoInput> <!-- propsdata 선언 -->
    <TodoList v-bind:propsdata="todoItems" v-on:removeItem="removeOneItem" v-on:toggleItem="toggleOneItem"></TodoList>
    <TodoFooter v-on:clearAll="clearAllItems"></TodoFooter>

    <Modal v-if="showModal" @close="showModal = false">
        <!--
        you can use custom content here to overwrite
        default content
        -->
        <h3 slot="header">
            경고!
            <i class="closeModalBtn fas fa-times " @click="showModal = false"></i>
        </h3>
        <h3 slot="body">
            {{ message }}
        </h3>
    </Modal>
  </div>
</template>

<script>
import TodoHeader from './components/TodoHeader.vue';
import TodoInput from './components/TodoInput.vue';
import TodoList from './components/TodoList.vue';
import TodoFooter from './components/TodoFooter.vue';
import Modal from './components/common/Modal.vue'

export default {
  data: function() {
    return {
      todoItems: [],
      showModal: false,
      message: '',
      validate: false //중복 체크 값 선언
    }
  },
  methods: {
    addOneItem: function(todoItem) {
      var obj = {completed: false, item: todoItem};
      localStorage.setItem(todoItem, JSON.stringify(obj));
      
      // todoItems에 이미 같은 값이 있는지 체크      
      if(!this.todoItems.some(data => data.item == todoItem)) {
        this.todoItems.push(obj)
        this.validate = false; // 중복 체크 값 입력
      } else {
        this.message = '중복 데이터가 존재 합니다. 중복 데이터 : [' + todoItem + ']'
        this.showModal = !this.showModal;
        this.validate = true; // 중복 체크 값 입력
      }
      console.log('App.vue data : ' + this.validate); // 중복 체크 값 Log 출력
    },
    removeOneItem: function(todoItem, index) {      
      localStorage.removeItem(todoItem.item);
      this.todoItems.splice(index, 1);
    },
    toggleOneItem: function(todoItem, index) {
      // todoItem.completed = !todoItem.completed; // 같은 동작
      this.todoItems[index].completed = !this.todoItems[index].completed;
      // 로컬 스토리지의 데이터를 갱신
      localStorage.removeItem(todoItem.item);
      localStorage.setItem(todoItem.item, JSON.stringify(todoItem));
    },
    clearAllItems: function() {
      localStorage.clear();
      this.todoItems = [];
    }
  },
  created: function() {
    if(localStorage.length > 0) {
        for(var i=0;i<localStorage.length;i++) {
            if(localStorage.key(i) !== 'loglevel:webpack-dev-server') {
                // console.log(JSON.parse( localStorage.getItem(localStorage.key(i))));
                this.todoItems.push(JSON.parse(localStorage.getItem(localStorage.key(i))));
                // this.todoItems.push(localStorage.key(i));
            }
        }
    }
  },
  components: {
    //  컴포넌트 태그명 : 컴포넌트 내용
    'TodoHeader': TodoHeader,
    'TodoInput': TodoInput,
    'TodoList': TodoList,
    'TodoFooter': TodoFooter,
    Modal: Modal
  }
}
</script>

TotoInput.vue

<template>
  <div class="inputBox shadow">
    <input type="text" v-model="newTodoItem" v-on:keyup.enter="addTodo">
    <!-- <button v-on:click="addTodo">add</button> -->
    <span class="addContainer" v-on:click="addTodo">
        <i class="fas fa-plus addBtn"></i> 
    </span>

    <Modal v-if="showModal" @close="showModal = false">
        <!--
        you can use custom content here to overwrite
        default content
        -->
        <h3 slot="header">
            경고!
            <i class="closeModalBtn fas fa-times " @click="showModal = false"></i>
        </h3>
        <h3 slot="body">
            아무것도 입력하지 않으셨습니다.
        </h3>
    </Modal>
  </div>
</template>

<script>
import Modal from './common/Modal.vue'

export default {
    props: ['propsdata'], // propsdata 생성
    data: function() {
        return {
            newTodoItem: "",
            showModal: false,
            propsd: this.propsdata
        }
    },
    methods: {
        addTodo: function() {
            if(this.newTodoItem !== '') {
                this.$emit('addTodoItem'this.newTodoItem);
                
                console.log('TotoInput.vue data : ' + this.propsdata); // propsdata Log 출력
               // 중복이 아닐 경우에만 Text Clear
if(!this.propsdata) {
                    this.clearInput();
                }
            }
            else {
                this.showModal = !this.showModal;
            }
        },
        clearInput: function() {
            this.newTodoItem = '';
        }
    },
    components: {
        Modal: Modal
    }
}
</script>

결과

vuejs vuex javascript es6

답변 0

Chrome 개발자 모드 확장이 안됨

0

253

1

깃 권한 요청드립니다

0

118

1

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

0

118

1

vuex + axios 질문 있습니다!

1

198

2

깃 권한 요청드립니다!

0

161

1

강의 깃주소 문의

0

142

1

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

1

278

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

303

2

addTodo Helper 함수 적용

1

242

1

vuex 헬퍼 전역 설정

1

244

2

github 권한요청드립니다.

1

255

2

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

1

222

2

구조 차이에 대한 문의

1

343

2