You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监听React组件状态变更且避免触发重渲染?

React性能优化:不触发组件重渲染监听State变化并计算总计

我有一个复杂的组件结构,现将核心需求简化如下:

父组件SalesOrderLineItems代码如下:

const SalesOrderLineItems = ({
  ...requiredProps,
}) => {
  const [productLines, setProductLines] = useState([])
  const [shippingLines, setShippingLines] = useState([])
  const [totals, setTotals] = useState({})
  const [discounts, setDiscounts] = useState([])

  useEffect(() => {
    // 期望子组件调用setState时触发此逻辑
    console.log('😁 ~ productLines:', productLines)
  }, [productLines])

  const updateProductLines = useCallback((lines) => setProductLines(lines), [])
  const updateShippingLines = useCallback((lines) => setShippingLines(lines), [])
  return (
    <div className="SalesOrderLineItems">
      <SalesOrderProductLines
        updateProductLines={updateProductLines} 
        {...otherProps} />
      <SalesOrderShippingLines
        updateShippingLines={updateShippingLines}
        productLines={productLines} // 仅用于计算,不参与渲染
        {...otherProps}
      />
      <SalesOrderDiscounts
        discounts={discounts}
        {...otherProps}
      />
      <SalesOrderTotals
        totals={totals}
        {...otherProps}
      />
    </div>
  )
}
export default SalesOrderLineItems

在子组件SalesOrderProductLines中,我使用React Hook Form的watch方法,通过传入的props更新productLines:

useEffect(() => {
    const subscription = watch((value, { name, type }) => {
      // 业务逻辑处理
      updateProductLines(value.lines)
      console.log('😁 ~ lines updated:', value.lines) // 此处可打印最新值,确认状态更新生效
    })
    return () => subscription.unsubscribe()
  }, [watch])

目前的问题是:子组件中能确认productLines已更新,但父组件中监听productLines的useEffect并未执行。我推测是因为使用了非受控输入,没有触发组件重渲染导致的。

我需要实现的是:不触发组件重渲染的前提下,监听productLines的变化,仅基于最新的productLines、shippingLines和discounts计算并更新totals,以此保证性能。

内容的提问来源于stack exchange,提问作者Mr.Online

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:17:49