전체 글 (165)

06
21

1. box-sizing

  • pading 과 margin, border 의 사이즈 때문에 width와 height 사이즈가 헷갈릴때 사용할 수 있다.
  • content-box 가 기본값이며, border-box 로 속성을 설정하면 모든 영역(margin, pading border 전부 싹다!)이 다 포함 되어 진다.
  • box-sizing: border-box; 로 사용하면 된다.

2. background 의 다양한 속성

  • background-color : 색을 바꾼다.
  • background-image : 이미지를 배경으로 사용한다.
    • url(경로); 를 사용해서 이미지를 불러오면 된다.
    • 이미지가 배경 배경의 크기보다 작을경우 바둑판 식으로 반복해서 나오게 된다. 이는 background-repeat 속성으로 수정하면 된다
  • background-repeat : 배경 이미지를 반복시킨다.
    • 기본값은 repeat으로 되어 있다. no-repeat으로 바꿔서 반복해서 나오는 이미지를 하나로 만들어서 배경으로 쓸 수 있다.
  • background-position : 초기 배경의 위치를 결정한다.
    • 기본값은 left top 이다. 그래서 이미를 배경으로 설정해 놓고, repeat을 없에면 좌상단에 배경이 하나 나오는 것을 알 수 있다.
  • background-size : 배경 이미지의 사이즈를 설정한다.
    • background-size: 넓이 높이 로 사용할 수 있다. 위의 상황처럼 이미지를 배경으로 사용하고 반복을 없엔 후에,
      배경이 컨텐츠 사이즈 보다 작을때, 컨탠츠 사이즈 만큼의 크기를 설정해 주면 가득 찬 이미지로 배경을 얻을 수 있다.
    • 위의 조건을 간단하게 background-size: cover; 로 이미지를 늘려서 배경을 전부 덮어 줄 수 있다.
    • background-size: contain; 을 사용하면, 이미지 자체가 잘리지 않는 한도 내에서 배경의 사이즈를 설정한다.
  • background: 세부 속성 : background는 하위 속성들을 정확한 값으로 정의만 해주면 위의 내용을 똑같이 사용할 수 있다.
    • Ex) background-color : brue; === background: brue; (이후 다른 세부속성을 계속 적어주면 된다)

3. float 과 clear

  • float은 코드를 작성한 순서를 무시하고, float: 원하는 위치; 로 옮긴다.
  • clear은 float을 제거하여 코드가 작성된 순서로 다시 위치를 돌린다.

4. position

  • 요소의 위치 값을 바꿔준다.
  • position: fixed; top: 원하는 높이; left 혹은 right; : 원하는 가로 위치; : 코드의 작성 순서와 상관없이 지정된 위치에 요소를 고정시킨다.
    • fixed로 고정을 시켜 놓으면, 스크롤를 아무리 움직여도 브라우저의 정해준 위치에서 벗어나지 않는다.
  • position: sticky; : 코드의 작성순서에 따라 일단 배치한 후에, 스크롤이 되는 도중에 정해준 위치에 요소가 오면 붙어서 고정된다.
    • Ex) position: sticky; top: 0px => 다른 위치에 있던 요소가 유저가 스크롤을 하다가 브라우저의 최상단에 위치 하게 되면 그대로 붙어서 고정된다!

5. 선택자를 더 다양하게 활용해 보자.

  • [원하는 선택자] 그 선택자만 선택해 골라진다.
    • Ex) [class=""name] 이후 속성을 적어주면 class 가 name 인 모든 class의 속성을 바꿔주게 될 것이다.
  • 연산기호로 더 다양하게 활용 할 수 있다.
    • *="문자" => 지정한 문자가 이름에 들어가 있는 선택자만 고른다.
    • ^="문자" => 지장힌 문자로 시작하는 이름을 가진 선택자만 고른다.
    • $="문자" => 지정한 문자로 끝나는 이름을 가진 선택자만 고른다.
  • 자손 결합자 : 선택자의 선택자를 선택한다.
    • Ex) body p {CSS 코드} => body안의 모든 p 요소를 선택한다.
    • Ex) body > span {CSS 코드} => body 바로 아래의 span 만 선택한다.
      • 만약, body안에 p안에 span이 있다면 선택 되지 않는다. 이럴때는 p > span이라고 해 줘야 한다.
  • 형제 결합자 : 선택자의 선택자 형제요소들을 선택한다.
    • Ex) h1 ~ p {CSS코드} => h1과 같은 위치에 있는 모든 p 들을 선택한다.
    • Ex) h1 + p {CSS코드} => h1의 바로 뒤에 있는(첫번째 있는) p를 선택한다.
  • 물론 조건만 만족하면 여러개의 요소를 선택도 할 수 있다.

6. 의사클래스

  • 선택자에 추가하여, 특정한 상태가 되면 요소를 선택하겠다는 의미 이다.
  • 즉, 기본일때 하나의 상태와 의사클래스가 들어가 있는 상태 두개의 상태를 CSS 코드로 작성 해 주어야 한다.
  • 자주 사용하는 의사클래스
    • hover : 마우스 커서가 올라 갔을때 적용
      •  box-shadow: 가로, 세로, 색 => 입체감을 살리는 그림자를 만들 수 있다.
    • active : 활성화 상태가 되면 적용 (마우스를 누른다거나 하는 상황)
      • 선택자:active {transform: scale(0.9);} => 버튼이 눌리는 애니메이션을 간단히 만들 수 있다.
    • focus : 그 요소가 선택된 상태일때 적용 (input 에 text를 쓰기 위해 커서가 깜박이는 상태 같은 경우)
    • disabled : 요소를 사용불가능으로 만듬 (예를들어 휴대폰 인증 이후에 인증되었습니다. 같은 거 만들어 놓을때 사용하면 될 것 같다)
    • nth-child() : 그 요소의 형재들 중에 특정한 번째의 요소를 선택한다.
      • ()에는 원하는 번째의 숫자를 넣으면 되고, n을 넣어서 수식으로도 선택이 가능하다.
      • nth-child(2n) => 짝수번쨰에 있는 요소만 선택
COMMENT
 
06
20

1. onClick?

  • 마우스 클릭이 이루어 지면 다음 함수를 실행 시킨다.
  • 이때 함수가 받아올 것은 '클릭된 자신' 이므로 onClick={() => 함수 혹은 무언가} 로 ()부분을 비워서 가져오도록 한다.

2. 어떨때 사용할까?

  • 클릭이므로 버튼이나 혹은, 정보를 담고 있는 태그 (a 등) 에 사용한다.
  • state 값을 바꿀때 원래 state 와 비교될 데이터를 가져올 때 사용 할 수 있다.
  • onClick 안에 const로 선언된 변수인 주로 eventHandle을 받아 그것의 파라미터로 받은 비교될 데이터를 가져와
    setState에 해당하는 함수를 적어서 사용하면 state를 바꿔버릴 수 있겠다!

3. onChange의 이벤트 객체의 오묘한 차이

  • onChange 는 value 값을 주로 input 태그 안에서 줘서 그 value 값을 useState로 렌더 하는 곳에 주로 사용되는 기능이었다.
  • 그럼 우리가 집중하는 onClick 에 이벤트 객체를 줘 버리면 어떻게 될까?
    • onClick 의 안에는 엄청나게 다양한 데이터가 들어 있다. 우리가 받아온 이벤트의 target을 보면 우리가 목표로 하는 이밴트가 있는 태그 전체가 나온다.
    • 물론 이대로 사용해서 안의 데이터를 가져올 수 는 있다.
    • 하지만 자세한 사항은 잘 모르겠다. 매우 복잡한 값들이 console.log로 찍힌다. 가져온 태그 안에서의 데이터를 사용할때 state는 바뀌지 않았다.

드디어 이밴트를 올바르게 사용하는 법을 알았다.
일주일 고민하던 문제는 해결 되었다.
하지만 원래 하던 이밴트 객체를 주어 onClick 함수를 이용하려고 했을때 앱은 작동하였지만 왜 작동하는지는 알 수 없었다.
조금 더 자세하게 알아보면 좋겠지만, 정확히 알기 위해서는 너무 많은 정보가 필요할 것이므로
아직은 때가 아니라고 생각한다.

아직은 이밴트를 올바르게 사용하는 법을 좀 더 익히는 단계가 좋을 것 같다.

COMMENT
 
06
19

1. 컴포넌트 정리

  • img 같은 경우 컴포넌트를 뽑아서 외부에서 className과 받아올 이미지 정보를 넣어서 렌더링 시킨다.
  • img 태그 안에는 alt 가 들어가야 한다. 아니면 에러는 아니지만 경고가 뜬다.

2. props 로 데이터 주고 받기

  • 일반적인 형태는 '받을 자료의 이름'={props.props데이터의 이름} 이다.
  • 잊지말고 props 를 함수의 인자로 받아줘야 한다. 그게 싫다면 받아올 자료의 이름을 함수 인자안에 {}으로 감싸서
    넣은 후에 사용할때도 그대로 이름으로 쓰면 된다.

3. App.js

  • 우리가 직접 볼 '틀' 이 된다.
  • BrowserRouter, Route, Switch, Link 를 통해 주소 경로를 정해주고 알맞은 곳에 컴포넌트도 배치해 준다.
  • Route 설정시 홈 주소에는 exact path 로 다른 주소와의 혼선을 방지하자.
    • 주소는 뒤에서 부터 읽어 들어간다고 보면 쉽다. 그러니 주로 홈의 주소가 되는 "/" 는 다른 주소들에도
      들어가 있기 때문에 확실히 주소가 "/" 일때만 이동되는 exact path 를 넣어준다고 생각한다.

4. 본문

  • 주로 목록이 될 데이터는 가장 상단에서 map 을 이용해 원하는 정보만을 배열로 반환해서 선언해 두는 것이 유리하다.
  • 이후 useState 로 변동이 있을 데이터를 저장해 둔다.
  • a 태그에는 href 를 넣어야 한다. 하지만 이것도 마찬가지로 에러는 아니다. 리액트에서는 주로 새로고침 되는 것을 막기 위해 href는
    쓰지않고 Link to로 경로를 설정하는데 본문에서 href 를 사용하는건 이상하다.
  • id 로 className 을 덮어버릴 수 있다. 원본 데이터가 들고 있던 id 도 마찬가지로 본문 태그 안에서 id를 다시 설정해 주면 된다.

같은문제를 계속 보고 있다.
이제 나머지 부분은 전부 숙달된 것 같지만 아직 이벤트 핸들링이 조금 아쉽다.
원본의 데이터의 상태를 바꿔서 원하는 곳으로 다시 호출하는 것이 무슨 상관인지 잘 모르겠다.
원본 데이터를 수정하는 것이 좋은 일이 아닌것 같은데 조금 더 자료를 찾아 봐야 할 것 같다.
이미 완성된 다른 사람들의 예시를 찾아보고 조금 더 효율적으로 코드를 짜는 법을 배워야 겠다.

COMMENT
 
06
17

1. map

  • 객체의 키와 값을 모두 다른 조작 이후에 새로운 배열로 각각 반환하는 메서드.
  • 리액트에서는 주로 컴포넌트에서 데이터를 받아와 각각의 요소를 반환하는 방식으로 사용된다.
const friends = ["James", "Akbak", "Mark", "Jully"]
const smilingFriends = friends.map(friends => {return friends + "^^"}); //  ["James^^", "Akbak^^", "Mark^^", "Jully^^"]
  • 물론 저렇게 전부 수정할 수 도 있으며, 객체 안에 있는 키를 받아 반환할 수도 있다.
const friends = [
  {name: "James", age: 25, onShift: true}, 
  {name: "Akbak", age: 30, onShift: true},
  {name: "Mark", age: 30, onShift: false},
  {name: "Jully", age: 26, onShift: false}
]

const friendsAge = friends.map(tooYoung => {return tooYoung.age});
console.log(friendsAge) // [25, 30, 30, 26]
  • 그럼 만약 콜백 함수 자체를 찍으면 무엇이 나올까?
    • 아무것도 안 나온다. 이미 map을 사용한 함수 안에서 써 버리고 함수를 나온 뒤에는 다시 찾을 수 없다.
  • 웬만하면 콜백 함수의 인자를 우리가 사용할 데이터의 이름 자체를 써 버리면 한 줄로 써도 쉽게 찾을 수 있다.
    예시 1번처럼 말이다. 2번의 경우 tooYoung이라는
    이름으로 무슨 인자를 받는지 알 수 없는 무의미한 말이다.

2. filter

  • 객체 안에서 원하는 값을 가져와 배열로 반환하는 메서드.
  • map이랑 헷갈릴 수 있지만 우리가 생각하는 filter을 생각하면 된다. 조건에 맞는 값만 걸러주기
    때문이다.
  • 또 map과 큰 차이는 map은 다시 데이터를 원하는 데이터만 뽑아서 배열로 반환한다는 것이다. filter는 조건에 맞는 "객체"를 가져온다.
const friends = [
  {name: "James", age: 25, onShift: true}, 
  {name: "Akbak", age: 30, onShift: true},
  {name: "Mark", age: 30, onShift: false},
  {name: "Jully", age: 26, onShift: false}
]
// 오늘 근무은 친구들을 알고싶다.
const todayWork = friends.filter((friends) => {return friends.onShift === true});
console.log(todayWork);
// {name: "James", age: 25, onShift: true},  {name: "Akbak", age: 30, onShift: true}

3. reduce

  • 배열에 있는 모든 값을 누적시켜서 반환한다.
  • 그래서 이전 값과 지금의 값을 둘 다 인자로 콜백 함수가 받는다.
const friends = [
  {name: "James", age: 25, onShift: true}, 
  {name: "Akbak", age: 30, onShift: true},
  {name: "Mark", age: 30, onShift: false},
  {name: "Jully", age: 26, onShift: false}
]

// 친구들 나이의 평균 값은?
const averageAge = friends.reduce((acc, cur) => {return acc + cur.age}, 0);
console.log(averageAge / friends.length); // 27.75
  • 콜백 함수에서 return 된 값은 acc가 되고, 다음 올 값은 cur 이 된다. 결국 순차적으로 리턴되는 값은 acc가 될 것이다.
  • 마지막에는 초기값을 정해줄 수 있다. 위의 예시에서는 초기값을 0부터 시작했다. 다 더해서 평균을 구해야 하기
    때문이다. 아무것도 넣지 않으면 cur 값이 초기값이 된다. 그러므로, 위의 예시에서는 초기값을 안 정해줘도 문제가 없지만, 정해주는 것이 side effect를 줄일 수 있을 것이다.

4. 그 외의 배열의 유용한 메서드

 

1. join

  • 배열의 데이터를 합쳐서 하나의 스트링으로 만들어 버린다.
  • 각각의 데이터 사이에 구분자도 넣어서 구분해 하나의 스트링으로 만들어 줄 수도 있다.

2. split

  • 스트링을 합쳐서 하나의 배열로 만들어 버린다.
  • 각각의 데이터 사이에 구분자도 넣어서 구분해 하나의 배열로 만들어 줄 수도 있다.
  • limit 값을 입력해 주면 원하는 index까지의 데이터를 얻을 수 있다.
const friends = ["James", "Akbak", "Mark", "Jully"]
const result = frinends.split(",", 2) // 이때, 숫자 2가 limit
console.log(result) // ["James", "Akbak"]

3. splice

  • 배열에서 원하는 데이터를 삭제한다.
const friends = ["James", "Akbak", "Mark", "Jully"]
const result = frinends.splice(0, 2) // idex 0 부터 2개의 아이템을 삭제하겠다.
console.log(result) // ["Mark", "Jully"]
console.log(friends) // ["James", "Akbak", "Mark", "Jully"]

4. slice

  • 배열에서 원하는 아이템 만을 잘라서 보여준다.
    const friends = ["James", "Akbak", "Mark", "Jully"] frinends.slice(0, 2) // idex 0 부터 2개의 아이템 만 보여달라. => ["James", "Akbak"] 
    console.log(friends) // ["James", "Akbak", "Mark", "Jully"]`
  • 위의 예시처럼, slice는 아무리 해도 '보여' 줄 뿐이다. 진짜 배열을 수정하지 않는다. (immutable)
  • 물론 splice로 나눠버리면 진짜 배열도 잘린다. (mutable)

5. find

  • 배열 안에서 조건에 맞는 아이템을 찾아 보여준다. 조건에 맞는 경우를 찾은 후에 함수는 종료된다.
  • 콜백 함수로 전달 하자.

6. some

  • 배열에서 하나라도 조건에 맞는 요소가 있으면 true를 반환한다.
  • every는 전부 다 맞아야 true를 반환한다.

7. sort

  • 콜백 함수를 전달받아서 인자로 이전 값과 현재 값을 받아, 마이너스를 리턴하게 되면 현재 값이 더 작다고 생각하고 정렬한다.
  • 간단하게 말하면 작은 거부터 큰 순으로 정렬해 준다.
const friends = [
  {name: "James", age: 25, onShift: true}, 
  {name: "Akbak", age: 30, onShift: true},
  {name: "Mark", age: 30, onShift: false},
  {name: "Jully", age: 26, onShift: false}
]
// 인생 짬순으로 정렬!
const sortAge = friends.map((friends) => friends.age)
    .sort((a, b) => a - b)
console.log(sortAge) // [25, 26, 30, 30]

이전에 정리했던 것들을 한번 더 정리했다.
훨씬 찾고 보기 편하다.
외우지 않더라도 어떤 상황에 사용할지를 생각하자.
사용방법은 찾아보면 나온다.
계속 리액트 팬다. 진짜 씨게 팬다. 사실 그러려고 메서드 공부했다.

COMMENT