728x90
반응형

JS

- 문자열 자르기 -


KeyPoint
- replace()

 


들어가며

토이프로젝트 진행하면서 "이력"을 등록할 일이 있었다.

수정된 내용을 등록하는건데, "기존의 내용 >> 수정된 내용"의 형식으로 등록되게 하려고 했다.

하지만 모든 내용이 수정되는 것이 아니기때문에 수정된 내용만 등록되게 하려면 약간의 노가다가 필요했다.

 


수정화면 로직
> 수정 버튼 클릭
> 수정된 내용 확인
> 내용이 없으면 return 있으면 formData에 append

formData에 데이터를 넣기 전에 수정된 내용이 있는지부터 확인해야했다.

그래서 checkData()를 선언해서 그 안에서 조작하기로 했다.

 

> 수정 버튼 클릭 : @click="uptTask()"로 uptTask() 호출

<!-- 수정버튼 -->
<button @click="uptTask()">수정</button>
uptTask() {
    if(confirm('수정하시겠습니까?')){
        this.$parent.$refs.taskRegist.mode = 'update'; // taskRegist의 mode 변경
        this.dataSet(); // dataSet() 호출
        this.hide(); // 이것 감추기
        this.$parent.$refs.taskRegist.show(); // taskRegist 보이기
    }
},
dataSet(){
    var self = this;
    var taskRegist = this.$parent.$refs.taskRegist;

    taskRegist.oldTask = self.list; // 비교를 위해 list 전체 넣기
    
    // 수정화면은 등록화면과 같은 js,jsp 파일을 쓰기때문에 하나하나 세팅
    taskRegist.nttNo = self.list.nttNo;
    taskRegist.nttSubj = self.list.nttSubj;
    taskRegist.nttCtn = self.list.nttCtn;
    if(self.list.status == '신규'){
    	// 등록할때는 '신규'가 default, 수정할때는 '진행중'이 default
        taskRegist.status = '진행중';
    } else {
        taskRegist.status = self.list.status;
    }
    taskRegist.taskTrack = self.list.taskTrack;
    taskRegist.taskPrior = self.list.taskPrior;
    taskRegist.taskWorkerId = self.list.taskWorkerId;
    taskRegist.taskDoneRatio = self.list.taskDoneRatio;
    taskRegist.begDt = self.list.begDt;
    taskRegist.endDt = self.list.endDt;
},
show() {
    $(this.$el).show();
},
hide() {
    $(this.$el).hide();
}

 

> 수정된 내용 확인(등록/수정 로직)

regist() { // 등록 or 저장
    var self = this;
    var formData = new FormData();

    if(self.status != '신규' && self.taskDoneRatio == 0){
        alert('진행중인 업무는 진행도가 0일 수 없습니다. 확인해주세요.');
        return;
    }
    
    if(self.mode == 'update'){
        var histCtn = self.checkData(); // 하단에 있음
        if(histCtn == ""){
            // histCtn의 초기값이 ""이므로 해당 값이면 수정된 내용이 없다는 말
            alert('수정된 내용이 없습니다.');
            return;
        } else if (histCtn != ""){
            // ""가 아니면 수정된 내용이 있다는 말
            formData.append('histCtn', histCtn)
        }
    }

    if(self.validate().pass == false)
        return;

    var txt = (self.mode == 'regist' ? '등록' : '저장');

    if(confirm(txt + '하시겠습니까?')){
        formData.append('nttSubj', self.nttSubj);
        formData.append('nttCtn', self.nttCtn);
        formData.append('parntNttNo', self.parntNttNo); // 초기값이 0이므로 굳이 mode에 따라 나눌 필요 x
        formData.append('parntRegusrId', self.parntRegusrId); // 초기값이 ''이므로 굳이 mode에 따라 나눌 필요 x
        formData.append('status', self.status); // mode와 관련없이 status값 전송
        formData.append('taskTrack', self.taskTrack);
        formData.append('taskPrior', self.taskPrior);
        formData.append('taskWorkerId', self.taskWorkerId);
        formData.append('taskDoneRatio', self.taskDoneRatio);
        formData.append('begDt', self.begDt);
        formData.append('endDt', self.endDt);
        
        // 등록
        if(self.mode == 'regist'){ // mode == regist

            app.model.task.taskRegist(formData).then(function(){
                alert('등록되었습니다.');
                self.init();
                self.hide();
                self.$parent.$refs.taskList.init();
                self.$parent.$refs.taskList.show();
            });

        } else { // mode == update(수정)
            formData.append('nttNo', self.nttNo);

            app.model.task.taskUpdate(formData).then(function(){
                alert('수정되었습니다.');
                self.init();
                self.hide();
                self.$parent.$refs.taskList.init();
                self.$parent.$refs.taskList.show();
            });
        }
    }
},
checkData() { // 수정내용 확인
    var self = this;
    var histCtn = "";
    
    if(self.oldTask.nttSubj != self.nttSubj){
        histCtn += "업무명 변경: " + self.oldTask.nttSubj + " >> " + self.nttSubj +"\r\n";
    }
    if(self.oldTask.taskTrack != self.taskTrack){
        histCtn += "업무유형 변경: " + self.oldTask.taskTrack + " >> " + self.taskTrack +"\r\n";
    }
    if(self.oldTask.status != self.status){
        histCtn += "업무상태 변경: " + self.oldTask.status + " >> " + self.status +"\r\n";
    }
    if(self.oldTask.taskPrior != self.taskPrior){
        histCtn += "업무우선순위 변경: " + self.oldTask.taskPrior + " >> " + self.taskPrior +"\r\n";
    }
    if(self.oldTask.taskWorkerId != self.taskWorkerId){
        histCtn += "업무담당자 변경: " + self.oldTask.taskWorkerId + " >> " + self.taskWorkerId +"\r\n";
    }
    if(self.oldTask.taskDoneRatio != self.taskDoneRatio){
        histCtn += "업무진척도 변경: " + self.oldTask.taskDoneRatio + " >> " + self.taskDoneRatio +"\r\n";
    }
    if(self.oldTask.begDt != self.begDt){
        histCtn += "업무시작일 변경: " + self.oldTask.begDt + " >> " + self.begDt +"\r\n";
    }
    if(self.oldTask.endDt != self.endDt){
        histCtn += "업무종료일 변경: " + self.oldTask.endDt + " >> " + self.endDt +"\r\n";
    }
    if(self.oldTask.nttCtn != self.nttCtn){
        histCtn += "업무내용 변경: " + self.oldTask.nttCtn + " >> " + self.nttCtn +"\r\n";
    }
    
    return histCtn;
}

 


컨트롤러, 서비스, SQL, DAO 다 작성하고 정상적으로 출력되는 것까지 확인했다.

그런데 한 가지 마음에 걸렸던 것이 수정된 내용의 맨 마지막에 존재할 수밖에 없는 "\r\n" 이었다.

전부 다 제거하는게 아닌 마지막 것만 지우는 방법은 뭐가 있을까.. 해서 찾아보니

.reaplace() 가 있었다.

 

return histCtn; 위에 histCtn.replace(/\r\n$/,'');를 적어주었더니 마지막 \r\n만 사라진 채로 데이터가 잘 들어가는 것을 확인했다.

.replace(/\r\n$/, '')
- / : 정규식의 시작과 끝
- \r\n : 제거하고자 하는 것(엔터)
- $ : 문자열의 마지막 >> 이것을 안 붙여주면 모든 \r\n이 '' 으로 바뀐다.

 


마치며

replace 함수는 알았지만 정규식은 잘 몰랐다.

이번 기회에 정규식도 더 알아봐야겠다.. (공부할게 또 늘었네)


 

 

 

 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형

'Programming > JS' 카테고리의 다른 글

[JS: Vue] v-for & v-bind  (0) 2022.04.05
[JS: Vue] inline-template & refs  (0) 2022.03.21
[JS: Vue] Vue와 Spring 데이터 통신  (0) 2022.03.10
[JS: Vue] Toggle로 Show/Hide 기능 구현 연습  (0) 2022.03.07
[JS: Vue] props 연습  (0) 2022.03.07
728x90
반응형

Vue.js

- v-for & v-bind -

 


KeyPoint
 - v-for문의 index값을 이용하여 v-bind로 id값에 Binding
 - v-for문에서 select를 여러 번 출력할 때 id값 중복 피하기

v-for를 이용하여 리스트를 출력하고, 각 리스트별 select box를 출력해 해당 select의 option value값을 가져오고 싶을 때 select box의 ID값이 같아 원하는 value값을 가져오지 못 할 때가 있다.

 

예시 코드
<tr v-if="allMemList.length != 0" v-for="list in allMemList">
    <td>{{ list.userNm }}</td>
    <td>{{ list.teamNm }} </td>
    <td>{{ list.gradeKor }} </td>
    <td>
        <select id="selectedAuth">
        <option value="All">All</option>
        <option value="ReadOnly">ReadOnly</option>
        </select>
    </td>
    <td><button @click="authRegist(list)">등록</button></td>
</tr>

<tr> 태그에 v-for를 이용하여 작성하면 allMemList[index] (0 <= index < allMemList.length)의 값들을 출력할 수 있다.

  • allMemList = [ ] : Back단에서 받아온 데이터를 담은 배열
  • list : allMemList[idx]의 값
  • list.xxx : allMemList[idx]의 xxx 항목 값
  • cf) @click="함수명(list)" : 클릭 시 해당 라인(list)값을 parameter로 하는 함수 호출
예시 화면

결과 화면

 

권한열에 list와 관련없는 select box값을 넣어두었다.

$("#id값").val()을 이용하여 해당 라인의 select value를 얻어오고 싶었는데, 맨 윗 행을 제외하고는 제대로 받아오지 못 했다.

원인은 모든 행의 select box의 id값이 동일하기 때문에, 맨 위의 select box 값만 가져오는 것이었다.

 

해결 방법

해결 방법은 id값을 다르게 해주면 된다.

하지만 반복되는 문장에서 id값을 어떻게 다르게 줄 것이며, 그 값들을 매번 어떻게 불러올 것인가?

이를 위해 사용할 수 있는 것이 v-for의 index 값을 id에 넣어주는 :id (id bind) 이다.

 

>> 수정된 코드

<tr v-if="allMemList.length != 0" v-for="(list, idx) in allMemList">
    <td>{{ list.userNm }}</td>
    <td>{{ list.teamNm }} </td>
    <td>{{ list.gradeKor }} </td>
    <td>
        <select :id="'selectedAuth_'+idx">
            <option value="All">All</option>
            <option value="ReadOnly">ReadOnly</option>
    	</select>
    </td>
<td><button @click="authRegist(list, idx)">등록</button></td>
</tr>
  • v-for="(list, idx) in allMemList" : allMemList[idx] 값과 idx 값을 이용
  • :id = " 'selectedAuth_' + idx" : id값에 idx를 바인딩
  • authRegist(list, idx) 함수에서 $("#selectedAuth_"+idx).val()로 값 가져오기

>> 수정된 화면에서 id값 확인

id에 idx값이 정상적으로 bind 됨

 


테스트 Script Code
authRegist(list, idx) { // 권한 등록
	
    // idx를 바인딩한 select box의 value 가져오기
    var selectedAuth = $('#selectedAuth_'+idx).val();

    if(confirm(list.userNm + list.gradeKor + '의 권한을 ' + selectedAuth + '로 등록하시겠습니까?')){
        var self = this;
        
        // json형식으로 데이터 변환
        var data = {
            'projectSn' : self.projectSn,
            'teamSn' : list.teamSn,
            'userSn' : list.userSn,
            'gradeSn' : list.gradeSn,
            'authority' : selectedAuth
    	}
        
        // data를 json으로 변환(추후 서버통신 시 필요)
    	var jsonData = JSON.stringify(data);

		// console에 찍어보기
    	console.log(jsonData);
	}

}

 

결과 화면

alert
console

 


 

 

 

 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형

'Programming > JS' 카테고리의 다른 글

[JS] 문자열 자르기  (0) 2022.04.19
[JS: Vue] inline-template & refs  (0) 2022.03.21
[JS: Vue] Vue와 Spring 데이터 통신  (0) 2022.03.10
[JS: Vue] Toggle로 Show/Hide 기능 구현 연습  (0) 2022.03.07
[JS: Vue] props 연습  (0) 2022.03.07
728x90
반응형

Vue.js

- inline-template & refs -

 

inline-template
 - 2.x 버전에서 하위 컴포넌트에 제공하는 속성 (3.x 버전에서는 더이상 지원되지 않음)
 - 내부 컨텐츠를 분산된 컨텐츠로 취급하는 대신 템플릿으로 사용
 - var 변수명 = Vue.component('컴포넌트명', { }); // script
 - <컴포넌트명 inline-template ref="ref명"></컴포넌트명> // jsp

refs
 - JavaScript를 이용해 직접 자식 요소에 접근할 때 유용한 기능
 - 컴포넌트가 마운트 되었을 때 focus 하고자 하는 경우 등에 유용

 


ToyProject를 진행하다가 쓰게 된 기능이라 Vue에 적어야할지 ToyProject에 적어야할지 고민하다가 Vue에 적기로 결정.

inline-template과 refs 사용의 장점
  • 부모(instance)아래 자식(components)이 여러 개일 때 각각의 컴포넌트들을 찾아가기에 유용
  • 부모 > 자식의 경우: 'this.$refs.ref명'으로 찾아 갈 수 있음
  • 자식 > 부모의 경우: 'this.$parent'로 찾아갈 수 있음
  • 자식1 > 부모 > 자식2의 경우: 'this.$parent.$refs.자식2의 refs명'으로 찾아갈 수 있음

 

inline-template과 refs를 사용할 때 꼭 체크해야 할 부분들
  • instance의 템플릿 header에 스크립트를 전부 작성했는지
  • 스크립트 파일을 따로 작성했다면, 모두 import 해주었는지
  • 순서는 컴포넌트 > 부모 순으로 작성했는지 (중요!)
  • div 태그로 감쌌는지
  • 컴포넌트 명이 제대로 작성되어 있는지
  • 각각의 components들이 instance 템플릿 안에 제대로 들어가 있는지(div 등으로 감싸져 있는지)
  • 컴포넌트 안에 컴포넌트가 들어가있지는 않은지(문제는 아니지만, 부모-자식-자식(손주)의 관계가 됨을 주의)
  • component 태그 밑 템플릿도 div 태그로 잘 감싸져 있는지
  • refs 선언이 잘 되어 있는지
    등등

 

 


실제 작성한 코드는 아래 참고

https://heisely93.tistory.com/entry/PMS-Project-List

 

[PMS] Project List 구현

Project List - 기본 프로젝트 목록 - - Project Management System의 이용자가 참여중인 프로젝트와 사내 전체 프로젝트목록을 띄움 - 참여중인 프로젝트의 제목 클릭 시 해당 프로젝트의 대시보드 화면으

heisely93.tistory.com

 

 

 

 


 

 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형

'Programming > JS' 카테고리의 다른 글

[JS] 문자열 자르기  (0) 2022.04.19
[JS: Vue] v-for & v-bind  (0) 2022.04.05
[JS: Vue] Vue와 Spring 데이터 통신  (0) 2022.03.10
[JS: Vue] Toggle로 Show/Hide 기능 구현 연습  (0) 2022.03.07
[JS: Vue] props 연습  (0) 2022.03.07
728x90
반응형

Vue.js

- Vue.js & Spring -

 


 

프론트단에서 vue의 instance와 components를 출력하는 것을 끝냈으니, 이제 백단에서 데이터를 가져와 화면에 출력해보자.

기본적으로 데이터를 가져오는 흐름은 'Vue 에서 서버통신 > Controller > Service > DAO(Mapper) > Mapper(SQL)'로, 쿼리가 정상적으로 동작한다면 다시 역순으로 와서 Controller에서 Vue에 데이터를 전달해주고, 그 데이터를 이용해서 화면단에 출력해준다고 보면 된다.

 

일단 Vue에서 Post 방식으로 파라미터를 어떻게 전달하는지를 파악하면 백단 코드는 기존 Spring과 다르지 않으니 파라미터를 전달하고 다시 데이터를 받아오는 방법만 테스트 해보기로 했다.

 

1. 컴포넌트 생성

Vue Instance로는 기존에 테스트용으로 작성했던 instance.js를 사용하기로 하고, post 테스트를 위해 네 번째 컴포넌트를 생성했다.

 

  • forthComp.js

- 템플릿을 작성할 때 작은 따옴표('')사이에 작성하는데, 그러면 한 줄로 작성해야해서 가독성이 떨어진다. 들여쓰기를 하면서 작성하려면 어퍼스트로피(``)사이에 작성하면 된다.

- 입력하는 값을 전달하기 위해 v-model로 num과 바인딩

- 버튼을 클릭하면 함수를 호출하도록 @click 설정

- 통신 이후의 결과값을 담기 위해 data에 resultNum 선언

- axios.post('컨트롤러단에서 선언해줄 링크', FormData 변수): 데이터 전달

- .then(function(result){...}) : 통신 이후 처리할 내용

 

 

2. 인스턴스에 컴포넌트 삽입
  • instance.js

  • test.jsp

 

3. Controller

- getMgtMainPage() 에서는 데이터를 받아와야서 기본 view에 리턴해줘야하므로 RequestMethod.GET 선언

- postTest메서드는 데이터를 받아서(formData) 처리 후 전송을 해줘야하므로 RequestMethod.POST 선언

 

 

4. 실행 결과

 

다음엔 실제 DB와 연동해서 데이터를 받아와서 출력해보자.

 

 

 


 

End.

heisely's 괴발개발 개발일지

 

728x90
반응형

'Programming > JS' 카테고리의 다른 글

[JS: Vue] v-for & v-bind  (0) 2022.04.05
[JS: Vue] inline-template & refs  (0) 2022.03.21
[JS: Vue] Toggle로 Show/Hide 기능 구현 연습  (0) 2022.03.07
[JS: Vue] props 연습  (0) 2022.03.07
[JS: Vue] Instance와 Component 연습  (0) 2022.03.07
728x90
반응형

Vue.js

- Toggle -

 

Toggle Switch
 - 하나의 설정값으로부터 다른 값으로 전환하는 것
 - 오직 두 가지 상태밖에 없는 상황에서 스위치를 누를 때마다 상태가 둘 중 하나로 변하는 것

 

기존 회사에서 진행했던 프로젝트에서는 $(this.$el).show(), $(this.$el).hide() 를 이용하여 show/hide를 진행했었다.

하지만 초반부터 작업하다보니 어디서 잘못된건지.. 해당 기능이 제대로 작동하지 않아 toggle 방식을 이용하여 show/hide 방식을 사용해야 할 것 같아 연습해보았다.

>> 2022-04-05 수정: $(document).ready(function(){} 안에 Vue를 선언해서 하면 jQuery의 show()/hide() 기능을 사용할 수 있다!

 

초기 작업방법은 아래 링크 참고

> https://heisely93.tistory.com/15

 

[Vue] Instance와 Component 연습

토이프로젝트를 진행하면서 Vue.js를 사용하기로 했는데, 그 누구도 Vue를 사용해 본 적이 없어 연습을 먼저 한 후 구현에 들어가기로 했다. 나는 회사에서 Vue를 이용해서 구현을 해본 적은 있지만

heisely93.tistory.com

 

1. instance.js

먼저, instance.js의 data에 컴포넌트별로 토글해줄 값들을 선언해주고, method에 토글 함수를 선언해줬다.

 

2. jsp에 바인딩

show-hide로 바인딩해주었다.

 

3. 각 컴포넌트에 props와 template, method 설정

각 컴포넌트 props에 'showHide'를 넣어주고,

template에 v-if를 넣어 랜더링 조건을 설정해주고,

method 함수에 props 변수와 각 글자를 클릭할 때 행동할 함수들을 넣어줬다.

(console.log에 찍어보려고 처음에 넣었으나 사용하지 않음! 사용하지 않는다면 굳이 넣지 않아도 된다.)

ex) this.$parent.firstShowHide() : 이 컴포넌트의 부모의 firstShowHide() 함수를 실행할게!

 

 

4. 실행 결과

- 초기 화면 + 클릭 후 + 콘솔

- 두번째 화면 + 클릭 후 + 콘솔

- 세 번째 화면 + 클릭 후

confirm창에서 확인 클릭 시
confirm창에서 취소 클릭 시

연습용으로 간단하게 작성한 거라 confirm창에서 취소 클릭 후 다시 클릭하면 약간의 논리오류는 발생한다.

테스트 할 때에는 confirm창에서 확인을 눌러 처음으로 돌아간 뒤, 취소 클릭해보는 것을 추천한다.

 

기본 연습 끝!

 

 

 


 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형

'Programming > JS' 카테고리의 다른 글

[JS: Vue] v-for & v-bind  (0) 2022.04.05
[JS: Vue] inline-template & refs  (0) 2022.03.21
[JS: Vue] Vue와 Spring 데이터 통신  (0) 2022.03.10
[JS: Vue] props 연습  (0) 2022.03.07
[JS: Vue] Instance와 Component 연습  (0) 2022.03.07
728x90
반응형

Vue.js

- props -

 

Props
 - prop: 상위 컴포넌트 정보를 전달하기 위한 사용자 지정 특성
 - 하위 컴포넌트는 props 옵션을 사용하여 수신할 props를 명시적으로 선언해야 함
 - 데이터와 마찬가지로 템플릿 내부에서 사용할 수 있음
 - 출처: https://kr.vuejs.org/v2/guide/components.html

 

컴포넌트의 사용 목적은 재사용을 하기 위함이다.

예를 들어 토이프로젝트에서 구현할 Task와 Risk의 상세화면 또는 그 하단에 들어가는 댓글 화면은 형식이 비슷하거나 완전히 똑같기 때문에 jsp를 여러 개를 만드는 것은 비효율적이다.

따라서 props를 설정해 template 또는 component 명에 직접 v-if를 걸어줘서 상황에 따라 화면을 다르게 출력할 수 있도록 하면 된다.

 

앞서 작성한 instance.js와 firstComp.js를 이용해 props 연습을 해보자.

 

1. instance.js

data : {} 안에 props로 사용할 데이터를 정의해준다.

 

2. firstComp.js

props 명을 지정해준다. 

클릭했을 때 확인해 볼 수 있게 받아와서 alert창에 띄울 수 있게 처리해준다. (6, 7, 10번 라인)

 

3. JSP

firstComp 안에 ":props명='data 내 변수명'"으로 바인딩을 걸어준다. 

주의: 인라인 내 props명은 카멜케이스가 적용이 안 된다(2.x버전 기준)

:props-test='msg':: 부모(인스턴스)의 data 중 msg를 propsTest라는 이름으로 전달받아 바인딩 할 거야!

 

4. 실행 결과

 


다음엔 toggle을 이용한 show/hide 기능을 구현해보자.

> https://heisely93.tistory.com/17

 

[Vue] Toggle로 Show/Hide 기능 구현하기

기존 회사에서 진행했던 프로젝트에서는 $(this.$el).show(), $(this.$el).hide() 를 이용하여 show/hide를 진행했었다. 하지만 초반부터 작업하다보니 어디서 잘못된건지.. 해당 기능이 제대로 작동하지 않

heisely93.tistory.com

 


 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형
728x90
반응형

Vue.js

- Instance & Component -

 

Instance
 - 부모
 - 나무로 치면 큰 뿌리 역할
 - Vue 앱을 사용하기 위해 생성
Component
 - 자식
 - 나무로 치면 가지 또는 잔 뿌리 역할

 

 

토이프로젝트를 진행하면서 Vue.js를 사용하기로 했는데, 그 누구도 Vue를 사용해 본 적이 없어 연습을 먼저 한 후 구현에 들어가기로 했다.

나는 회사에서 Vue를 이용해서 구현을 해본 적은 있지만 초반 작업부터 해본 것은 아니어서 공부하면서 천천히 진행해보려고 한다.

그리고 현재 Vue 3.x버전까지 나와있지만, 이클립스에서는 cdn을 이용해서 작업할 수밖에 없어 2.x버전을 사용한다.

(최대한 ES6 문법을 사용해서 진행할 예정이나 ES6도 공부중에 있어 ES5 문법을 주로 사용할 가능성이 높음)

초반에 가이드를 봐도 헷갈리는 부분이 있어 선임의 블로그를 참고하며 진행했다.

 

https://bongra.tistory.com/category/Vue

 

'Vue' 카테고리의 글 목록

 

bongra.tistory.com

 

1. 프로젝트 생성하기

일단 Dynamic Web Project로 프로젝트를 생성하고 jquery를 최대한 사용하지 않을 것이지만, 완전히 사용을 배제하는 것이 아니므로 jquery.js 파일을 libs에 넣어줬다.

 

2. common_lib.jsp 생성

구현에 진행할 때 공통적으로 사용할 js파일들을 모아둘 libary 파일을 생성했다.

일단 연습용으로는 jquery와 axios js파일과 vue(cdn)을 입력해두었다.

 

3. Components 생성

컴포넌트로 사용할 js 파일들을 작성

- firstComp.js

- secondComp.js

- thirdComp.js

 

4. Instance 생성 및 컴포넌트 삽입

- instance.js

 

5. jsp 파일 작성

<head>부분에는 라이브러리와 뷰 인스턴스를 넣어주고,

<body>부분에는 인스턴스의 el 역할을 할 <div>와 그 안에 컴포넌트들을 넣어준다.

 

6. 실행결과

에러없이 각 컴포넌트들의 template들이 출력되면 성공

- method는 추후 더 다룰 거지만, 함수들을 정의해주는 부분이다.

first / second / third에 보면 template에 "@click=함수명()"으로 걸어주고, method에 그 함수를 정의해줬다.

따라서 제대로 랜더링이 된다면 각 글자를 클릭했을 때 아래와 같은 알림창이 뜬다.

 


 

다음엔 props 관련 공부

>> https://heisely93.tistory.com/16

 

[Vue] props 연습

컴포넌트의 사용 목적은 재사용을 하기 위함이다. 예를 들어 토이프로젝트에서 구현할 Task와 Risk의 상세화면 또는 그 하단에 들어가는 댓글 화면은 형식이 비슷하거나 완전히 똑같기 때문에 jsp

heisely93.tistory.com

 

 

 

 


 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형

'Programming > JS' 카테고리의 다른 글

[JS: Vue] v-for & v-bind  (0) 2022.04.05
[JS: Vue] inline-template & refs  (0) 2022.03.21
[JS: Vue] Vue와 Spring 데이터 통신  (0) 2022.03.10
[JS: Vue] Toggle로 Show/Hide 기능 구현 연습  (0) 2022.03.07
[JS: Vue] props 연습  (0) 2022.03.07

+ Recent posts