美文网首页React学习笔记
useTransition 钩子函数

useTransition 钩子函数

作者: 林中白虎 | 来源:发表于2024-03-29 11:07 被阅读0次

useTransition 钩子函数

useTransition 钩子函数使用的场景

当我们的程序中存在大量数据列表或者有一段时间密集型计算的时候,然后页面又需要监听状态改变的情况时,我们就可以使用useTransition钩子函数来解决这个问题。例如如下的程序:

const [input, setInput] = useState<string>("");
const [list, setList] = useState<string[]>([]);
const LIST_SIZE = 20000;

function handleChange(e: React.ChangeEvent<HTMLInputElement>) {
  setInput(e.target.value);

  const l = [];

  for (let i = 0; i < LIST_SIZE; i++) {
    l.push(e.target.value);
  }

  setList(l);
}

return (
  <div>
    <input type="text" value={input} onChange={handleChange} />
    {list.map((item, index) => {
      return <div key={index}>{item}</div>;
    })}
  </div>
);

运行上述代码后,我们会发现在输入框中输入字符后需要等待很长时间后,页面才会记性列表的渲染。当我们连续输入多个字符的时候,我们页面会出现卡顿的情况。

产生上述卡顿的原因

上述例子我们调用了setInput或者调用了setList后,React 会将状态更改的动作组合到一个调用中,即把setInputsetList合并成一个调用函数,然后等 for 循环完成后再重新一次性重新渲染我们的页面。

使用 useTransition 钩子函数解决卡顿问题

useTransition 钩子函数的作用就相当于对所有钩子函数排个优先级,然后程序运行时,首先把函数运行令牌给优先级高的钩子函数进行执行,等优先级高的钩子函数完成所有业务后,会把运行令牌传递给下一个优先级高的钩子函数执行依次类推,等所有钩子函数执行完成后,React 就会重新帮我们渲染页面元素。

我们就以上述案例为例进行修改。在上述的例子中,我们有setInputsetList两个钩子函数,从业务功能分析来看我们的setInput是优先级比较高的,所以我们可以把它设置为优先级高的钩子函数,即用户一直在输入的时候,后台的程序一直在监听输入框的值改变,只有当用户不输入之后,系统才会调用setList钩子函数。

具体的实例代码如下:

const [isPending, startTransition] = useTransition();
const [input, setInput] = useState<string>("");
const [list, setList] = useState<string[]>([]);
const LIST_SIZE = 20000;

function handleChange(e: React.ChangeEvent<HTMLInputElement>) {
  setInput(e.target.value);

  startTransition(() => {
    const l = [];

    for (let i = 0; i < LIST_SIZE; i++) {
      l.push(e.target.value);
    }

    setList(l);
  });
}

return (
  <div>
    <input type="text" value={input} onChange={handleChange} />
    {isPending ? (
      <p>数据加载中……</p>
    ) : (
      list.map((item, index) => {
        return <div key={index}>{item}</div>;
      })
    )}
  </div>
);

相关文章

  • Vue视频教程系列第三十五节—路由器里的钩子函数

    路由钩子函数介绍: 我之前有介绍过vue里的钩子函数,有四对,也就是八个钩子函数。在路由里呢,其实也有钩子函数,个...

  • vue自定义全局指令

    Vue.directive('指令名',{ 钩子函数1(){}, 钩子函数2(){} }) -----------...

  • vue笔记-12(动画钩子函数)

    动画-钩子函数实现半场动画的介绍 入场函数和出场函数 钩子函数实现小球半场动画 methods: { ...

  • 2021-04-11

    vue-router 路由钩子函数(导航守卫) 路由钩子函数有三种: 全局钩子: beforeEach(全局前置守...

  • Android对so进行简单hook

    1、什么是Hook Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到...

  • Vue.js钩子函数

    钩子函数

  • vue 获取节点 获取事件

    vue 生命周期 什么是钩子函数 一开始就执行的 就是钩子函数 vue 钩子函数 也称作为生命周期 befor...

  • vue中的钩子函数(二)

    Vue钩子函数 在开发Vue组件时,钩子函数我们会经常用到,但是具体在什么时机,使用哪个钩子函数,会产生什么样的结...

  • day60-钩子函数及邮件发送

    1钩子函数 flask中钩子函数相当于django中在请求前及请求后做什么的中间件。钩子函数有before:请求之...

  • mocha一些记录

    在beforeEach钩子函数中, 调用this.skip()命令可以跳过当前的it函数 在afterEach钩子...

网友评论

    本文标题:useTransition 钩子函数

    本文链接:https://www.haomeiwen.com/subject/cgxetjtx.html