해결된 질문
작성
·
276
0
퀴즈 내용엔 '체크박스를 체크하고 삭제 버튼을 클릭하면, 해당 줄을 삭제해 주세요.'라고 되어있는데 체크 여부에 따라서 버튼의 활성화 여부를 지정하려고 하는데 제대로 작동하지 않습니다. 어떻게 코드를 작성하면 될까요?
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}/>
체크 표시 기능에 문제는 없으나 삭제 버튼을 눌렀을 때 정상적으로 내용이 사라지지 않습니다. 코드 중 console.log(data?.fetchProducts) 에선 undefined가 출력됩니다. 그리고 현재 체크 표시 버튼을 누르면 원래 비활성화되었던 삭제 버튼을 누를 수 있개 활성화되게 코드를 구현시켜야 합니다.
체크표시에 문제가 없다면, onClickDelete함수를 바꿔 주셔야 합니다.
if 문을 삭제하고 mutation이 실행될 수 있도록 해주세요.
id를 삭제했으니 if문의 조건에서 false가 떠 아래 mutation이 작동하지 않는 것 입니다.
체크표에 굳이 state를 사용할 필요 없으며, id를 지웠으니 document 를 사용하지 않아도 됩니다.
그리고 variables를 보내주실때 넘겨주는 id값을 Number로 감싸서 넘겨주세요.
해당 과제가 어려우시다면 강의를 한번 더 보고 진행하시는걸 추천 드립니다!
이런 방식으로 작성하였더니 체크 여부에 따라서 버튼 활성화 여부가 달라지는 게 구현됩니다! 그런데 하나의 체크에 모든 버튼이 활성화/비활성화해서 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>
)}
</>
)
}
안녕하세요 현정님!
저희는 수업관련 이슈만 핸들링해드리고 있습니다ㅠ
해당 이슈는 저희 수업관련 내용이 아닌 추가적인 내용이므로 따로 핸들링 해드리지 않습니다.
감사합니다.
답글 확인을 못하신 거 같아서 다시 답변 답니다! ㅜㅠ
이미 왜 안되는지 고치려고 시도를 많이 했는데 안되고 있는 상황이라 설명을 코드로 해주시면 감사하겠습니다. 현재 말씀주신대로 해봤는데 해당 화면이 출력되고 전체 체크박스가 체크됩니다.