自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

幾天不寫(xiě)React,已經(jīng)看不懂語(yǔ)法了

開(kāi)發(fā) 前端
真是幾天不寫(xiě)React,語(yǔ)法都看不懂了。本文就來(lái)聊聊這幾個(gè)Use關(guān)鍵詞各自的意義。

大家好,我卡頌。

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

'use client'

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

真是幾天不寫(xiě)React,語(yǔ)法都看不懂了。本文就來(lái)聊聊這幾個(gè)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ù)端渲染(可以通過(guò)Next v13體驗(yàn)),只有聲明'use client'的組件文件,會(huì)在前端渲染。

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

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

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

using關(guān)鍵字

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

using data = use(ctx);

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

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

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

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

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

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

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

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

const db = await connectDB();
try {
  // 執(zhí)行數(shù)據(jù)庫(kù)操作
} finally {
  // 斷開(kāi)數(shù)據(jù)庫(kù)連接
  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ù)庫(kù)操作
} 
// 離開(kāi)作用域自動(dòng)斷開(kāi)連接

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

use方法

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

using data = use(ctx);

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

  • React Context

此時(shí)use的作用與useContext一樣。

  • promise

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

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

function App() {
  return (
    <div>
      <Suspense fallback={<div>loading...</div>}>
        <Cpn />
      </Suspense>
    </div>
  );
}

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

<div>
  <div>loading...</div>
</div>

當(dāng)請(qǐng)求成功后,會(huì)渲染<Cpn />。

總結(jié)

對(duì)于開(kāi)篇提到的代碼:

'use client'

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

表示:

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

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

參考資料

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

責(zé)任編輯:姜華 來(lái)源: 魔術(shù)師卡頌
相關(guān)推薦

2021-12-09 11:59:49

JavaScript前端提案

2020-03-30 16:45:06

代碼寫(xiě)看不懂

2019-12-09 08:29:26

Netty架構(gòu)系統(tǒng)

2020-03-06 11:30:08

JavaGitHub編程

2013-07-08 10:49:03

程序員代碼看懂代碼

2022-12-12 07:40:36

服務(wù)器項(xiàng)目Serverless

2022-07-26 14:38:08

JavaScriptWeb安全自動(dòng)化

2022-06-16 14:07:26

Java代碼代碼review

2022-02-07 09:05:00

GitHub功能AI

2021-02-23 10:36:09

Linux命令kmdr

2014-03-12 09:25:33

產(chǎn)品經(jīng)理Startup

2017-09-19 15:45:39

2020-11-06 08:36:04

UI設(shè)計(jì)規(guī)范iOS

2020-09-21 13:06:58

TikTok網(wǎng)絡(luò)安全隱私

2017-06-16 09:22:22

數(shù)據(jù)結(jié)構(gòu)算法鏈表

2019-10-24 08:56:38

語(yǔ)言代碼Java

2022-01-05 09:40:03

DIff算法前端

2021-10-08 08:58:35

物聯(lián)網(wǎng)通信發(fā)布者

2024-10-14 12:56:28

2022-01-14 23:44:57

電腦進(jìn)程設(shè)置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)