7

是否可以只对一个变量使用 useState,用来触发重新渲染即可,其他变量实时计算?

 8 months ago
source link: https://www.v2ex.com/t/1003740
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  React

是否可以只对一个变量使用 useState,用来触发重新渲染即可,其他变量实时计算?

  xubingok · 7 小时 54 分钟前 · 808 次点击

新手学习 React,最近刚发现如果有变量发生改变,不使用 useState 提供的 setXXX 也是可以的.

用 React 官方教程中的代码举例:

import { useState } from 'react';

export default function Counter() {
  const [number, setNumber] = useState(0);
  const [otherNumber, setOtherNumber] = useState(0);
  console.log("重新渲染")
  return (
    <>
      <h1>{number}</h1>
      <h1>{otherNumber}</h1>
      <button onClick={() => {
        setNumber(1);
        setOtherNumber(2);
      }}>+</button>
    </>
  )
}

效果是点击按钮,修改 number 和 otherNumber 的值,模拟实际使用中请求接口后需要修改多处变量显示的场景.

据我浅薄的理解,useState 此处应该是修改变量,并通知页面使用修改后的值重新渲染吧?打印的 log 确实也走了两遍.

所以可不可以这样:只对其中一个变量使用 useState(反正会重走 return 方法),剩下的变量就在 return 前面计算就行了:

import { useState } from 'react';

export default function Counter() {
  const [number, setNumber] = useState(0);
  let otherNumber  = number == 1 ? 2:1;
  return (
    <>
      <h1>{number}</h1>
      <h2>{otherNumber}</h2>
      <button onClick={() => {
        setNumber(1);
      }}>+</button>
    </>
  )
}

这里的 let otherNumber = number == 1 ? 2:1;只是很简单的逻辑,实际使用中可能包含复杂的数据处理工作.

从运行效果来看,似乎也没啥问题......

这样岂不是可以把最外层的数据 rootData 做个 useState 就行了,里面各个组件从这个 rootData 里面拿.就是不知道对性能有没有影响了.

目前看的教程是 https://zh-hans.react.dev/learn,对 React 理解还不深,求大佬解惑,谢谢~

第 1 条附言  ·  6 小时 54 分钟前

具体说明一下实际场景吧:

实际使用中一个页面可能有很多 echarts 图表,这些图表数据来自于同一个接口.

所以我在想,是把接口返回的 data 做一个 useState,然后各个图表直接从里面取呢,还是每个图表都搞一个 useState,接口回来后挨个 setXXX 呢???

性能方面,大佬们能细说下吗...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK