[react优化] 避免组件或数据多次渲染/计算

代码如下 点击视图x➕1,导致视图更新, 视图更细导致a也重新大量计算!!这很浪费时间

function App() {
  const [x, setX] = useState(3)
  const y = x + 2
  console.log('重新渲染', x, y);
  console.time('timer')

  let a = 0
  for (let index = 0; index < 1000000000; index++) {
    a++
  }
  console.timeEnd('timer')
  return (
    <div className="App">
      <ul onClick={() => setX(x + 1)}>
        <li>{x}</li>
        <li>{y}</li>
        <li>{a}</li>
      </ul>
    </div>
  )
}

每次更新都浪费时间去计算

有没有办法优化掉这个大量计算呢?


用useMemo()来优化

useMemo – React 中文文档

代码优化如下

function App() {
  const [x, setX] = useState(3)
  const y = x + 2
  console.log('重新渲染', x, y);
  console.time('timer')
  let a: number = useMemo(() => {
    let a = 0
    for (let index = 0; index < 1000000000; index++) {
      a++
    }
    return a
  }, [])
  console.timeEnd('timer')
  return (
    <div className="App">
      <ul onClick={() => setX(x + 1)}>
        <li>{x}</li>
        <li>{y}</li>
        <li>{a}</li>
      </ul>
    </div>
  )
}

 


 如果a依赖x呢?其实是会变的,x变a就重新变化

  const [x, setX] = useState(3)
  const y = x + 2
  console.log('重新渲染', x, y);
  console.time('timer')
  let a: number = useMemo(() => {
    let a = 0
    for (let index = 0; index < 1000000000; index++) {
      a += x
    }
    return a
  }, [x])



 还有什么应用场景? 避免子组件重复渲染

有代码如下,每次状态改变,,父组件和子组件都要重新渲染

const Son = () => {
  console.log('子组件渲染');
  return <h1>子组件</h1>
}
function App() {
  const [x, setX] = useState(3)
  console.log('我是父组件');

  return (
    <div className="App">
      <h1 onClick={() => { setX(x + 1) }}>父组件</h1>
      <Son />
    </div>
  )
}

怎么解决避免子组件重新渲染?用memo,memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。

 memo – React 中文文档

这样子组件就不会变化了

但是如果传值呢?代码如下,传了一个数组

const Son = memo(function (props: { arr: number[] }) {
  console.log('子组件渲染');
  return <h1>子组件</h1>
})
function App() {
  const [x, setX] = useState(3)
  const arr = [1, 2, 3]
  console.log('我是父组件');

  return (
    <div className="App">
      <h1 onClick={() => { setX(x + 1) }}>父组件</h1>
      <Son arr={arr} />
    </div>
  )
}

每次都重新渲染,因为数组是引用类型,每次父组件重新渲染都会导致arr的内存地址不一样

那怎么办?用useMemo,让他换缓存

 当然useState也可以

const [arr, setArr] = useState([1, 2, 3])

useRef也可以

 好了祝你生活愉快

用useMemo跳过昂贵的计算_哔哩哔哩_bilibili


如果传进去的是个函数呢?

用useCallack

### React Native 组件优化策略 #### 一、理解渲染机制的重要性 为了有效避免不必要的重复渲染,深入理解React渲染机制至关重要。当状态属性发生变化时,React会重新渲染受影响的组件及其子组件。如果这些变化频繁发生而未加控制,则可能导致性能瓶颈[^1]。 #### 二、采用函数式组件与Hooks替代类组件 现代版本的React推荐使用函数式组件配合Hooks来代替传统的类组件形式。这种方式不仅简化了代码结构,而且通过`useMemo()` 和 `useCallback()` Hooks可以更精细地管理依赖关系,从而减少因父级传递下来的props改变所引起的子组件无意义更新。 ```javascript import React, { useMemo } from 'react'; function MyComponent({ data }) { const processedData = useMemo(() => processData(data), [data]); return ( // JSX here... ); } ``` #### 三、合理运用PureComponent/React.memo高阶组件 对于那些仅基于prop的变化决定是否应该再次渲染的情况,可以选择继承自`React.PureComponent`者包裹一层`React.memo`。这两种方式都会自动执行浅比较操作,在前后两次接收相同参数时不触发新的渲染流程。 ```javascript // 使用 PureComponent 来防止不必要的渲染 class Child extends React.PureComponent { render() { console.log('Child rendered'); return <div>{this.props.value}</div>; } } // 者使用 memo 函数组件 const MemoizedChild = React.memo(function Child(props) { console.log('Child rendered'); return <div>{props.value}</div>; }); ``` #### 四、利用shouldComponentUpdate生命周期方法(针对Class Component) 在某些情况下可能需要更加复杂的逻辑判断当前实例是否有必要进行重绘工作。此时可以在Class Component内部覆写`shouldComponentUpdate(nextProps,nextState)` 方法来自定义条件。 ```javascript shouldComponentUpdate(nextProps, nextState){ if (nextProps.someProp !== this.props.someProp || nextState.someState !== this.state.someState ) { return true; } return false; } ``` #### 五、考虑虚拟化列表和其他UI模式 当处理大量数据项展示时,比如长列表滚动场景下,应优先选用支持按需加载更多项目的第三方库如`react-window`内置FlatList组件中的windowSize prop设置以实现部分可见区域内的高效渲染效果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值