學習react優化性能的時候,在render之前,生命周期shouldComponentUpdate里判斷前后兩次數據是否一致,使用了forEach嵌套if語句,如果滿足條件想直接break跳出forEach循環,但事實並沒有想的那么簡單,代碼直接拋出異常。查閱資料原來:
接着想了個一個可以實現的辦法,具體代碼如下:
1 // 生命周期 只有當前后數據不一致時才渲染 2 shouldComponentUpdate(nextProps,nextState){ 3 var newProducts = nextProps.products; 4 var beforeProducts = this.props.products 5 var isRender = false; 6 7 if(newProducts.length===beforeProducts.length){ 8 try{ 9 newProducts.forEach((data,index)=>{ 10 if(data.name!==beforeProducts[index].name){ 11 isRender = true; 12 throw Error('need to render') 13 } 14 }) 15 }catch(err){ 16 17 } 18 }else{ 19 isRender = true 20 } 21 return isRender // true or false 22 }
配合使用try catch,滿足條件時throw一個錯誤來跳出循環。
但實際上這里使用for循環配合break足矣,如下:
1 // 生命周期 只有當前后數據不一致時才渲染 2 shouldComponentUpdate(nextProps,nextState){ 3 var newProducts = nextProps.products; 4 var beforeProducts = this.props.products 5 var isRender = false; 6 7 if(newProducts.length===beforeProducts.length){ 8 for(var i=0;i<newProducts.length;i++){ 9 if(newProducts[i].name!==beforeProducts[i].name){ 10 isRender = true 11 break; 12 } 13 } 14 }else{ 15 isRender = true 16 } 17 return isRender // true or false 18 }