โ๏ธ Re-rendering
โ๏ธ Button Click Event
if(event.target.value && myPassword && myTitle && myContents){
setIsActive(true)
} else {
setIsActive(false)
}
โ๏ธ Button / Cursor
background-color: ${(props) => props.isActive === true ? "yellow" : "none"};
:hover {
cursor: ${(props) => props.isActive === true ? "pointer" : "default"};
} // ๋ง์ฝ false์ผ๋ ํ๋ ค๋ฉด !props.isActive ? pointer ---
`;
โ๏ธ Router Error
โ๏ธ Simple-Codes
/boards : View board lists (๊ฒ์๋ฌผ ๋ชฉ๋ก๋ณด๊ธฐ)
/boards/new : Post the board (๊ฒ์๋ฌผ ๋ฑ๋ก)
/boards/:boardId : Detail pages (์์ธ๋ณด๊ธฐ)
/boards/edit --> This doesn't work. There should be the board's own number, which is ID.
So it should go as: boards/:boardId/edit
/products : View product lists
/products/new : New product posted
๐ญ Map is more efficient than for loop.
const classmates = ["Debbie","Dereck","Dmitri"]
classmates.map ((el) => ("Student" + el))
Same for objects
classmates.map((el)=>({name: ${name: `Student ${el.name}`}))
--> Making a new object and re-putting the object inside. (Triangle Form)
const FRUITS = [
{ number: 1, title: "๋ ๋ํฅ" },
{ number: 2, title: "์ค์ธ๋จธ์ค์ผ" },
{ number: 3, title: "์ฐ์ฒญ๋ธ๊ธฐ" },
{ number: 4, title: "ํ๋ผ๋ด" },
{ number: 5, title: "์ฌ๊ณผ" },
{ number: 6, title: "์ ํ๋ง๊ณ " },
{ number: 7, title: "๋ธ๊ธฐ" },
{ number: 8, title: "์ฒํํฅ" },
{ number: 9, title: "๊ณผ์ผ์ ๋ฌผ์ธํธ" },
{ number: 10, title: "๊ทค" },
];
export default function MapFruitsPage(){
const ccc = FRUITS.map((el)=>(<div>{el.number} {el.title}</div>))
return(
<div>{ccc}</div>
)
}
classmates.map((el)=> "Student"+el)
classmates.map((el)=>(name: `student + $(el.name)`))
//--> wrong
const add 5 = ()=> {
return {name: `student ${el.name}`}
//--> Correct
import {gql, useQuery, useMutation} from '@apollo/client'
import styled from '@emotion/styled'
const FETCH_BOARDS = gql`
query fetchBoards{
fetchBoards{
number
writer
title
createdAt
}
}
`
const DELETE_BOARD = gql`
mutation deleteBoard($number: Int){
deleteBoard(number: $number){
message
}
}
`
const Row = styled.div`
display: flex;
`
const Column = styled.div`
width: 20%;
`
export default function MapCheckboxDeletePage (){
const [deleteBoard] = useMutation(DELETE_BOARD)
const {data} = useQuery(FETCH_BOARDS)
const onClickDelete = (event) => {
deleteBoard({
variables: {number: Number(event.target.id)},
refetchQueries:[{query: FETCH_BOARDS}]
})
}
return(
<div>
{data?.fetchBoards?.map((el)=>(
<Row key={el.number}>
<Column><input type="checkbox"/></Column>
<Column>{el.number}</Column>
<Column>{el.title}</Column>
<Column>{el.writer}</Column>
<Column>{el.createdAt}</Column>
<Column><button id={el.number} onClick={onClickDelete}>์ญ์ </button></Column>
{/* event handler */}
</Row>
))}
</div>
)
}
๐ event.target.id
: Gets the written ID and request for deleting that row.
๐ Before using evemt.target.id,
๐ When the user checked the checkbox and deleted that row but the checkbox isn't getting deleted, use key.
arr = [1,2,3,4];
arr.slice(1,3)
โ>2๋ถํฐ ์๋ฅด๊ฒ ๋ค
arr = [2,3,4,5];
arr.reduce((cu, el) => {
//cu: current - piled data (๋์ ๊ฐ)
console.log(cu, el);
return cu+el
},0)
--> starts to pile up from this number = 0
sum;