• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

button 클릭 할 떄 마다 더보기/닫기 에러

21.11.05 11:04 작성 조회수 588

0

제로초님 안녕하세요.

제가 button 클릭 할 떄마다 더보기/닫기 버튼을 만들어 주었는데.

 

처음에는 5개씩 보이도록 설정 해 주고.

더 보기 버튼을 클릭하면 -> 모든 length 만큼 보이도록 설정 해 주었습니다.

그리고 닫기 버튼을 누르면 -> 처음 5개만 보이도록 설정 해 주었구요.

 

하지만 문제점이 있습니다.

클릭 하면 동작은 합니다. 하지만, 1~2초 있다가 type Error 가 발생합니다.

어디서 잘못 됐는지 잘 모르겠습니다.

 

아 그리고 처음에 5개 이하로 보일 떈 버튼을 안 보이도록 설정 해 주고 싶은데,

어떻게 코드를 작성 해야 할 지 모르겠습니다. 똑같이 setState 를 만들어서 5개 이하로 보이는 것들은 false 를 만들어 안보이도록 설정 해 주면 될 거 같은데 모르겠네요

 

에러 발생 구문 입니다.

TypeError: setVisible(...) is not a function

  46 | 
  47 |    
  48 |    const showMore = () => {
> 49 |        visible === 5 ? (
  50 |          setVisible(ProductDetail.allergies.length)
  51 |        ) (
  52 |           setexpanded(true)

 

// 제가 작성한 코드 입니다. 

 const [visible, setVisible] = useState(5)
    const [expanded, setexpanded ] = useState(false);

    const showMore = () => {
        visible === 5 ? (
           setVisible(ProductDetail.allergies.length)
        ) (
           setexpanded(true)
        ) : ( 
           setVisible(5)
        ) (
            setexpanded(false)
           
        )

  return (

 {ProductDetail && ProductDetail.allergies?.length ? 
                            ProductDetail.allergies.slice(0, visible).map(All => (
                            <li key={All.id}>
         {All.displayText}</li>
                        )) : <li>No information.</li>}
)


    
                    <button type="button" onClick={showMore}>
                        {expanded ? (
                            <span>close</span>
                        ) : (
                            <span>see more</span>
                        )}  
                    </button>
                    

    }




답변 1

답변을 작성해보세요.

0

자바스크립트 문법 실수입니다.

삼항 연산자 안에서 함수 두 개를 호출 못 합니다. if문을 쓰세요.

if (visible === 5) {
  setVisible...
  setExpanded...
} else {
  setVisible...
  setExpanded...
}

jsx 부분을 빼면 리액트도 자바스크립트입니다. 자바스크립트 문법대로 코딩하세요.

김수민님의 프로필

김수민

2021.11.05

만약에 visible 이 5 개 이하로 있어서 button 을 안보이게 설정 하도록 할려면 어떻게 코드를 작성 해야 할까요??

기초 강좌를 다시 보고 오셔야 할 것 같습니다.

김수민님의 프로필

김수민

2021.11.05

javascript 기초가 많이 부족한 가요?

나름 es6 문법이나 왠만하면 다 아는 거 같은데.

javascript 로 연산을 많이 안 해봐서 계속 막히는 거 같은데.. 잘 모르겠네요.

제 생각에는 javascript 로 알고리즘 많이 풀어보면 좋아 질 거 같기도 하고 

제로초님 어떻게 생각하십니까

 

visible > = 4  까지 면 null 값을 사용해 안보이도록 했는데.

렌더링 시 button 이 없어지는 것이 아니라 클릭해야 null 값을 받고 버튼이 사라지네요 

useEffect 에서 관리를 해 줘야 하나 

          <ButtonBox>
                                {
                          visible >= 4  ?
                    <button type="button" onClick={showMore}>
                        {expanded ? (
                            <div><span>닫기</span><img src={Vector190}/></div>
                        ) : (
                            <div><span>더보기</span><img src={Vector189}/></div>
                        )}  
                    </button>
                            : null
                        }
                         </ButtonBox>

visible 첫 값이 5라서 그럽니다. 왜 첫 값이 5인가요?

김수민님의 프로필

김수민

2021.11.05

slice 함수를 이용해 처음에는 0에서 부터 5개만 보이게 하고 

visible 이 5개로 보인다?

그러면  setVisible(ProductDetail.allergies.length

length 길이 만큼 모두다 출력 되도록 만들었습니다.

visible이 5개 미만으로 가는 때는 언제인가요? ProductDetail.allergies.length가 5개 미만일 때밖에 없어보이는데요. 애초에 ProductDetail.allergies.length가 5개 미만일 때는 visible 값을 그걸로 설정하면 되지 않을까요?

김수민님의 프로필

김수민

2021.11.05

<ButtonBox>
                               
                          { visible < ProductDetail.allergies?.length
                        ?  <button type="button" onClick={showMore}>
                        {expanded
                        ? (<div><span>닫기</span><img src={Vector190}/></div>)
                        : (<div><span>더보기</span><img src={Vector189}/></div>)
                        }  
                          </button>
                            : null
                        }
         </ButtonBox>
김수민님의 프로필

김수민

2021.11.05

해결 했습니다. 

감사합니다.

제가  프론트 입문 한지 1년차 인데 부족한 게 많은 거 같습니다.

저도 언젠간 열심히 하다보면 제로초님 같은 멘토님이 되길..

항상 감사합니다