日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
幾天不寫React,已經(jīng)看不懂語法了

大家好,我卡頌。

創(chuàng)新互聯(lián)公司從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項目實(shí)施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元長春做網(wǎng)站,已為上家服務(wù),為長春各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

下面這個React組件代碼,用到3個use關(guān)鍵詞,你理解他們的作用嗎?

'use client'

function App() {
  using data = use(ctx);
  
  // ...
}

真是幾天不寫React,語法都看不懂了。本文就來聊聊這幾個use關(guān)鍵詞各自的意義。

use client

首先是位于代碼頂部的'use client'聲明,使用方式類似于嚴(yán)格模式的聲明:

'use strict';
// 此處是嚴(yán)格模式下的JavaScript代碼

'use client'聲明是RSC(React Server Component,服務(wù)端組件)協(xié)議中的定義。

啟用了RSC的React應(yīng)用,所有組件默認(rèn)在服務(wù)端渲染(可以通過Next v13體驗(yàn)),只有聲明'use client'的組件文件,會在前端渲染。

假設(shè)我們的React應(yīng)用組件結(jié)構(gòu)如下,其中紅色代表「服務(wù)端組件」,藍(lán)色代表「客戶端組件」(聲明'use client'):

那么當(dāng)應(yīng)用打包后,D、E組件會打包成獨(dú)立文件。在前端,React可以直接渲染A、B、C組件。但是對于D、E,需要以JSONP的形式請求回組件代碼再渲染。

完整執(zhí)行邏輯如下:

using關(guān)鍵字

接下來是data變量前的using關(guān)鍵字:

using data = use(ctx);

using關(guān)鍵字是tc39提案ECMAScript Explicit Resource Management[1]提出的,用于為各種資源(內(nèi)存、I/O等)提供統(tǒng)一的生命周期管理(何時分配、何時釋放等)。

同時,TS v5.2率先引入了這個關(guān)鍵字。所以,接下來的講解我們以TS中的using關(guān)鍵詞為準(zhǔn)。

using的作用有點(diǎn)類似useEffect的destroy函數(shù)。當(dāng)我們在useEffect的create函數(shù)綁定了事件后,可以在destroy函數(shù)解綁:

function App() {
  useEffect(() => {
    console.log('這里是create函數(shù)')
    return () => {
      console.log('這里是destroy函數(shù)')
    }
  }, [])
}

類似的,當(dāng)我們通過using關(guān)鍵詞聲明一個包含[Symbol.dispose]方法的對象后,當(dāng)離開當(dāng)前作用域時,聲明的[Symbol.dispose]方法會執(zhí)行:

{
  const getResource = () => {
    return {
      [Symbol.dispose]: () => {
        console.log('離開啦!')
      }
    }
  }
  using resource = getResource();
}
// 代碼執(zhí)行到這里會打印 離開啦!

在[Symbol.dispose]方法內(nèi)主要執(zhí)行一些釋放資源的操作。

比如,當(dāng)我們操作數(shù)據(jù)庫時,如果要考慮「操作完斷開數(shù)據(jù)庫連接」,可能會寫出如下代碼:

const db = await connectDB();
try {
  // 執(zhí)行數(shù)據(jù)庫操作
} finally {
  // 斷開數(shù)據(jù)庫連接
  await db.close();
}

如果使用using關(guān)鍵詞,代碼如下:

const connect = async () => {
  const db = await connectDB();
  return {
    db,
    [Symbol.asyncDispose]: () => db.close()
  };
};

// 使用
{
  using { db } = await connect();
  // 執(zhí)行數(shù)據(jù)庫操作
} 
// 離開作用域自動斷開連接

配合async await使用,可以降低「由于忘記釋放資源造成內(nèi)存泄漏」的可能性。

use方法

最后是React v18.3之后發(fā)布的新原生hook —— use:

using data = use(ctx);

這個hook可以接收兩種類型數(shù)據(jù):

  • React Context

此時use的作用與useContext一樣。

  • promise

此時如果這個promise處于pending狀態(tài),則最近一個祖先組件可以渲染fallback。

比如,在如下代碼中,如果組件或其子孫組件使用了use,且promise處于pending狀態(tài)(比如請求后端資源):

function App() {
  return (
    
loading...
}>
); }

那么,頁面會渲染如下結(jié)果:

loading...

當(dāng)請求成功后,會渲染。

總結(jié)

對于開篇提到的代碼:

'use client'

function App() {
  using data = use(ctx);
  
  // ...
}

表示:

  • 這是個客戶端組件
  • 如果傳遞給use的變量ctx是React Context,則use的作用等同于useContext。
  • 如果傳遞給use的變量ctx是promise,則配合最近的使用。
  • 如果use的返回值包含[Symbol.dispose],則App組件render完成后會執(zhí)行[Symbol.dispose]方法。

一個文件,三款use相關(guān)語法,你是不是已經(jīng)懵逼了呢?

參考資料

[1]ECMAScript Explicit Resource Management:https://github.com/tc39/proposal-explicit-resource-management。


網(wǎng)頁名稱:幾天不寫React,已經(jīng)看不懂語法了
本文網(wǎng)址:http://m.5511xx.com/article/cosepsp.html