Coding (164)

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
 
06
17

1. 리액트 이벤트 컴포넌트 만들기

  • 유저의 행동이 있으면, 그 행동에 따른 함수를 실행시켜준다. 이것이 이벤트라고 할 수 있다.
  • 이때, 이벤트 함수는 데이터를 props 형태로 받게 될 것이고, 이를 리액트에게도 전달하여, 렌더링 시키는 것 까지 해야 완성이다!

2. map과 함께 사용하는 useState

  • map을 사용한 후에 나올 인자들을 이용해 올리면 state 값으로 지정할 수 있다.
  • 외부에서 함수를 지정했을때 유리하게 사용할 수 있다.

계속 똑같은 문제를 돌고 돌고 돌고 있다
조금씩 완성 되어 가긴 하는데 뭔가 조금 부족하다!
아직 시간이 많으니 계속해 봐야겠다.
유튜브든 글이든 '나랑은 관계 없다', '아직 너무 어렵다'라는 생각은 안 해야 한다. 귀찮아도 한번 읽어 보면 뭔가
힌트들을 찾을 수 있다.

COMMENT