React 18中新钩子 useDeferredValue 使用

这篇具有很好参考价值的文章主要介绍了React 18中新钩子 useDeferredValue 使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

React是一个流行的用于构建用户界面的JavaScript库,它不断发展以为开发人员提供优化性能的工具。

React 18中引入的此类工具之一是useDeferredValue钩子,它旨在通过优先渲染更新来提高应用程序的性能。

useDeferredValue钩子是什么?

useDeferredValue钩子是React性能优化工具集中相对较新的补充。

它在处理异步数据获取(如网络请求或从API加载数据)时特别有用。

useDeferredValue的主要目的是,在立即呈现最重要的部分的同时,推迟对您的应用程序中不太关键的部分的更新。

这可以通过避免用户界面组件呈现延迟而大大提高应用程序的感知性能。

useDeferredValue的基本用法

useDeferredValue钩子的基本用法涉及包装状态值并创建其延迟版本。下面是一个简单的示例:

import { useState, useDeferredValue } from 'react';  

function MyComponent() {
  const [data, setData] = useState([]);
  const deferredData = useDeferredValue(data);   

  // ...
}

在这个例子中,我们有一个状态变量data,它可能会用异步操作填充数据。

通过使用useDeferredValue,我们创建了deferredData,这是data的一个版本,React 会单独优先渲染。

这种分离可确保您的 UI 中的关键部分及时更新,而非关键更新(如渲染列表)可以推迟以降低性能影响。

使用

首次渲染组件时,延迟值将与您传递的值相同。

更新组件时,延迟值将落后于最新值。这意味着 React 会首先使用旧的延迟值重新渲染组件,然后尝试在后台用新延迟值重新渲染它。

下面是一个例子,说明这在什么情况下有用:

想象一下,您有一个搜索栏,当您输入时会获取搜索结果。您开始输入“a”,React 使用加载后备项渲染搜索栏。“a”的搜索结果最终返回,React 使用结果重新渲染搜索栏。

// app.js
import { Suspense, useState } from 'react';
import SearchResults from './SearchResults.js';  

export default function App() {
  const [query, setQuery] = useState('');
  return (
    <>
      <label>  
        Search songs:
        <input value={query} onChange={e => setQuery(e.target.value)} />  
      </label>
      <Suspense fallback={<h2>Loading...</h2>}>
        <SearchResults query={query} />
      </Suspense>
    </>
  );
}
// searchResult.js
import { fetchData } from './data.js';
export default function SearchResults({ query }) {

    if (query === '') {
        return null;
    }
    const songs = use(fetchData(`/search?q=${query}`));

    if (songs.length === 0) {
        return <p>No matches for <i>"{query}"</i></p>;
    }
    return (
        <ul>
            {songs.map(song => (
                <li key={song.id}>  
                    {song.title} ({song.year})
                </li>
            ))}
        </ul>
    );
}  

function use(promise) {
    if (promise.status === 'fulfilled') {
        return promise.value;
    } else if (promise.status === 'rejected') {
        throw promise.reason;
    } else if (promise.status === 'pending') {
        throw promise;
    } else {
        promise.status = 'pending';
        promise.then(
            result => {
                promise.status = 'fulfilled';
                promise.value = result;
            },
            reason => {
                promise.status = 'rejected';
                promise.reason = reason;
            },
        );
        throw promise;
    }
}
// data.js

let cache = new Map();   

export function fetchData(url) {
    if (!cache.has(url)) {
        cache.set(url, getData(url));
    }
    return cache.get(url);
}  

async function getData(url) {
    if (url.startsWith('/search?q=')) {
        return await getSearchResults(url.slice('/search?q='.length));
    } else {
        throw Error('Not implemented');
    }
}

async function getSearchResults(query) {
    // Add a fake delay to make waiting noticeable.
    await new Promise(resolve => {
        setTimeout(resolve, 500);
    });

    const allSongs = [{
        id: 1,
        title: "Bohemian Rhapsody",
        year: 1975
    },
    {
        id: 2,  
        title: "Imagine",
        year: 1971
    },
    {
        id: 3,
        title: "Hotel California",
        year: 1976
    },
    {
        id: 4,
        title: "Stairway to Heaven",  
        year: 1971
    },
    {
        id: 5,
        title: "Let It Be",
        year: 1970
    },
    {
        id: 6,
        title: "Abbey",
        year: 1976
    },
    {
        id: 7,
        title: "A Hard Day's Night",
        year: 2012  
    }];

    const lowerQuery = query.trim().toLowerCase();
    return allSongs.filter(album => {
        const lowerTitle = album.title.toLowerCase();
        return (
            lowerTitle.startsWith(lowerQuery) || 
            lowerTitle.indexOf(' ' + lowerQuery) !== -1  
        )
    });
}

一种常用的替代UI模式涉及推迟更新结果列表并在新结果可用之前持久显示先前结果。

要实现这种方法,可以利用 useDeferredValue 钩子提供查询的延迟版本,因为它在组件层次结构中传播。

// app.js
import { Suspense, useState, useDeferredValue } from 'react';
import SearchResults from './searchResult.js';   

export default function App() {
  const [query, setQuery] = useState('');
  const deferredQuery = useDeferredValue(query);
  return ( 
    <>
      <label>
        Search Songs: 
        <input value={query} onChange={e => setQuery(e.target.value)} />
      </label>
      <Suspense fallback={<h2>Loading...</h2>}>
        <SearchResults query={deferredQuery} />   
      </Suspense>
    </>
  );  
}

React 18中新钩子 useDeferredValue 使用,react.js,javascript,前端

现在,您将搜索查询编辑为“ab”。React 会首先使用旧的延迟值重新渲染搜索栏,即“a”的搜索结果。 然后,它会尝试使用新的延迟值重新渲染搜索栏,即“ab”的搜索结果。

这意味着用户不会再看到加载后备,即使“ab”的搜索结果需要很长时间才能返回。

换句话说,延迟值允许您立即渲染UI,即使您正在等待异步数据。 这可以通过避免不必要的加载后备来帮助提高用户体验。

useDeferredValue的好处

  1. 性能提升: 组件或数据的延迟加载和渲染可以导致更快的初始页面加载、降低资源使用和优化性能,从而带来更好的用户体验。

  2. 高效的资源利用: 通过按需加载所需内容,您可以减少不必要的 API 调用、最大限度地减少内存和 CPU 使用,并优化应用程序的资源利用。

  3. 渐进式加载和错误隔离: 延迟值策略支持渐进式加载以实现更高的响应性 UI,并提供更好的错误隔离,确保应用程序的一部分错误不会破坏整个用户体验。
    React 18中新钩子 useDeferredValue 使用,react.js,javascript,前端文章来源地址https://www.toymoban.com/news/detail-803530.html

到了这里,关于React 18中新钩子 useDeferredValue 使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • react钩子函数

    React组件的生命周期包括多个阶段和方法,用于在组件不同的生命周期时执行特定的操作。以下是React类组件中常见的生命周期方法: 挂载阶段(Mounting Phase): constructor:组件实例化时调用,用于初始化state和绑定事件处理函数。 static getDerivedStateFromProps:根据传入的props更新

    2024年02月15日
    浏览(36)
  • React Hooks 钩子特性

    人在身处逆境时,适应环境的能力实在惊人。人可以忍受不幸,也可以战胜不幸,因为人有着惊人的潜力,只要立志发挥它,就一定能渡过难关。 Hooks 是 React 16.8 的新增特性。它可以让你在不编写 class 组件的情况下使用 state 以及其他的 React 特性。 React Hooks 表现形式是以

    2024年02月05日
    浏览(40)
  • React useImperativeHandle 钩子

    在React中, useImperativeHandle 是一个Hook,用于向父组件暴露子组件的引用和方法。 通过使用 useImperativeHandle ,你可以选择性地暴露子组件的一些方法或属性给父组件。这对于需要从父组件中直接调用子组件的方法或访问子组件的属性时非常有用。 PS: 在使用  useImperativeHandle  钩

    2024年02月12日
    浏览(31)
  • React 钩子汇总

    1. useState 用于在函数式组件中添加状态管理。它返回一个状态值和一个更新状态的函数,让你可以在组件中追踪和更新状态。 2. useEffect 用于在组件渲染完成后执行副作用操作,比如数据获取、订阅等。它接收一个回调函数和一个依赖数组,可以用来管理副作用的触发时机。

    2024年02月10日
    浏览(31)
  • react钩子函数理解

    React钩子(Hooks)是React 16.8版本引入的一种特性,用于在无需编写类组件的情况下,在函数组件中添加状态管理和其他React特性。React钩子解决了函数组件在处理状态、副作用和代码复用方面的一些问题,使得代码更加清晰、可读和可维护。 React钩子提供了一些特定的函数,可

    2024年02月13日
    浏览(32)
  • React钩子函数之forwardRef

    React是一个非常流行的JavaScript库,用于构建用户界面。它提供了一种简单而强大的方式来管理组件的状态和行为。其中一个非常有用的功能是钩子函数,它们允许我们在组件的生命周期中执行代码。 在本文中,我们将探讨React的一个重要钩子函数——forwardRef。它可以帮助我们

    2024年02月11日
    浏览(35)
  • react钩子副作用理解

    useEffect(() = { fetch(‘https://api.example.com/data’) .then(response = response.json()) .then(data = setData(data)); }, []); 怎么理解这个[] 在 React 中,useEffect 钩子用于处理副作用,比如数据获取、订阅、手动 DOM 操作等。useEffect 接受两个参数:一个是副作用函数,另一个是依赖数组。 在你提供的代

    2024年02月13日
    浏览(32)
  • React 中的 useCallback 钩子函数

    useCallback 钩子函数有点像 useMemo 一样可以备份信息,而 useCallback 只是备份函数,除非某些参数发生变化,否则他不会重新运行其中的代码, 出现的问题:运行上述代码后,当我们在输入框中输入数字后,再去查看控制台的日志我们可以看到打印出了 params change 的信息,这就

    2024年02月09日
    浏览(40)
  • JavaScript框架 Angular、React、Vue.js 的全栈解决方案比较

    在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)进行简化比较。 MERN 技术栈包含四大具体组件: MongoDB:一款强大的 NoSQL 数据库,以灵活的 JSON 格式存储数据。 Express.js:一套极简但强大的

    2024年02月03日
    浏览(54)
  • 使用React18+Ts创建项目

    首先,使用create-react-app工具创建一个新的React项目: 使用脚手架创建项目后,自带react-dom等依赖项,但react中的所用的路由方法是react-router-dom中。 默认情况下,create-react-app模板会自动生成一些文件和文件夹,这些文件和文件夹包括: node_modules:存储所有的项目依赖项。 p

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包