기존의 3차에서 썼던 소스를 활용해서 계속 수업을 진행했습니다.

잘 있나 npm run serve를 한 번 해보고 시작합니다.

잘있으면 

일단 첫번째로는 인스타에 올릴 때 필터효과를 사용해보도록 하겠습니다.

 

cssgram 을 사용할 것인데요, 전 처음 알았어요

https://una.im/CSSgram/

 

CSSGram

What is This? For more background on CSS Image Effects, you can check out my blog series here, or watch my video from CSS Conf EU, which gives a baseline on blend modes and filters. Simply put, CSSgram is a library for editing your images with Instagram-li

una.im

사이트들어가면 보이는 이름들을 클래스로 넣으면 필터효과가 적용이 되는 라이브러리입니다.

 

사용하기 위해서 링크를 먼저 가져오겠습니다.

링크는 public > index.html에 넣어주겠습니다.

 

cdn 링크는 사이트 하단으로 내려가다보면 설명에 있습니다.

 

그 후에 이것을 사용할 영역을 만들어주겠습니다.

업로드 하던 부분에 만들면 되겠죠? step 2부분이요~

저 하단에 필터영역을 만들어주겠습니다.

일단 가짜 영역을 만들어볼께요

 

App.vue에 영역을 추가합니다.

 

그 후에 스타일로 좀 꾸며 줍니다.

저는 반응형으로 만들지는 않았습니다.

 

그리고 이미지를 똑같이 넣어줍니다.

3단계에서 바로 오면 newImgSrc가 무엇인지 아시겠죠?

 

그러면 렌더링이 아래와 같이 되는데,

이것을 반복문으로 여러개+필터를 입혀서 출력해보겠습니다.

아까 cssgram에서 본 필터명을 data로 만들어 줍니다. 그리고 그것으로 반복문을 돌려서 출력합니다.

 

 

 

클래스 명이 필터명과 동일하면 적용된다고 했죠?

v-bind:class로 filter 명을 넣어줍니다.

 

렌더링 잘되네요

 

스타일을 좀 수정하겠습니다.

filter-wrap을 감싸줄 태그를 만들고

 

 

스타일을 추가해주면

아래와 같이 렌더링 됩니다. 

그리고 이 필터들의 이름을 보여주겠습니다.

 

 누르면 원본 이미지가 변하도록 해보겠습니다.

 

버튼같이 보이도록 cursor 추가해주고

 

 

클릭 시 getFilter 이벤트 실행

타겟은 e.target 하면 클릭된 img가 나온다.

여기 클래스를 원본 이미지 class에 넣어주면되느데, 먼저 e.target의 클래스를 가져옵니다.

 

data에 selectFilter라고 빈값을 만들고 

 

 

필터명을 넣어줍니다.

그리고 원본이미지에 v-bind:class해서 넣어줍니다.

 

필터 이미지를 클릭하면 필터에따라 변하는 것을 볼 수있습니다.

 

 

자 이제 데이터가 저장되어야하니까 data.js에서 filter항목을 추가합니다.

 

기본을 normal로 등록해주고, 빈값이어도 상관은 없을 것 같아요.

 

그리고 저장하는 update() 함수에서 filter 키 값을 추가해줍니다. 

저장할때 selectFilter에 저장하니까 가져와서 담아줍니다.

 

그리고 렌더링이 될 수 있게 이미지에 v-bind:class로 넣어줍니다.

 

 

짜잔~ 처음부터 등록을 진행하면 내가 등록한 이미지에 필터가 적용된 모습이 확인됩니다.

 

*이미지 출처는  https://pixabay.com/ 이고, 무료이미지(19.07 기준)여서 사용했습니다. 

문제가 있을 시 삭제하겠습니다.

 

이제 어느덧 코딩애플에서 진행하는 기초 세미나 3/4가 지났습니다 ㅎㅎㅎㅎ!!

근데,, 사실은 이걸 처음 작성할 때는 다음주가 마지막이었는데 ㅋㅋㅋ

수정하고 있는 지금은, 벌써 4주차가 끝난 뒤입니다.^^;

 

하핫....

 

3회차 수업은 라우터를 사용하지 않았습니다.

어떤 작업을 했는지, 체크해보면 

1.메인에 리스트를 보여줄 것입니다.

- '사용자이름, 타이틀, 텍스트, 이미지' 

2.메인에서 이미지 업로드 버튼(+)을 누르면 사진을 업로드 할 수 있고 두 번째 레이아웃이 보여집니다.

3.두 번째 레이아웃에서는 업로드한 사진을 보여주고, 텍스트나 글쓴이 등 정보를 입력받는 폼이 보입니다. 

4.입력을 마치고 저장을 누르면 메인 레이아웃이 보이고 업로드 된 데이터가 기존 데이터와 함께 보여집니다.

강사님 코드를 복,붙 하면 스터디의 의미가 없으니, 생각나는대로 진행하겠습니다.^^;


프로젝트 생성

 

vue 프로젝트를 만들기 앞서, 프로젝트 폴더를 만들겠습니다.

처음부터 진행하겠습니다.

루트폴더가 될 폴더를 만들고, 저는 vue_study로 만들었습니다. 그리고 만든 폴더를 vscode 에디터에서 Open Folder해줍니다. 

아무것도 없는 vue_study 폴더

아직 아무것도 없는 vue_study 폴더에 vue와 vue-cli를 install 해주겠습니다.

install하기 위해서 터미널창을 열어줍니다. 

단축키는 [ctrl + `]이고 메뉴에서 [Terminal > New Terminal]을 누르면 터미널 창을 열 수 있습니다.

 

vue를 install 해줍니다.

그 뒤에 vue-cli를 install해줍니다.

-g는 global의 약자이고 -global로 쳐도 됩니다. 

그 뒤에 vue-cli를 이용해서 vue_study 하위에 vue 프로젝트 폴더를 생성합니다.

vue create 폴더명

Please pick a preset이라고 나오면, 엔터를 쳐줍니다.

(bable, eslint)를 default로 설치하겠다는 거라고 합니다.

설치가 완료되면 vuestargram 폴더가 생성된 것을 확인할 수 있습니다. (vuesta...로 했어야하는데...)

여기서 Terminal로 cd 해서 폴더로 접근해도 되고 이것에 대한 이해가 없다면, vscode에서 Open Folder해서 방금 만든  vuestargram 폴더를 열어줍니다. 차이는 없습니다.

 

그리고 터미널을 열면, 터미널이 바라보고 있는 폴더 위치가 나오게 됩니다. vuestargram을 보고 있으면 됩니다.

npm run serve를 입력하고, 완료가 된 후 파란 글씨로 안내하는 localhost:8080으로 접속해봅니다.

만약 다른 port로 되어있으면 localhost:port로 들어가면됩니다.

 

 


작업 시-작!

 

[App.vue]

파일 안에 내용을 싹 다 지우고 꺽쇠 < 누른 후에 'scaffold' 를 눌러 기본 레이아웃을 만들어줍니다.

기본으로 뿌려 줄 리스트 데이터를 만들어 줄 것인데, 위치는 assets 폴더에 data.js 파일을 생성해줍니다.

(필요없는 것들은 지워주세요. logo.png, Helloworld.vue  같이 안쓰는 파일들 삭제)

 

[data.js]

글쓴이, 제목, 이미지, 텍스트를 아래와 같은 형식으로 작성할 것입니다.

기본으로 2개만 형식에 맞춰 작성하겠습니다.

이미지 링크는 무료 사이트에서 가져왔습니다.

 

[App.vue]

data.js를 import해서 사용하도록 하겠습니다.

data()에 postData로 저장해주도록 하겠습니다.

<template>내부에 {{ postData }} 로 작성하여 제대로 import되었는지 확인해봅니다.

data.js에 썼던 내용이 브라우저에 렌더링되고 있네요.

 

그 다음 src > components에 Post.vue 파일을 만들어줍니다.

[Post.vue]

빈 파일에 꺽쇠 < scaffold 눌러서 자동완성 합니다.

그리고 지울 건데, 컴포넌트 잘 불러와졌나 확인하기 위해서... '난 Post야'라는 텍스트를 한 번 써보겠습니다.

(이 절차는 없어도 됩니다 ㅎㅎ);

[App.vue]

Post를 import해서 components에 선언해주고 <template>에 작성하여 렌더링 되는 것을 확인해봅니다.

렌더링 되는거 확인이 됩니다. 확인했으니까 [Post.vue]에 {{postData}}는 지워줍니다.

 

[App.vue]

postData로 import하여 postData로 저장했던 데이터를 <Post> 컴포넌트에 prop로 전달할 것입니다.

그리고

[Post.vue]

prop를 받기 위한 작업을 해줍니다. data형식은 Object입니다.

props를 <template> 내부에 작성하여 렌더링되도록 하겠습니다.

 

브라우저에서 확인이 됩니다.

근데 이렇게하면 리스트야 뭐야? 텍스트만 보이니까 이것을 레이아웃 형태로 갖춰서 만들어보겠습니다.

간단하게 인덱스 0번째 데이터만 렌더링 시켜보겠습니다.

브라우저를 보면 0번째 인덱스다 예쁘게 나오는 것이 확인됩니다.

자 이걸 반복문을 통해, 입력된 데이터들을 전체 보여주도록 하겠습니다.

 

[App.vue]

v-for문을 사용해서 postData를 반복시키고 props로 개별 post를 넘겨줍니다.

그리고 반복문을 썼으니까, key 값도 넣어줍니다. 

key값이 없다고 에러가 나진 않지만 경고문구가 뜹니다.

[Post.vue]

[0]을 다 지워줍니다.

반복된 것을 확인할 수 있습니다.

 

[App.vue]

이미지 업로드를 담당할 + 버튼을 만들어 줍니다.

파일 업로드 할 거니까 <input> 하나 만들고, file을 올릴 수 있게 type은 file로 지정합니다.

(type=file은 ie 하위는 안될 듯 싶습니다.)

저는 크롬해서 진행해서 버튼이 이 모양인데, 브라우저마다 다른 모양일 수 있습니다.

(모양은 상관없습니다.)

+ 버튼을 눌렀을 때의 어떤 일을 할 지 함수를 만들어 줍니다.

 

파일 관련 js는 강사님이 준 코드로 작성했습니다.

(+인터넷 검색하면 나온다고 하고 강사님도 구글링 코드라고 합니다. 이런 코드 짜려고 힘 빼지 맙시다 ㅎ.. 똑똑하신 분들 코드 씁시다.)

 

+버튼 누르면 어떤 일을 해야하는가?

1.이미지 경로를 찾는다.

2.다음 레이아웃이 보인다.

 

먼저 + 눌렀을 때 함수를 methods 안에 작성해줍니다.

위에 e.target.result가 로컬에서의 이미지 경로라고 합니다.

이것을 이용해서 이미지를 보여줄 것입니다.

 

그 다음 이 upload() 함수를 <input>에 변화가 있을때 호출되도록 입력해줍니다.

이벤트는 change 혹은 input을 사용합니다.

 

그리고 파일을 올린 후 궁금하니까 console.log 찍어둔 것을 확인해봅니다. 

어마무시하게 길군요.;;

이미지를 등록하고, 텍스트 입력을 받을 레이아웃을 만들어보도록 하겠습니다.(2번째 레이아웃)

[App.vue]

<img>, <textarea> 태그를 만들어줍니다.

(나중에 input을 추가로 만듭니다... 여기서 title, author등을 등록할 input태그를 만들어도 무방합니다..)

 

그리고 data에 새로운 이미지를 경로를 저장할 변수를 만들고 upload() 함수에서 경로를 저장해줍니다.

스타일 수정 절대 안할라고 했는데, 작업하다보니 영역이 너무커서 확인이 힘들어졌습니다.

<div>에 인라인으로 스타일을 넣었고, 하단 <style> 내부에 img,textarea의 크기를 조정하는 작업을 했습니다.

 

그리고 <img>태그에 v-bind:src="내가 등록한 이미지"가 될 수 있게 data에 저장한 newImgSrc를 넣어줍니다.

 

파일을 추가해보겠습니다.

업로드 한 이미지가 나타나는 것을 확인할 수 있습니다.

 

자 이제 '파일선택'에 이라고 보이는,,, 보기 싫은 버튼을 감춰줍니다.

안감쳐줘도 상관은 없지만 보기 싫으니깐 감춰줍니다.

대충 스타일 추가해줘서 감춰주었습니다....

 

여전히 [App.vue]

v-if를 통해서 레이아웃을 보여줬다 감췄다가 하는 작업을 하겠습니다.

data에 step 변수를 만들고 기본값으로 1로 넣어줍니다.

step 값을 변경하면서 v-if를 통해 레이아웃들을 컨트롤 할 것입니다.

step을 1로 설정했을때,

렌더링

 

step을 2로 설정했을때, 

렌더링

지금은 이미지를 올리지 않고 step을 수정해서 이동했기 때문에, 이미지가 보이지 않습니다.(경로가 없겠죠 당연히)

 

다시 step을 1로 변경해 주고 진행하겠습니다.

step을 순서대로 진행되게끔, (이미지가 업로드 된 후에 다음 레이아웃이 보일 수 있도록..)

upload() 함수 끝에 2로 변경되도록 하겠습니다.

 

이미지를 올려보겠습니다.

step2가 되고 이미지도 잘 보입니다.

이제 저장 버튼을 만들어서 내가 방금 작성한 것들을 저장하고, 메인으로 이동된 후에 저장된 데이터들이 포함된 리스트가 보이게끔 하겠습니다.

저장 버튼 클릭 시 data.js에 저장한다 (X)

현재는 파일 자체에 저장하는 것은 무리고, 맨 처음 data.js를 import해와서 변수로 저장했었는데, 

이 변수에 저장하여 작업하도록 하겠습니다.

 

다만 새로 저장하려는 데이터 형태가 data.js와 동일한 형태여야합니다.

update() 함수를 methods안에 만들어 줍니다. 

key, value 등을 알 맞게 작성해줍니다.

이렇게 작성해 보니까, 위에서 title, author을 저장하는 <input>을 안 만들어서 App.vue에 step2부분에 새로운 <input>태그를 만들어줬습니다.

data()에 title, author를 저장하기 위한 빈 값의 변수를 만들고 해당 <input>에 v-model로 연결해줬습니다.

 

그리고 다시 아까 updata()함수에 value값 들을 v-model로 연결했던 data()들을 찾아서 넣어줍니다.

this를 안 쓰면 안되니 반드시 this.newTitle 형식으로 등록해줍니다.

(var data = 에서 변수명을 var newData =로 수정했습니다.)

 

newData에 데이터 형식에 맞게 v-model로 저장했던 data값들을 넣은 것이 확인할 수 있습니다..

그리고 data에 unshift() 메소드를 이용해서 배열 맨 앞에 내가 만든 newData를 넣어주면 리스트 업데이트 끝입니다.

그리고 마지막으로 업데이트가 끝나면 메인 레이아웃이 보여야 하니까, step 을 1로 만들어줘서 메인 레이아웃이 보여지게 만듭니다.

 

자 이제 순서대로 진행해보면 잘 만든 것이 확인됩니다.

 

- 페이지 접속

- + 클릭

- 이미지 선택 

 

- 데이터 입력후 저장

 

- 리스트에 추가됨을 확인!

여기까지가 3차에서 배운 부분입니다.

 


작업하면서 추가로 검색, 오호라 했던 부분들입니다.

1.v-if말고 v-show를 사용하는 건 어떨까?

v-if는 렌더링 자체를 하지 않고, v-show는 렌더링을 한 후에 css를 통해 감춰줍니다.

v-if는 토글 시 비용이 크고, v-show는 초기 렌더링 비용이 크다고 합니다.

자주 바뀐다면 v-show를 사용하는 것을 권장, 아니라면 v-if를 권장이라고 하는데,

예를 들면.. 클릭해서 toggle하는 팝업이 있다면 v-show가 될 것 같고, 한 번만 열고 닫으면 끝인 팝업이라고 한다면 v-if가 괜찮을 것 같습니다. 

 

 

2.컴포넌트에 직접적으로 v-if를 하게되면 에러메세지가 노출됩니다.!

콘솔창에 노출되지 않으면, 터미널을 확인해보세요...

 

에러 문구는

This 'v-if' should be moved to the wrapper element (vue/no-use-v-if-with-v-for) ...... 어쩌고 저쩌고 입니다.

찾아보니까, 생성한 엘리먼트들에 v-if, v-show와 같은 동작을 직접적으로 지정하면 안되는 문제라고 합니다.

(컴포넌트나 svg 이미지태그 등?)

따라서 예제와 같이wrap태그로 한번 감싸줘서 사용합니다.

 

 

3.v-if 말고도 v-if-else도 있습니다.

 

 

4.반복문 사용할 때 v-if="(post, i) in postData" :key="i" 를 하는데,.. key값 넣으려고 (post,i) 하는데, 이때 i도  변수이므로 여러 반복문에서 같은 네임으로 하면 안됩니다.

그리고 위의 작업은 로컬에서 아무런 저장(캐시, 세션) 없이 한 것이니까, 새로고침하면 당연히 ㅎㅎ 

기본 데이터만 남습니다.

 

로컬에서 저장까지 테스트하고 싶으면 세션에 저장해서 해보시길..ㅎㅎ

 

 

*선생님코드아님 주의, 틀릴 수 있음 주의, 들으면서 적은거 아님주의, 복습하면서 적은거임,

1회차에서 이어서하는 부분입니다.

1회차 안보면 이해안될 수 있음 주의ㅎ

 

새로운 프로젝트 생성

ROOT폴더에서 새로운 프로젝트를 생성할 것입니다.

vscode에디터에서 ROOT 폴더 열어줍니다. 

(저는 vuu가 ROOT 폴더입니다. vuedongsan은 1차때 만든 프로젝트 폴더입니다.)

(모르겠으면 처음부터해도되나 install할 것들이 있습니다)

vue, @vue/cli

 

터미널을 열어줍니다.

(단축키 ctrl + `) 또는 메뉴에서 Terminal > New Terminal

 

터미널이 열린 경로를 확인해줍니다.

vue 프로젝트 폴더를 생성할 ROOT 폴더로 경로가 되어있는지 확인합니다.

(vuu임을 확인)

 

프로젝트 생성 명령어를 입력해줍니다.

vue create blog 

Please pick a preset~~ 질문이 나오면 엔터를 눌러주고 로딩바가 끝나기를 기다립니다.

 

생성이 완료되면 아래와 같이 나옵니다.

폴더이동

이제 작업할 폴더로 이동합니다.

이 상태에서 터미널 명령창에 cd .\blog\ 를 입력해도 됩니다.

명령어를 입력하면 아래와 같이 경로가 변함을 확인할 수 있다.

물론 vscode 에디터에서 open folder를 해도 아래와 같은 경로로 보일 것이다.



하지만 헷갈릴 여지가 있으므로 vscode 에디터에서 New folder하여 새로만든 프로젝트를 열어줄 것입니다.

 

폴더를 열어 준 후에 터미널을 열고 명령어를 입력해줍니다.

npm run serve

 

아래와 같이 나오면 성공

localhost:8080을 브라우저에 입력하여 접근해봅니다.

(만약 포트 숫자가 다르다면 적혀나온 포트로 접근해야합니다)






blog라는 새로운 프로젝트 폴더를 생성하였고 서버를 로컬에 띄워서 확인하였습니다.

 

이번 2회차는 router를 이용해서 블로그 경로를 생성하는 주제로 진행되었습니다.

 

서버가 돌아가고있는 터미널 말고 다른 모듈들을 다운로드 하기 위해서 다른 터미널을 열어주겠습니다.

터미널 우측에 +버튼 눌러주면 New Terminal이 열립니다.

메뉴 Terminal에서도 New Terminal을 눌러주면 됩니다.

 

 

경로 확인하면 나는 vuu 폴더에서 터미널을 열었기 때문에 마지막이 vuu로 나오는 부분이고,  만약 보는이가 blog 폴더에서 열었다면 blog를 끝으로 경로가 끝나야 합니다.

 

(폴더를 vscode에서 연 사람은 따라하지마세요.)

vuu에서 blog로 경로를 들어가보겠습니다.

아까 말한 명령어를 입력해줍니다.

cd .\blog\

 

라우터설치

blog 폴더로 들어온 후에 폴더내부에 router 모듈을 설치해 보겠습니다.

 

명령어 입력합니다.

npm install vue-router

 

그 후 bootstrap도 이용할 것이기 때문에 bootstrap도 다운받아 주겠습니다.

명령어 입력

npm install bootstrap-vue bootstrap

 

다운로드가 끝나면 src > App.vue에서 안에 내용을 싹다 지우고 자동완성(꺽쇠 < scaffold)을 이용하여 코드를 작성해줍니다. 그 후에 <div id=”app”> 태그 하나를 추가해줍니다.

 

지금부터 할 것은 라우터를 이용해서 총.. 3개의 url를 이용해서 페이지를 이동하는 것입니다.

home, introduce, page를 생성해볼 것입니다.

 

부트스트랩 설치

먼저 클릭 시에 이동이 가능하도록 네비게이션을 먼저 생성해보도록 하겠습니다.

아까 다운로드한 bootstrap 모듈을 활용하겠습니다.

 

bootstrap 모듈을 사용하기 위해서는 등록을 해줘야합니다.

bootstrap 사이트가면 확인가능하며 main.js에 등록하여 줍니다.

위에서 vue를 import해오는 부분은 중복이 되니까 지워줍니다.

 

위의 코드를 간단히 설명하면 

부트스트랩 모듈을 BootstrapVue라는 이름으로 import 하고 import해온 BootstrapVue을 Vue.use 문법을 통해 등록해줍니다.

그 후 css 사용을 하기 위해서 css들도 import해줍니다.

그냥 저렇게 문법을 써야하기때문에 사용하는 것입니다.

(모든 모듈을 사용할 때에는 모듈 홈페이지에서 사용법을 숙지해야 합니다) 

 

그 후 bootstra-vue 사이트를 가보면 여러가지 템플릿을 확인할 수 있습니다.

우리는 만들어진 템플릿을 가져와 사용만 하면 됩니다.

https://bootstrap-vue.js.org/docs

 

템플릿 가져다 쓰기

홈페이지 메뉴에서 components 를 눌러 들어와서 검색창에 원하는 검색어를 입력하면 되는데, 현재 네비바를 만들 것이기 때문에  nav bar를 입력합니다.

  • 강사님이 강의 중에 왜 vuetify를 안쓰고 bootstrap을 사용하는지에 대해 말해줬는데, 그냥 유행이라고했다…… 뭘 쓰던 개인프로젝트에서는 상관없을 듯합니다. ㅎ

 

마음에 드는 템플릿의 태그를 복사해 와서 붙여넣고 확인해보겠습니다.

 

아까 띄운 서버 (localhost:8080)에서 네비 바가 확인가능합니다.

템플릿에서 안쓰는 것들은 지우고 사용할 것들만 구조에 맞춰서 적절히 둡니다.

 

이렇게 남았습니다.

 

요구조건은 해당 버튼 클릭 시 각각 url로 이동 시키고 해당 컴포넌트들을 보여줄 것입니다. 

HOME 클릭 시 /home 

Introduce 클릭 시  /introduce 

Page 클릭 시 /page

 

먼저 라우터 설정파일을 먼저 만들겠습니다.

라우터 모듈을 아까 다운로드 받았는데, 이 모듈을 해당 문법에 맞게 셋팅해줘야합니다.

 

라우터 설정

assets 하위로 router.js 파일을 하나 생성해줍니다.

 

그 후 router.js에 라우터를 사용할 수 있도록 등록해줍니다.

 

코드를 설명하면 

vue문법을 사용 할 것이니까 vue를 Vue라는 이름으로 import 해옵니다.

vue-router도 사용 할 것이니까 VueRouter라는 이름으로 import합니다.

그리고 Vue.use 문법을 사용해서 VueRouter를 등록해줍니다.

네이밍은 다 변경되어도 됩니다.

 

그 후에 등록한 라우터를 설정해줍니다.

 

위와 같이 추가해주어야하는데, 이것은 문법이므로 맞춰주어야 합니다.

코드를 설명하면 export default하는 이유는 router.js를 사용하려는 곳에서 import했을 때 셋팅 값을 사용하기 위함입니다.

mode는 등록하지 않을 경우 아래와 같이 #이 붙습니다.

그리고 routes 설정을 해주는데, 

routes에는 

path는 경로를 입력해줍니다. (사용자가 저 경로로 들어왔을때 어떤 컴포넌트를 보여줄지 설정하는 부분입니다)

name은 디버깅할 때 쓴다고는 합니다만., 정확히 어디서 쓰는지 모르겠습니다. 현재는 사용안합니다.

component는 내가 저 path로 들어왔을 때 어떤 컴포넌트를 보여줄 지 등록하는 것입니다.

 

즉,,,

path(/)로 들어왔을때 component(HOME)를 보여줘라.


라우터에서 사용 할 컴포넌트 생성

자, 이렇게 한 후 HOME 컴포넌트를 보여주려고 한다면 2가지 작업을 추가로 더 해야합니다.

 

첫번째는 HOME라는 컴포넌트가 있어야하고

두번째는 HOME 컴포넌트를 router.js에 import해줘야합니다.

세번째는 router를 사용하여 렌더하겠다는 것을 vue에 등록해줘야합니다.

네번째는 router를 보여줄 공간에 <router-view>를 입력하는 것입니다.

 

첫번째로 HOME 컴포넌트를 만들겠습니다.

components 파일 하위로 Home.vue파일을 만들어주고 내용을 채워줍니다.

 

이렇게하면 HOME 컴포넌트는 생성되었습니다.

 

두번째로 HOME 컴포넌트를 router.js에 import해줘야합니다.

router.js로 import 작업을 해줍니다.

 

그리고 세번째 작업인 router를 사용하겠다는 것을 vue에 등록하는 작업입니다.

main.js를 보면 new Vue가 있습니다.

여기서 Vue 문법을 통해 최종(?)적으로 렌더하고 있음을 아셔야 합니다.

new Vue 내부에 라우터를 등록합니다.

그러기위해서는 import가 먼저겠죠?

 

router.js를 import해옵니다.

그 후 Vue 문법에 맞게 router를 Vue에 넣어줍니다.

라우터 설정한 영역을 보여 줄 뷰 태그 삽입

그리고 마지막으로 등록한 라우터를 보여줄 곳에 <router-view></router-view>태그를 등록해줍니다.



 

App.vue에 넣어보도록 하겠습니다.

 

아까 띄운 서버를 확인(localhost:8080)해보면 HOME 컴포넌트가 성공적으로 나오는 모습이 보입니다.

라우터 설정, 컴포넌트 추가 요약

자 이제 다른 컴포넌트들도 추가해보도록 하겠습니다.

아래의 상황을 반복하여 만들어 주도록 하겠습니다.

 

Home 컴포넌트 예시

1.컴포넌트 생성 (Home.vue)

2.router.js에 옵션 값 삽입

결과

 

그리고 각각의 컴포넌트를 알아볼 수 있도록 텍스트를 넣어주겠습니다.

바뀌었는데 내용이 없어서 모를 수도 있기 때문입니다.

 

 

그 후 localhost:8080뒤에 /introduce 혹은 /page를 추가로 넣어서 확인해보겠습니다.

접근이 가능합니다만 저희는 네비를 클릭해서 이동하는 것을 의도하고 있습니다.

따라서 App.vue에서 nav 버튼 클릭 시 페이지 링크 이동이 가능하도록 nav 부분을 수정해주겠습니다.

 

App.vue

아래와 같이 수정하겠습니다.

<router-link> 태그를 통해 버튼 클릭시 to=”” 안에 있는 링크로 이동이 가능합니다.

저렇게 넣고 해당 버튼 클릭 시 url이 변하는 것과 해당 컴포넌트가 변하는 것이 확인 가능합니다.

 

자 이제 1회차에서 했던 부분을 활용하여 꾸며 주면됩니다. (v-for로 데이터를 반복시킨다던가해서 페이지를 꾸며보세요.)

 

2회차의 목적은 라우터 였으므로 여기서 마무리하겠습니다~

 

*선생님코드아님 주의, 틀릴 수 있음 주의, 들으면서 적은거 아님주의, 복습하면서 적은거임,

기능개발하기

1. 리스트 팝업 토글

2. 50만원 미만

3. 고가순 정렬

4. 저가순 정렬

5.리스트 원래대로

1.리스트 팝업 토글

-<template>내부에 버튼과 팝업의 html을 생성해주세요.

버튼

팝업

위의 List는 컴포넌트화 해서 가져왔는데, 이렇게 해도 되고 html에 그냥 태그를 사용해서 작성해도 상관 없습니다.

(원룸들오리지널을 넣어야 변형이 없습니다.)

-data에 배열 데이터, if문에 들어갈 데이터가 있어야합니다.

여기서 리스트보여줄까로 show, hide하고 원룸들 데이터로 v-for를 사용해서 출력해줍니다.

여기서 원룸들의 [...Data]는 원룸 데이터를 import해와서(Data)를 deep 카피하여 넣은 것입니다.

 

정리하면

import Data from '경로' 로 데이터를 Data로 가져오고

이 Data를 하나는 오리지널로 원룸들오리지널에 할당해주고

하나는 [...Data]해서 복사한 데이터를 원룸들에 넣어주는 부분입니다.

 

그 후 클릭하면 보여주기 위해서 함수를 만들어줍니다.

-methos에 함수를 추가해줍니다.

(Vue의 함수들은 methos에 들어가야 합니다.)

클릭하면 not연산자 (!) 로 인해서 this.리스트보여줄까 의 값은 항상 반대되는 값이 할당됩니다.

스타일은 본인이 추가하여 팝업형식으로 만들어보면 됩니다.

아래는 렌더링 결과입니다.

-html

데이터를 이용해서 리스트를 하나 만들어줍니다. 

데이터의 변형이 그때 그때 필요하기 때문에 원룸들 데이터를 사용합니다.

Card 컴포넌트에 v-for문을 넣어 반복시켰으며 컴포넌트에 prop로 원룸들 데이터를 전달해줬습니다.

props는 아래와 같이 받습니다.

전달한 props를 데이터 바인딩 해줍니다.

2. 50만원 미만

먼저 methos에 함수를 생성해줍니다.

filter를 이용해서 50만원 미만인 배열만 return 하였습니다.

그 후에 template 내부의 html 태그에 v-on:click으로 함수 바인딩해줍니다.

50만원 미만의 배열만 return됨을 확인할 수 있습니다.

3. 고가순 정렬

똑같이 html 태그를 사용하여 버튼을 만들고 methos에 함수를 생성해 준뒤, 바인딩해줍니다.

sort 함수를 이용하여 내림차순으로 정렬합니다. 

a,b 파라미터로 넘어온 배열들을 각, 각의 price를 비교하여 내림차순으로 정렬해줍니다.

this.resetData()는 조금 뒤에 설명하겠습니다만 없으면 안됩니다.

4. 저가순 정렬

이것도 sort함수를 이용해주는데, 아까와는 반대로 a,b의 위치가 변경되었습니다.

오름차순으로 정렬했습니다.

5 리스트 원래대로

버튼을 만들고 바인딩해줍니다.

맨 처음 저장했던 데이터의 순서대로 나오게 할 것입니다.

this.원룸들에 오리지널 데이터를 삽입해줄 것인데,

이때 위와 같이 안넣고 그냥 this.원룸들 = this.원룸들오리지널을 넣게되면 this.원룸들오리지널과 데이터가 바인딩되므로,,, 데이터 변형 시에 원룸들오리지널도 변형이 됩니다.

 

따라서 [...this.원룸들오리지널] (deep 카피방식)을 이용해서 this.원룸들에 오리지널데이터를 넣어줍니다.

data영역도 보면 원룸들은 import한 데이터를 [...Data] 형식으로 넣어주고 있습니다.

이것도 Data의 변형을 막기 위해 deep 카피 방식을 사용한 부분입니다.

(틀렸으면 알려주세요)

 

이렇게 하는 이유가...

저가순, 고가순 함수를 사용할 때, filter, sort메소드를 사용하고 있는데 이 메소드들은 원본 데이터에 변형을 가져오는 함수들이기 때문입니다.

즉 저가순으로 정렬하면 원본데이터가 저가순데이터로 아예변형이 되는 것입니다.

 

따라서 reset함수가 없으면 

50만원미만 -> 고가순 눌렀을 때, 50만원미만 데이터가 3개로 한 번 걸러졌다면 3개의 데이터를 가지고 고가순으로 정렬이 진행될 수 있습니다.

 

따라서 필요한 위치를 파악하여 resetData해주는 부분이 필요합니다.

+ Recent posts