成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

幾天不寫React,已經看不懂語法了

開發 前端
真是幾天不寫React,語法都看不懂了。本文就來聊聊這幾個Use關鍵詞各自的意義。

大家好,我卡頌。

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

'use client'

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

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

use client

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

'use strict';
// 此處是嚴格模式下的JavaScript代碼

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

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

假設我們的React應用組件結構如下,其中紅色代表「服務端組件」,藍色代表「客戶端組件」(聲明'use client'):

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

完整執行邏輯如下:

using關鍵字

接下來是data變量前的using關鍵字:

using data = use(ctx);

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

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

using的作用有點類似useEffect的destroy函數。當我們在useEffect的create函數綁定了事件后,可以在destroy函數解綁:

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

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

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

在[Symbol.dispose]方法內主要執行一些釋放資源的操作。

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

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

如果使用using關鍵詞,代碼如下:

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

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

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

use方法

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

using data = use(ctx);

這個hook可以接收兩種類型數據:

  • React Context

此時use的作用與useContext一樣。

  • promise

此時如果這個promise處于pending狀態,則最近一個祖先<Suspense/>組件可以渲染fallback。

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

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

那么,頁面會渲染如下結果:

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

當請求成功后,會渲染<Cpn />。

總結

對于開篇提到的代碼:

'use client'

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

表示:

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

一個文件,三款use相關語法,你是不是已經懵逼了呢?

參考資料

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

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2021-12-09 11:59:49

JavaScript前端提案

2020-03-30 16:45:06

代碼看不懂

2019-12-09 08:29:26

Netty架構系統

2020-03-06 11:30:08

JavaGitHub編程

2022-12-12 07:40:36

服務器項目Serverless

2013-07-08 10:49:03

程序員代碼看懂代碼

2022-07-26 14:38:08

JavaScriptWeb安全自動化

2022-06-16 14:07:26

Java代碼代碼review

2021-02-23 10:36:09

Linux命令kmdr

2022-02-07 09:05:00

GitHub功能AI

2014-03-12 09:25:33

產品經理Startup

2017-09-19 15:45:39

2020-11-06 08:36:04

UI設計規范iOS

2020-09-21 13:06:58

TikTok網絡安全隱私

2017-06-16 09:22:22

數據結構算法鏈表

2019-10-24 08:56:38

語言代碼Java

2022-01-05 09:40:03

DIff算法前端

2023-06-06 07:41:00

Reacthook

2021-10-08 08:58:35

物聯網通信發布者

2022-01-14 23:44:57

電腦進程設置
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久久久久久人人人人传媒 | 看羞羞视频 | 国产高潮好爽受不了了夜夜做 | 国产欧美日韩在线 | 99热.com| 中文精品视频 | 国产精品久久久久久亚洲调教 | 一区二区三区回区在观看免费视频 | 黄色三级免费 | 自拍视频在线观看 | 中文字幕在线第一页 | 波多野结衣中文视频 | 成人免费视频 | 欧美视频在线播放 | 成人性生交大片免费看r链接 | 日韩中文字幕视频 | 欧美mv日韩mv国产网站91进入 | 国产91一区二区三区 | 日韩视频一区在线观看 | 国产精品特级片 | 日韩在线欧美 | 日韩欧美三区 | 久久精品网 | 日日夜夜免费精品视频 | 国产一级视频在线观看 | 亚洲国产免费 | 天堂中文av | 精品一区免费 | 一级片网址 | 久久精品电影 | 69电影网 | 欧美亚洲在线视频 | 日韩国产一区二区 | 国产999精品久久久久久 | 国产精品一区二区三区久久久 | 国产激情91久久精品导航 | 久久精品成人 | 久久爱黑人激情av摘花 | 久久亚洲综合 | 久久蜜桃av一区二区天堂 | av网站免费观看 |