采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
试了试,handleRemove、handleAdd、handleCartBtn用useCallback不行。 useCallback不是也有记忆功能吗?
你好,需要这样做才行
const handleAdd = useCallback((id) => {
return () => {
let cloneList = _.cloneDeep(list)
let now = cloneList.find((v)=> v.id === id)
now.number++
setList(cloneList)
}
}, [list])
const handleRemove = useCallback((id) => {
if( now.number > 1 ){
now.number--
因为 一开始 list是空数组,如果用useCallback包起来,而第二个参数是空数组的话,那么list只能为空的时候执行一次,后续list更新后,也不会重新创建函数了,那么list在函数内就一直是空函数了。
问老师和楼主,为什么会想到用useCallback来包这个函数呢?纯粹为了性能优化吗?是不是高阶函数比较吃性能?另外会不会提倡多用useCallback来包住组件里面的函数呢? 另外有没有让只改变了属性的那个Item组件重新渲染,其他没有改变的不渲染?
你好,usecallback确实就是为了提升性能的,尤其是在有循环渲染的时候,可能会重新渲染没有改变的item组件,所以使用usecallback可以只针对改变的item组件进行重渲染。当然平时我们开发的时候并不用特意去使用usecallback,只有需要优化或者感觉页面有卡顿再考虑是否改造一下代码。
我在子組件添加了隨機數,然後就算只對一款商品進行操作,其他item組件依然會重新渲染。那些和加減按鈕,放入購物車按鈕都已經用了useCallback。是不是因為useCallback裡面的依賴項是list,所以一操作就整個list一起變化,所以綁定按鈕的函數一定會重新生成一個一樣的函數,所以傳入各個子組件的函數也是會變化。所以只要改變一個商品,所有商品的隨機數都會變?這個情況下是不是做不了性能優化?
登录后可查看更多问答,登录/注册
专为初级前端人员设计,系统性学习三大技术
237 10
464 9
638 7
430 7
7.3k 7