section 04 quiz 중 2.Map/Filter에 대한 질문
퀴즈 내용엔 '체크박스를 체크하고 삭제 버튼을 클릭하면, 해당 줄을 삭제해 주세요.'라고 되어있는데 체크 여부에 따라서 버튼의 활성화 여부를 지정하려고 하는데 제대로 작동하지 않습니다. 어떻게 코드를 작성하면 될까요?
import {useQuery, gql, useMutation} from '@apollo/client'
import styled from '@emotion/styled'
const FETCH_PRODUCTS = gql`
query fetchProducts{
fetchProducts{
_id
seller
name
price
}
}
`
const DELETE_PRODUCT = gql`
mutation deleteProduct($productId:ID){
deleteProduct(productId: $productId){
message
}
}
`
const Row = styled.div`
display: flex;
`
const Column = styled.div`
width: 100px;
border: 1px solid;
`
export default function FetchDeleteProduct(){
const [deleteBoard] = useMutation(DELETE_PRODUCT)
const {data} = useQuery(FETCH_PRODUCTS)
console.log(data?.fetchProducts)
const onClickDelete = async (event) => {
if(document.getElementById("check")) {
await deleteBoard({
variables : {
productId: event.target.id
},
refetchQueries:[{query:FETCH_PRODUCTS}]
})
}
}
return (
<>
{data?.fetchProducts.map((el) =>
<Row key={el._id}>
<Column>
<input type="checkbox" id="check"/>
</Column>
<Column>{el._id}</Column>
<Column>{el.seller}</Column>
<Column>{el.name}</Column>
<Column>{el.price}</Column>
<Column>
<button id={el._id} onClick={onClickDelete}>삭제</button>
</Column>
</Row>
)}
</>
)
}
답변 1
0
안녕하세요 현정님
현재 UI구축이 되어있지만 checkbox에 checked 를 지정하지 않으셨습니다
체크 여부를 boolean으로 관리하는 함수를 만드시고 onclick에 따라 boolean값을 state에 담아주어 관리하면 될것같습니다<input type="checkbox" id="check" checked={체크여부state}/>
0
답글 확인을 못하신 거 같아서 다시 답변 답니다! ㅜㅠ
이미 왜 안되는지 고치려고 시도를 많이 했는데 안되고 있는 상황이라 설명을 코드로 해주시면 감사하겠습니다. 현재 말씀주신대로 해봤는데 해당 화면이 출력되고 전체 체크박스가 체크됩니다.
export default function FetchDeleteProduct(){
const [deleteBoard] = useMutation(DELETE_PRODUCT)
const {data} = useQuery(FETCH_PRODUCTS)
console.log(data?.fetchProducts)
const [checking, setChecking] = useState(false)
const onClickDelete = async (event) => {
if(document.getElementById("check")) {
setChecking(true)
await deleteBoard({
variables : {
productId: event.target.id
},
refetchQueries:[{query:FETCH_PRODUCTS}]
})
}
}
return (
<>
{data?.fetchProducts.map((el) =>
<Row key={el._id}>
<Column>
<input type="checkbox" id="check" checked={!checking}/>
</Column>
<Column>{el._id}</Column>
<Column>{el.seller}</Column>
<Column>{el.name}</Column>
<Column>{el.price}</Column>
<Column>
<button id={el._id} onClick={onClickDelete}>삭제</button>
</Column>
</Row>
)}
</>
)
}
0
체크 표시 기능에 문제는 없으나 삭제 버튼을 눌렀을 때 정상적으로 내용이 사라지지 않습니다. 코드 중 console.log(data?.fetchProducts) 에선 undefined가 출력됩니다. 그리고 현재 체크 표시 버튼을 누르면 원래 비활성화되었던 삭제 버튼을 누를 수 있개 활성화되게 코드를 구현시켜야 합니다.
0
체크표시에 문제가 없다면, onClickDelete함수를 바꿔 주셔야 합니다.
if 문을 삭제하고 mutation이 실행될 수 있도록 해주세요.
id를 삭제했으니 if문의 조건에서 false가 떠 아래 mutation이 작동하지 않는 것 입니다.
체크표에 굳이 state를 사용할 필요 없으며, id를 지웠으니 document 를 사용하지 않아도 됩니다.
그리고 variables를 보내주실때 넘겨주는 id값을 Number로 감싸서 넘겨주세요.
해당 과제가 어려우시다면 강의를 한번 더 보고 진행하시는걸 추천 드립니다!
0
이런 방식으로 작성하였더니 체크 여부에 따라서 버튼 활성화 여부가 달라지는 게 구현됩니다! 그런데 하나의 체크에 모든 버튼이 활성화/비활성화해서 el_.id 값으로 getElementbyId하고 싶은데 혹시 el._id의 값은 어떻게 가져오나요? onClickChange의 코드를 document.getElementById(event.target.id).disabled = checking으로 바꾸면 Unhandled Runtime ErrorTypeError: Cannot set properties of null (setting 'disabled')
오류가 뜹니다.
import {useQuery, gql, useMutation} from '@apollo/client'
import styled from '@emotion/styled'
import { useState } from 'react'
const FETCH_PRODUCTS = gql`
query fetchProducts{
fetchProducts{
_id
seller
name
price
}
}
`
const DELETE_PRODUCT = gql`
mutation deleteProduct($productId:ID){
deleteProduct(productId: $productId){
message
}
}
`
const Row = styled.div`
display: flex;
`
const Column = styled.div`
width: 100px;
border: 1px solid;
`
export default function FetchDeleteProduct(){
const [deleteBoard] = useMutation(DELETE_PRODUCT)
const {data} = useQuery(FETCH_PRODUCTS)
console.log(data?.fetchProducts)
const [checking, setChecking] = useState(true)
const onClickDelete = async (event) => {
setChecking(!checking)
await deleteBoard({
variables: { productId: event.target.id },
refetchQueries: [{query:FETCH_PRODUCTS}]
})
}
const onClickChange = () => {
setChecking(!checking)
document.getElementsByTagName('button').disabled = checking
}
return (
<>
{data?.fetchProducts.map((el) =>
<Row key={el._id}>
<Column>
<input type="checkbox" onClick={onClickChange} />
</Column>
<Column>{el._id}</Column>
<Column>{el.seller}</Column>
<Column>{el.name}</Column>
<Column>{el.price}</Column>
<Column>
<button id={el._id} onClick={onClickDelete} disabled={checking}>삭제</button>
</Column>
</Row>
)}
</>
)
}
0
안녕하세요 현정님!
저희는 수업관련 이슈만 핸들링해드리고 있습니다ㅠ
해당 이슈는 저희 수업관련 내용이 아닌 추가적인 내용이므로 따로 핸들링 해드리지 않습니다.
감사합니다.
fetchBoardsOfMine, fetchBoardsCountOfMine 에러 문의드립니다
0
41
1
댓글 기능 구현 중 질문드립니다.
0
67
1
쿠폰코드 발급
0
147
2
example 서버 플레이그라운드, API 접속 모두 안됩니다.
0
89
2
문의드립니다!! ㅠㅠ
0
107
2
graphql 백엔드 서버가 포폴용 빼곤 접속이 안됩니다.
0
80
2
_app.js 작성 이후로 에러가 발생하네요
0
96
2
학습자료
0
72
2
학습자료가 안열립니다.
0
51
2
플레이 그라운드 퀴즈 문제 질문이 있습니다.
0
61
0
기존강의 구매자, 업데이트 끝인가요?
0
111
3
업데이트 버전 수강
0
89
2
완벽한 프론트엔드
0
136
2
나만의 쇼핑몰 샘플 페이지 접속 확인부탁드립니다.
0
84
1
graphql 접속이 안됩니다.
0
101
2
const, let 사용 질문 드립니다.
0
72
2
싸이월드 만들기 1탄 피드백 부탁드립니다.
0
123
2
회원가입 과제 피드백 부탁드립니다.
0
81
2
styled.span / styled.input "CSS 자동완성"
0
47
1
쿠폰 발급 관련
0
167
2
서버 502 error
0
247
2
쿠폰 다시 부탁드려도 될가여?
0
140
2
a태그 패딩했을때 왜 크기가 줄어들지 않고 늘어나나요
0
185
2
2분 44초 질문
0
132
3





