😕 几天不写React,已经看不懂语法了

阿轩的BUG
文章191
评论56
标签101
站点日志
作者总数:1位
置顶文章:0篇
标签总数:101条
文章总数:196篇
评论总数:56条
微语总数:149条
运行天数:2307天
最近更新:2024-09-30
文章标签
最新评论
Sherlock
2025-08-21
不是应该打包成apk文件吗,怎么突然就运行编译了,下一步呢
老金er
2025-05-25
人生设计非常必要,在信息化发达的今天,周围大部分人依然只能过着人生工程模式生活,长时间生活洗礼后,尽管“人生工程”已经不再适合很多人,他们也无法做出任何改变,人生设计给我们提供了新的思路,值得尝试
赏帮赚
2025-05-25
职场太多的尔虞我诈
三笑
2024-08-16
emlog6.0.1可以升级支持吗?
pony
2024-07-08
这篇文章提供了一种新的人生规划方法——"人生设计",它借鉴了产品设计的理念,鼓励人们以创造性和探索性的方式思考和规划自己的生活。以下是对这篇文章的几个评价维度: 创新性:将产品设计的理念应用于人生规划是一个新颖的视角,为人们提供了一种跳出传统生活轨迹,探索个性化生活路径的方法。 实用性:文章不仅提出了理念,还详细介绍了具体的实施步骤,包括自我评估、制定计划、原型设计和实践选择等,具有很强的操作性。 启发性:通过强调好奇心、不断尝试、重新定义问题等心态,文章鼓励人们打破常规,勇于探索未知,这对于激发个人潜能和创造力具有积极作用。 适应性:"人生设计"理念适用于不同人生阶段和不同背景的人,无论是希望从头开始的人,还是已经取得一定成就但希望探索新方向的人,都可以从中获得启发。 情感共鸣:文章对许多人对传统生活轨迹的不满和对改变的渴望进行了深刻的洞察,能够引起读者的共鸣。 可持续性:人生设计强调的是一个持续迭代和试错的过程,这与现实生活的发展规律相吻合,有助于人们在不断变化的环境中做出适应性调整。 教育意义:作为一种人生规划方法,"人生设计"可以作为教育的一部分,帮助年轻人更早地学会自我探索和规划,为未来的生活和职业发展打下基础。 局限性:尽管"人生设计"提供了一种新的思考框架,但它可能需要个人具备一定的自我认知和反思能力,对于一些缺乏自我探索经验的人来说,可能需要额外的指导和支持。 总体来说,这篇文章提供了一种有价值的人生规划方法,对于那些渴望改变、寻求个性化生活的人来说,是一种有益的参考和指导。
首页值得一看 🔍️

下面这个React组件代码,用到3个use关键词,你理解他们的作用吗?

'use client'

function App() {
  using data = use(ctx);

  // ...
}

真是几天不写React,语法都看不懂了。本文就来聊聊这几个use关键词各自的意义。

use client

首先是位于代码顶部的'use client'声明,使用方式类似于严格模式的声明:

'use strict';
// 此处是严格模式下的JavaScript代码

'use client'声明是RSCReact Server Component,服务端组件)协议中的定义。

启用了RSCReact应用,所有组件默认在服务端渲染(可以通过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提出的,用于为各种资源(内存、I/O等)提供统一的生命周期管理(何时分配、何时释放等)。

同时,TS v5.2率先引入了这个关键字。所以,接下来的讲解我们以TS中的using关键词为准。

using的作用有点类似useEffectdestroy函数。当我们在useEffectcreate函数绑定了事件后,可以在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的变量ctxReact Context,则use的作用等同于useContext
  • 如果传递给use的变量ctxpromise,则配合最近的<Suspense/>使用
  • 如果use的返回值包含[Symbol.dispose],则App组件render完成后会执行[Symbol.dispose]方法

一个文件,三款use相关语法,你是不是已经懵逼了呢?

上一篇
⚛️ 详解文生图视觉AIGC原理
下一篇
👨‍🔬 十大JavaScript设计模式让你成为编程巨匠