기존의 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도  변수이므로 여러 반복문에서 같은 네임으로 하면 안됩니다.

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

기본 데이터만 남습니다.

 

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

 

 

CSS를 이용해 객체 가운데 위치하기!


객체를 가운데에 두는 방법에는 여러 개가 있다. 
calc를 기억해두려는 목적으로 글을 쓰기 시작했는데, 내가 작업하면서 써봤던 방법을 작성해두려고 한다. (flex-box는 논외)

조건은 부모 객체의 가운데에 위치시키기다.

HTML
<div class="wrapper">
  <div class="popup">   
  </div>
</div>

CSS
.wrapper{
  position:relative;
  width:400px;
  height:400px;
  background-color:#cacaca;
}
.popup{
  position:absolute;
  top:50%;
  left:50%;
  margin-top:-75px;
  margin-left:-75px;
  width:150px;
  height:150px;
  background-color:pink;
}

이런 식으로 영역의 50%를 top, left 내리고 그 객체 사이즈의 반 값을 빼주는 형식으로 작업했다.
(객체 시작 위치를 기준으로 50% 이동하기 때문에 객체의 값을 빼줘야 가운데 위치한다.)

위와 비슷하게 calc를 쓸 수 있다.
CSS
.wrapper{
  position:relative;
  width:400px;
  height:400px;
  background-color:#cacaca;
}
.popup{
  position:absolute;
  top: calc(50% - 75px);
  left: calc(50% - 75px);
  width:150px;
  height:150px;
  background-color:pink;
}

top: calc(50% - 75px);
left calc(50% - 75px);
(75px은 객체의 반 값)

[예제]

See the Pen study-alignment css3 by leeyoonseo (@okayoon) on CodePen.



IE9~ 지원하는데, 부분 지원이라고 나온다.

물론 값이 변수일 경우에는 js로 비슷하게 작업했다.

HTML
<div class="wrapper">
  <div class="popup">   
  </div>
</div>

CSS
.wrapper{
  position:relative;
  width:400px;
  height:400px;
  background-color:#cacaca;
}
.popup{
  position:absolute;
  top:50%;
  left:50%;
  width:150px;
  height:150px;
  background-color:pink;
}

JS
const popup = document.getElementsByClassName('popup')[0];
const _width = popup.offsetWidth;
const _height = popup.offsetHeight;
popup.style.marginTop = -(_width/2)+'px';
popup.style.marginLeft = -(_height/2)+'px';

가운데에 위치하기 위한 margin 값 들을 변수로 받아서 계산한 후에 적용시켜준다.
이렇게 하면 width, height 값이 변하더라도 깨지지 않는다.

[예제]

See the Pen study-alignment js by leeyoonseo (@okayoon) on CodePen.



'~2022 > FE-개발 개념' 카테고리의 다른 글

로컬 스토리지(Local Storage)  (0) 2019.06.05
쿠키(Cookie)  (0) 2019.06.05
CND이란?  (0) 2019.05.16
MVC 패턴  (0) 2019.05.16
구글 API KEY생성하는 법  (0) 2018.10.26
void 0 이란?  (0) 2018.10.23
let 키워드, const 키워드  (0) 2018.10.23
ES6 매개변수 기본 정의  (0) 2018.10.16


02. Rest 파라미터 - 스프레드(Spread) 연산자와 Rest  파라미터  


Spread 연산자로 파라미터를 작성한 형태를 Rest 파라미터라고 한다.
function(param, paramN, ...rest);
const number = [1,2,3]
getNum(...number);

function getNumt(num1, num2, num3){
    console.log(num1, num2, num3);
}

결과 값
num1 = 1
num2 = 2
num3 = 3

호출하는 함수의 파라미터에 3개의 값을 쓰고 
호출받는 함수의 파라미터를 2개의 값만 썼을 경우 3번째 파라미터 값은 설정되지 않는다.(예제1)
이때, rest 파라미터를 사용함으로써 배열 엘리먼트로 저장할 수 있다.(예제2)
(예제1)

getNum(...[1,2,3]);

function getNum(num){
    console.log(num);
}

결과 값
1

=============================================
(예제2)

getNum(...[1,2,3]);

function getNum(...rest){
    console.log(rest);
}

결과 값
[1,2,3]

...rest라고 적어 둔 arguments 명은 변경되어도 된다. (...number, ...test 등등)

Spread와 Rest가 '...'으로 표현하는게 같아서 뭐가 다르지? 생각할 수도 있다.
기능적으로 차이가 있다.

Spread 파라미터는 분리,전개
1.호출하는 함수의 파라미터에 사용한다.
2.파라미터로 사용 시 전개하는 기능을 한다.

Rest 파라미터는 전개된 엘리먼트 배열로 설정
1.호출받는 함수의 파라미터에 사용한다.
2.파라미터 값을 설정하고 설정되지 못한 나머지 파라미터 값들을 배열에 설정한다. 


+ Recent posts