0
点赞
收藏
分享

微信扫一扫

Next.js+React+Node系统实战搞定SSR服务器渲染

Next.js+React+Node系统实战搞定SSR服务器渲染

​​download​​

四个真秀React用法,你值得拥有

我们希望用户在点击查询按钮的时候, 表格可以将当前页码调整为第一页,同时加载表格的数据,比如像下面代码所示

import React, { useState, useEffect } from "react";


const Test = () => {

 const [page, setPage] = useState(1);

 const [filterParams, setFilterParams] = useState({});

 const [data, setData] = useState([]);

 const form = useRef();


 useEffect(() => {

   // 当page 或 搜索条件发生变化的时候,重新请求表格数据

   fetch("/loadData", {

     method: "get",

     params: {

       page: page,

       ...filterParams,

     },

   }).then((data) => {

     setData(data);

   });

 }, [page, filterParams]);


 function handleSearch() {

   // 通过 validateFields 异步获取表单的值

   form.current.validateFields().then((formData) => {

     // 设置搜索条件

     setFilterParams(formData);

     // 将页码置为1

     setPage(1);

   });

 }


 return (

   <>

     <Form ref={form}>

       <span>表单元素</span>

       <Button onClick={handleSearch}>搜索</Button>

     </Form>

     <Table data={data} pagination={{ page: page }}></Table>

   </>

 );

};


复制代码

上面的代码,当用户点击搜索按钮的时候,我们做了下面三件事


调用表单的validateFields方法异步获取表单的数据

设置搜索条件

将页码重置为首页


然而,问题出现了,我们发现加载表格数据的请求被发出去了两条,而且第一条请求的页码并不是我们设置的1,这是怎么回事呢?

2. 问题分析

我们知道,在React的事件循环内部,多次setState会被合并成一次来触发更新,所以我们通常写React批量更新状态的时候并不会出现问题,但是这里有一个特例,就是React不会将异步代码里面的多次状态更新进行合并。

比如常见的setTimeout,Promise等等这些异步操作,在这些异步操作中更新多个状态的话,React就不会进行状态合并了,那么有没有什么办法解决这个问题了

3. unstable_batchedUpdates,该你上场了

为了解决异步批量更新状态引起的问题,react提供了一个临时的api unstable_batchedUpdates 进行批量更新,那么这个api应该怎么使用呢?

 function handleSearch() {

   // 通过 validateFields 异步获取表单的值

   form.current.validateFields().then((formData) => {

     unstable_batchedUpdates(() => {

       // 设置搜索条件

       setFilterParams(formData);

       // 将页码置为1

       setPage(1);

     })

   });

 }


复制代码

如上代码所示,只需要将批量更新状态的代码使用 unstable_batchedUpdates 包裹起来就可以了。

4. 所有异步状态都需要用unstable_batchedUpdates来包裹吗

我认为是不需要的,只有在批量更新状态的时候引起请求重复发送,页面渲染卡顿等影响用户体验的时候,再用这个api也不迟

发布订阅者模式,帮你写一个高性能Hook

资源XZ:

http://www.51xuebc.com/thread-427-1-1.html
举报

相关推荐

0 条评论