🔥یلدا با راکت با (( ۷۰ درصد )) تخفیف! یلدا طولانی است، اما این تخفیف نه.
مشاهده دورههاسلام خدمت اساتید عزیز
من با بخش componentDidUpdate مشکل دارم استیت قبلی رو بهم نمیده و استیت فعلی رو بهم میده. چیکار کنم مشکل کجاست؟
یک دکمه ساده جهت تست داخل رندر تعریف کردم که با اون عمل میکنه و استیت قبلی رو بهم میده.
اما با تابع add که نوشتم عمل نمیکنه... واقعا گیج شدم. لطفا راهنماییم کنید.
class App extends Component{
state={
products:[
{id: 1, imgUrl: 'https://picsum.photos/100' , title: 'book1' , price: 25 , count: 3},
{id: 2, imgUrl: 'https://picsum.photos/101' , title: 'book2' , price: 65 , count: 5},
{id: 3, imgUrl: 'https://picsum.photos/102' , title: 'book3' , price: 33 , count: 7},
{id: 4, imgUrl: 'https://picsum.photos/103' , title: 'book4' , price: 12 , count: 9}
],
count:0
}
componentDidUpdate(prevProps,prevState){
console.log(prevState)
}
render(){
return <>
<button onClick={()=>{this.setState({count: this.state.count + 1})}}>number: {this.state.count}</button>
<Products products={this.state.products} add={this.add} remove={this.remove} />
</>
}
add = (id)=>{
const products = this.state.products.map(p=>{
if (p.id === id) p.count++
return p
})
this.setState({products})
}
متاسفانه کسی جواب نداد اما خودم جوابشو میدم تا دیگر دوستان استفاده کنند.
زمانی که از خود آرایه با spread یک کپی میگیریم و مقدار کپی گرفته رو میوتیت میکنیم مقدار prevState همان مقدار فعلی state ما هستش.
برای اینکه این مشکل حل بشه کپی یا کلون گرفتن از خود آرایه کافی نیست و باید از آیتمهای آرایه هم با spread کلون گرفته بشه. در اون صورت مشکل حل میشه و prevState مقدار قبلی state رو به ما نمایش خواهد داد.
در زیر دو روش رو نشون میدم برای کلون کردن که روش مپ هم مطمئنتره و هم کوتاه ترو خواناتر
// the first method
const newProducts = this.state.products.map(p => ({...p}) )
const index = newProducts.findIndex((p) => p.id === id);
newProducts[index].count++
this.setState({products:newProducts})
//the second method
const newProducts = [...this.state.products];
const index = newProducts.findIndex((p) => p.id === id);
const product = { ...newProducts[index] }
product.count++;
newProducts[index] = product;
this.setState({products:newProducts})
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟