日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

React 19 即將推出的四個全新 Hooks,很實用!

來源: 責編: 時間:2024-01-26 17:06:47 307觀看
導讀近日,React 團隊成員在社交平臺表示,團隊正在開發 React v19 版本,并且沒有計劃發布 v18.3 版本。圖片React 19 預計將推出 4 個全新 Hooks,這些 Hooks 主要關注 React 中的兩個痛點:數據獲取和表單。 這些 Hooks 目前在 R

近日,React 團隊成員在社交平臺表示,團隊正在開發 React v19 版本,并且沒有計劃發布 v18.3 版本。n8d28資訊網——每日最新資訊28at.com

圖片圖片n8d28資訊網——每日最新資訊28at.com

React 19 預計將推出 4 個全新 Hooks,這些 Hooks 主要關注 React 中的兩個痛點:數據獲取和表單。 這些 Hooks 目前在 React 預覽版本中作為實驗性 API 提供,預計會成為 React 19 的一部分,但是最終發布之前,API 可能會有所變化。n8d28資訊網——每日最新資訊28at.com

新的 Hooks 包括:n8d28資訊網——每日最新資訊28at.com

  • use
  • useOptimistic
  • useFormState
  • useFormStatus

use

use 是一個實驗性 React Hook,它可以讓讀取類似于 Promise 或 context 的資源的值。n8d28資訊網——每日最新資訊28at.com

const value = use(resource);

官方文檔:https://zh-hans.react.dev/reference/react/usen8d28資訊網——每日最新資訊28at.com

use(Promise)

use 可以在客戶端進行“掛起”的 API??梢詫⒁粋€ promise 傳遞給它,React 將會在該 promise 解決之前進行掛起。它的基本語法如下:n8d28資訊網——每日最新資訊28at.com

import { use } from 'react';function MessageComponent({ messagePromise }) {    const message = use(messagePromise);    // ...}

下面來看一個簡單的例子:n8d28資訊網——每日最新資訊28at.com

import * as React from 'react';import { useState, use, Suspense } from 'react';import { faker } from '@faker-js/faker';export const App = () => {  const [newsPromise, setNewsPromise] = useState(() => fetchNews());  const handleUpdate = () => {    fetchNews().then((news) => {      setNewsPromise(Promise.resolve(news));    });  };  return (    <>      <h3>        新聞列表    		<button onClick={handleUpdate}>刷新</button>      </h3>      <NewsContainer newsPromise={newsPromise} />    </>  );};let news = [...new Array(4)].map(() => faker.lorem.sentence());const fetchNews = () =>  new Promise<string[]>((resolve) =>    // 使用 setTimeout 模擬數據獲取    setTimeout(() => {      // 每次刷新時添加一個標題      news.unshift(faker.lorem.sentence());      resolve(news);    }, 1000)  );const NewsContainer = ({ newsPromise }) => (  <Suspense fallback={<p>請求中...</p>}>    <News newsPromise={newsPromise} />  </Suspense>);const News = ({ newsPromise }) => {  const news = use<string[]>(newsPromise);  return (    <ul>      {news.map((title, index) => (        <li key={index}>{title}</li>      ))}    </ul>  );};

在上面的例子中,每次刷新時,都會先顯示“請求中...”,請求到數據后進行展示:n8d28資訊網——每日最新資訊28at.com

圖片圖片n8d28資訊網——每日最新資訊28at.com

官方文檔中,關于 <Suspense> 有一個警告:n8d28資訊網——每日最新資訊28at.com

目前尚不支持在不使用固定框架的情況下進行啟用 Suspense 的數據獲取。實現支持 Suspense 數據源的要求是不穩定的,也沒有文檔。React 將在未來的版本中發布官方 API,用于與 Suspense 集成數據源。n8d28資訊網——每日最新資訊28at.com

在新版本中,use 可能就是用于與 Suspense 集成數據源的官方 API。n8d28資訊網——每日最新資訊28at.com

這個全新的use hook 與其他 Hooks 不同,它可以在循環和條件語句中像 if 一樣被調用。這意味著我們可能不再需要依賴像 TanStack Query 這樣的第三方庫在客戶端進行數據獲取。然而,這仍需進一步觀察,因為 Tanstack Query 的功能遠不止解析 Promise 這么簡單。n8d28資訊網——每日最新資訊28at.com

use(Context)

這個 use hook 也可以用來讀取 React Context。它與 useContext 作用完全相同,只是可以在循環(如 for)和條件語句(如 if)中調用。n8d28資訊網——每日最新資訊28at.com

import { use } from 'react';function HorizontalRule({ show }) {    if (show) {        const theme = use(ThemeContext);        return <hr className={theme} />;    }    return false;}

這將簡化某些場景下的組件層級結構,因為在循環或條件語句中讀取 context,之前唯一的方法就是將組件一分為二。n8d28資訊網——每日最新資訊28at.com

在性能方面,這一改進也是巨大的進步,因為現在即使 context 發生變化,我們也可以有條件地跳過組件的重新渲染。n8d28資訊網——每日最新資訊28at.com

useOptimistic

useOptimistic Hook 允許在進行提交動作的同時,能夠樂觀地更新用戶界面,提升用戶體驗。其語法如下:n8d28資訊網——每日最新資訊28at.com

import { useOptimistic } from 'react';function AppContainer() {    const [optimisticState, addOptimistic] = useOptimistic(        state,        // 更新函數        (currentState, optimisticValue) => {            // 合并并返回帶有樂觀值的新狀態          },    );}

樂觀更新:一種更新應用程序中數據的策略。這種策略通常會先更改前端頁面,然后向服務器發送請求,如果請求成功,則結束操作;如果請求失敗,則頁面回滾到先前狀態。這種做法可以防止新舊數據之間的跳轉或閃爍,提供更快的用戶體驗。n8d28資訊網——每日最新資訊28at.com

下面來看一個添加購物車的例子:n8d28資訊網——每日最新資訊28at.com

import { useState, useOptimistic } from 'react';const AddToCartForm = ({ id, title, addToCart, optimisticAddToCart }) => {  const formAction = async (formData) => {    optimisticAddToCart({ id, title });    try {      await addToCart(formData, title);    } catch (e) {      // 捕獲錯誤    }  };  return (    <form action={formAction}>      <h2>{title}</h2>      <input type="hidden" name="itemID" value={id} />      <button type="submit">添加到購物車</button>    </form>  );};type Item = {  id: string;  title: string;};const Cart = ({ cart }: { cart: Item[] }) => {  if (cart.length == 0) {    return null;  }  return (    <>      購物車:      <ul>        {cart.map((item, index) => (          <li key={index}>{item.title}</li>        ))}      </ul>      <hr />    </>  );};export const App = () => {  const [cart, setCart] = useState<Item[]>([]);  const [optimisticCart, optimisticAddToCart] = useOptimistic<Item[], Item>(    cart,    (state, item) => [...state, item]  );  const addToCart = async (formData: FormData, title) => {    const id = String(formData.get('itemID'));    await new Promise((resolve) => setTimeout(resolve, 1000));    setCart((cart: Item[]) => [...cart, { id, title }]);    return { id };  };  return (    <>      <Cart cart={optimisticCart} />      <AddToCartForm        id="1"        title="JavaScript權威指南"        addToCart={addToCart}        optimisticAddToCart={optimisticAddToCart}      />      <AddToCartForm        id="2"        title="JavaScript高級程序設計"        addToCart={addToCart}        optimisticAddToCart={optimisticAddToCart}      />    </>  );};

在上面的例子中,將商品添到購物車時,會先在購物車列表看到剛剛添加的商品,而不必等到數據請求完成。這樣,用戶可以更快地看到更新后的購物車內容,提供更加流暢的用戶體驗。n8d28資訊網——每日最新資訊28at.com

圖片圖片n8d28資訊網——每日最新資訊28at.com

useFormState

在介紹這個 Hook 之前,先來看以下這個 Hook 使用的背景。n8d28資訊網——每日最新資訊28at.com

<form>

React 將引入一個新組件:<form>,它是創建用于提交信息的交互式控件,可以將一個函數作為action的屬性值。當用戶提交表單時,React 將自動調用此函數,以執行相應的操作。n8d28資訊網——每日最新資訊28at.com

<form actinotallow={handleSubmit} />

注意,如果在 React 18 中添加<form action>屬性,就會收到警告:n8d28資訊網——每日最新資訊28at.com

?? Warning: Invalid value for prop action on <form> tag. Either remove it from the element or pass a string or number value to keep it in the DOM.n8d28資訊網——每日最新資訊28at.com

這里的意思是,<form>標簽上的 prop action無效。要么從元素中刪除它,要么傳遞一個字符串或數字值以將其保留在 DOM 中。n8d28資訊網——每日最新資訊28at.com

而在新版本中,可以直接在<form>標簽上設置action屬性。例如,在上面的購物車例子中,:n8d28資訊網——每日最新資訊28at.com

const AddToCartForm = ({ id, title, addToCart }) => {  const formAction = async (formData) => {    try {      await addToCart(formData, title);    } catch (e) {      // 捕獲錯誤    }  };  return (    <form action={formAction}>      <h2>{title}</h2>      <input type="hidden" name="itemID" value={id} />      <button type="submit">添加到購物車</button>    </form>  );};

addToCart 函數并不是在服務器端執行的,而是在客戶端(例如用戶的瀏覽器)上運行的。這個函數可以是一個異步函數,如網絡請求,而不阻止其他代碼的執行。通過使用addToCart函數,開發者可以更簡單地處理React中的AJAX表單,例如在搜索表單中。然而,這可能還不足以完全擺脫像 React Hook Form 這樣的第三方庫,因為它們不僅處理表單提交,還包括驗證、副作用等多種功能。n8d28資訊網——每日最新資訊28at.com

看完這個新功能,下面就來看看這一部分要介紹的新 Hook:useFormState。n8d28資訊網——每日最新資訊28at.com

useFormState

useFormState 是一個可以根據某個表單動作的結果更新 state 的 Hook。n8d28資訊網——每日最新資訊28at.com

const [state, formAction] = useFormState(fn, initialState);

只有在表單提交觸發 action 后才會被更新的值,如果該表單沒有被提交,該值會保持傳入的初始值不變。n8d28資訊網——每日最新資訊28at.com

例如,這可以用來顯示由表單操作返回的確認消息或錯誤消息。n8d28資訊網——每日最新資訊28at.com

import { useState } from 'react';import { useFormState } from 'react-dom';const AddToCartForm = ({ id, title, addToCart }) => {  const addToCartAction = async (prevState, formData) => {    try {      await addToCart(formData, title);      return '添加成功';    } catch (e) {      return "添加失?。嘿u完啦";    }  };  const [message, formAction] = useFormState(addToCartAction, null);  return (    <form action={formAction}>      <h2>{title}</h2>      <input type="hidden" name="itemID" value={id} />      <button type="submit">添加到購物車</button>       {message}    </form>  );};type Item = {  id: string;  title: string;};export const App = () => {  const [cart, setCart] = useState<Item[]>([]);  const addToCart = async (formData: FormData, title) => {    const id = String(formData.get('itemID'));    await new Promise((resolve) => setTimeout(resolve, 1000));    if (id === '1') {      setCart((cart: Item[]) => [...cart, { id, title }]);    } else {      throw new Error('Unavailable');    }    return { id };  };  return (    <>      <AddToCartForm        id="1"        title="JavaScript權威指南"        addToCart={addToCart}      />      <AddToCartForm        id="2"        title="JavaScript高級程序設計"        addToCart={addToCart}      />    </>  );};

效果如下:n8d28資訊網——每日最新資訊28at.com

圖片圖片n8d28資訊網——每日最新資訊28at.com

注意:useFormState 需要從 react-dom 中導入,而不是從 react 中導入。n8d28資訊網——每日最新資訊28at.com

useFormStatus

useFormStatus 用于獲取上次表單提交的狀態信息。n8d28資訊網——每日最新資訊28at.com

const { pending, data, method, action } = useFormStatus();

它不接收任何參數,會返回一個包含以下屬性的 status 對象:n8d28資訊網——每日最新資訊28at.com

  • pending:布爾值。如果為 true,則表示父級 <form> 正在等待提交;否則為 false。
  • data:包含父級 <form> 正在提交的數據;如果沒有進行提交或沒有父級 <form>,它將為 null。
  • method:字符串,可以是 'get' 或 'post'。表示父級 <form> 使用 GET 或 POST HTTP 方法 進行提交。默認情況下,<form> 將使用 GET 方法,并可以通過 method 屬性指定。
  • action:一個傳遞給父級 <form> 的 action 屬性的函數引用。如果沒有父級 <form>,則該屬性為 null。如果在 action 屬性上提供了 URI 值,或者未指定 action 屬性,status.action 將為 null。

下面來繼續看購物車的例子,將商品添加到購物車成功前,禁用添加按鈕:n8d28資訊網——每日最新資訊28at.com

import { useState } from 'react';import { useFormStatus } from 'react-dom';const AddToCartForm = ({ id, title, addToCart }) => {  const formAction = async (formData) => {    try {      await addToCart(formData, title);    } catch (e) {      // 捕獲錯誤    }  };  return (    <form action={formAction}>      <h2>{title}</h2>      <input type="hidden" name="itemID" value={id} />      <SubmitButton />    </form>  );};const SubmitButton = () => {  const { pending } = useFormStatus();  return (    <button disabled={pending} type="submit">      添加到購物車    </button>  );};type Item = {  id: string;  title: string;};const Cart = ({ cart }: { cart: Item[] }) => {  if (cart.length == 0) {    return null;  }  return (    <>      購物車:      <ul>        {cart.map((item, index) => (          <li key={index}>{item.title}</li>        ))}      </ul>      <hr />    </>  );};export const App = () => {  const [cart, setCart] = useState<Item[]>([]);  const addToCart = async (formData: FormData, title) => {    const id = String(formData.get('itemID'));    await new Promise((resolve) => setTimeout(resolve, 1000));    setCart((cart: Item[]) => [...cart, { id, title }]);    return { id };  };  return (    <>      <Cart cart={cart} />      <AddToCartForm        id="1"        title="JavaScript權威指南"        addToCart={addToCart}      />      <AddToCartForm        id="2"        title="JavaScript高級程序設計"        addToCart={addToCart}      />    </>  );};

添加購物車時效果如下:n8d28資訊網——每日最新資訊28at.com

圖片圖片n8d28資訊網——每日最新資訊28at.com

注意:useFormState 需要從 react-dom 中導入,而不是從 react 中導入。此外,它僅在父級表單使用 action 屬性時才有效。n8d28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-69007-0.htmlReact 19 即將推出的四個全新 Hooks,很實用!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如何讓Go程序以后臺進程或daemon方式運行

下一篇: Seata如何實現兩階段提交(2PC)分布式事務

標簽:
  • 熱門焦點
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據博主數碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 影音體驗是真的強 簡單聊聊iQOO Pad

    大公司的好處就是產品線豐富,非常細分化的東西也能給你做出來,例如早先我們看到了新的vivo Pad2,之后我們又在iQOO Neo8 Pro的發布會上看到了iQOO的首款平板產品iQOO Pad。雖
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 自動化在DevOps中的力量:簡化軟件開發和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現以下目標:消除手動和重復性任務。簡化流程。在整個軟件開發生命周期中實現更
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯發科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經上市便受到了諸多用
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現場,成為了展會的一大看點。這也是三翼鳥繼9月9日發布了行業首個一站式定制智慧家平臺后的
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久黄色小说| 亚洲激情电影中文字幕| 欧美日韩在线看| 国产精品久久久久久久第一福利 | 久久久久一本一区二区青青蜜月| 久久久一区二区三区| 欧美国产在线电影| 欧美日韩高清不卡| 国产一本一道久久香蕉| 亚洲电影激情视频网站| 99视频热这里只有精品免费| 亚洲自拍偷拍麻豆| 国产精品三区www17con| 国产欧美一区二区在线观看| 欧美日韩精品三区| 国产精品一二三四| 悠悠资源网亚洲青| 亚洲一区二区久久| 久久综合久久综合这里只有精品| 欧美精品三级日韩久久| 美女国内精品自产拍在线播放| 欧美欧美午夜aⅴ在线观看| 免费成人网www| 国产精品久久久久av| 欧美日韩亚洲另类| 国产在线麻豆精品观看| 亚洲精品视频二区| 欧美影院成人| 性欧美长视频| 欧美国产日韩亚洲一区| 欧美高清免费| 国产日韩欧美一区| 狠久久av成人天堂| 在线中文字幕一区| 亚洲欧美国产毛片在线| 亚洲欧美成人一区二区三区| 六十路精品视频| 国产精品一区二区三区久久久 | 久久视频一区| 欧美性大战久久久久久久蜜臀 | 黄色成人av网站| 亚洲天堂av高清| 欧美成人午夜免费视在线看片| 国产日韩欧美自拍| 亚洲四色影视在线观看| 欧美高清视频一二三区| 黄色成人av网| 午夜精品一区二区在线观看| 欧美老女人xx| 亚洲国产欧美在线人成| 久久久久久网址| 国产欧美在线观看| 亚洲尤物影院| 久久国产成人| 国产精品国色综合久久| 亚洲精品视频免费| 麻豆成人精品| 激情小说亚洲一区| 亚洲美女视频| 亚洲嫩草精品久久| 欧美日韩精品免费在线观看视频| 亚洲国产精品一区在线观看不卡 | 久久久人成影片一区二区三区| 国产欧美二区| 亚洲欧美日韩国产中文在线| 欧美日韩一区不卡| 亚洲美女电影在线| 欧美福利视频在线| 亚洲国产美女久久久久| 久久一区二区三区四区| 黄色成人精品网站| 久久欧美中文字幕| 黄色日韩在线| 久久精品一区二区三区不卡牛牛| 欧美高清成人| 亚洲激情一区二区| 欧美福利视频在线观看| 亚洲精品123区| 欧美福利视频一区| 亚洲黑丝一区二区| 欧美黄色大片网站| 亚洲伦理中文字幕| 欧美伦理影院| 一区二区激情小说| 国产精品大片| 亚洲国产成人在线播放| 久久午夜羞羞影院免费观看| 尤物在线精品| 欧美 日韩 国产 一区| 国产一区二区三区在线观看精品| 欧美亚洲一区二区三区| 国产一区二区电影在线观看| 久久精品视频亚洲| 揄拍成人国产精品视频| 欧美成人首页| 亚洲卡通欧美制服中文| 欧美视频一区二区在线观看| 亚洲一区二区三区影院| 欧美成人亚洲成人| 国产亚洲毛片在线| 久久精品五月婷婷| 1000部精品久久久久久久久| 欧美v国产在线一区二区三区| 亚洲精品乱码| 欧美午夜视频在线| 小黄鸭精品aⅴ导航网站入口| 国产尤物精品| 你懂的网址国产 欧美| 亚洲免费电影在线观看| 国产精品久久久| 久久精品一区二区三区不卡| 亚洲国产精品一区二区三区| 欧美日韩国产综合新一区| 亚洲欧美日韩综合| 国语自产在线不卡| 午夜精品久久久久久久99水蜜桃 | 在线视频亚洲一区| 国产偷国产偷亚洲高清97cao| 久久亚洲精选| 99综合在线| 国产日韩在线视频| 欧美大片在线影院| 亚洲综合欧美日韩| 在线观看一区二区精品视频| 欧美日韩精品一区二区天天拍小说 | 狠狠干成人综合网| 欧美激情视频给我| 午夜一级久久| 亚洲国产成人久久| 欧美亚州韩日在线看免费版国语版| 欧美一区日本一区韩国一区| 最新高清无码专区| 国产精品日韩精品欧美在线| 乱人伦精品视频在线观看| 亚洲色无码播放| 伊人成人开心激情综合网| 欧美视频在线观看 亚洲欧| 久久久水蜜桃| 亚洲一区二区少妇| 亚洲成人资源网| 国产精品你懂的在线欣赏| 蜜臀av一级做a爰片久久| 午夜伦欧美伦电影理论片| 亚洲日本成人| 国产一区二区三区自拍| 欧美日韩视频| 美女主播精品视频一二三四| 午夜精品www| 亚洲精品网址在线观看| 国产一区二区精品丝袜| 欧美日韩综合一区| 老司机免费视频一区二区三区| 亚洲主播在线观看| 亚洲六月丁香色婷婷综合久久| 国产综合婷婷| 国产精品毛片a∨一区二区三区|国 | 国内精品久久久久影院薰衣草 | 一色屋精品视频免费看| 欧美性做爰猛烈叫床潮| 免费高清在线一区| 性色av一区二区三区红粉影视| 日韩亚洲国产欧美| 在线播放中文一区| 国产伦精品一区二区三区视频黑人| 欧美精品在线极品| 浪潮色综合久久天堂| 欧美一级专区| 亚洲一区二区三区中文字幕在线| 亚洲日本欧美| 亚洲福利免费| 黄网站色欧美视频| 国产日韩成人精品| 国产精品久久影院| 欧美一区三区二区在线观看| 精品51国产黑色丝袜高跟鞋| 国产精品日韩精品| 欧美日韩免费看| 欧美成人一区二区三区| 久久一二三国产| 欧美中文字幕视频在线观看| 亚洲一区二区在线免费观看| 99精品国产在热久久下载| 亚洲激情在线观看| 欧美日韩在线三区| 欧美人与性动交cc0o| 欧美大片在线观看一区二区| 免费观看日韩| 免费欧美日韩| 麻豆91精品91久久久的内涵| 久久福利电影| 欧美在线视频一区二区三区| 欧美一级夜夜爽| 亚久久调教视频| 欧美一级黄色网| 欧美在线二区| 久久av免费一区| 久久精品电影| 久久久欧美精品| 久久久久青草大香线综合精品| 久久精品久久99精品久久| 久久精品国产99国产精品澳门| 久久国产精品电影| 久久国内精品自在自线400部| 久久精品国产77777蜜臀|