구현 내용
제품 선택창을 클릭해서 이름과 가격을 선택하고 색상 선택창을 클릭해서 색상을 선택 할 수 있다.
productOptionDropdown = () => {
const { productOptionDropdown } = this.state;
this.setState({
productOptionDropdown: !productOptionDropdown === true,
});
};
productOptionSelect = option => {
const { productOptionDropdown, colorOptionDropdown } = this.state;
this.setState({
productOptionDropdown: !productOptionDropdown === true,
productPrice: option.price,
productName: option.name,
productId: option.id,
colorOptionDropdown: !colorOptionDropdown === true,
});
};
.
.
.
<p>옵션 선택</p>
<div
onClick={this.productOptionDropdown}
className={
productOptionDropdown === true
? 'optionDropdownOffRadius'
: 'optionDropdownOnRadius'
}
>
{productName}
</div>
<div
className={
productOptionDropdown === true
? 'optionDropdownOff'
: 'optionDropdownOn'
}
>
{productInfo.product &&
productInfo.product.map((option, index) => {
return (
<div
key={index}
className="selectBox"
onClick={() => this.productOptionSelect(option)}
>
<div className="textFlex">
<div>{index + 1}.</div>
<div>{option.name}</div>
</div>
<div className="optionPrice">
{priceComma(option.price)}원~
</div>
</div>
);
})}
</div>
제품 선택창을 클릭했을 때 className을 state값을 통해 바꿔서 아래쪽 radius가 변경되어 열리는 느낌을 준다. 또한 드롭다운이 되도록 display:none 속성의 옵션 선택창을 나타나게 한다.
map을 돌려서 나온 옵션 을 클릭할 때 onClick 함수의 인자로 map의 인자 option을 넘겨줌으로서 클릭한 요소에 대해서만 데이터에 접근할 수 있다.
접근 한 객체의 키값을 통해 접근해서 제품의 이름과 가격을 state값에 저장한다.
옵션을 선택했을때 className을 state값을 통해 바꿔서 제품 선택 드롭다운은 닫히고 색상옵션이 바로 연계돼서 열릴 수 있게 해준다
colorOptionSelect = colorOption => {
const { colorOptionDropdown, productPrice } = this.state;
this.setState({
colorOptionDropdown: !colorOptionDropdown === true,
productColor: colorOption.name,
productQuantity: 1,
quantityPrice: productPrice,
quantityBox: false,
colorId: colorOption.id,
});
};
.
.
.
<div
className={
colorOptionDropdown === true
? 'colorDropdownOffRadius'
: 'colorDropdownOnRadius'
}
>
{productColor}
</div>
<div
className={
colorOptionDropdown === true
? 'colorOptionDropdownOff'
: 'colorOptionDropdownOn'
}
>
{productInfo.color &&
productInfo.color.map((colorOption, index) => {
return (
<div
key={index}
className="colorSelectBox"
onClick={() => this.colorOptionSelect(colorOption)}
>
<div>{index + 1}.</div>
<div>{colorOption.name}</div>
</div>
);
})}
</div>
정말 많은 방법을 시도해보았다 event.target 을 통해서도 접근해보고 console.log(event)을 통해서 정말 접근할 수 있는 요소에는 거의 다 접근을 해본 것 같았다. 하지만 그것도 결국 한계가 있는 방법이라는 걸 깨달았고, 결국 찾아낸 방법은 onClick이벤트에 넘겨주는 인자로 map 메소드의 인자를 전달해서 클릭한 요소에 대해서만 접근을 할 수 있다는 것을 알게 되었다.
정말 이걸 해결하려고 금요일, 토요일, 일요일 3일에 걸쳐 해결해 나갔다..
그렇게 고생해서 문제를 해결했을때는 내가 코딩을 시작한 이후 가장 성취감이 컸던 순간이 아니였나 싶다.