前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >不同类型的 React 组件

不同类型的 React 组件

作者头像
ACK
发布于 2024-10-06 00:04:04
发布于 2024-10-06 00:04:04
37400
代码可运行
举报
运行总次数:0
代码可运行

大家好,这里公众号 Geek技术前线

今天我们来学习 React 自诞生以来各种类型的 React 组件

自从 React 于 2013 年发布以来,出现了各种类型的组件。有些在现在的 React 应用中仍然至关重要,而另一些则主要出现在旧项目中(或者已被官方废弃)。

React createClass

React 最初依赖 createClass(已废弃)定义组件,它通过工厂函数创建 React 组件,而不需要 JavaScript Class。由于 JavaScript ES5 缺少类语法,这种方法在 2015 年之前的标准是用于构建 React 组件的方式,而 JavaScript ES6 则引入了类语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import createClass from "create-react-class";

const CreateClassComponent = createClass({

  getInitialState: function () {

    return {

      text: "",

    };

  },

  handleChangeText: function (event) {

    this.setState({ text: event.target.value });

  },

  render: function () {

    return (

      <div>

        <p>Text: {this.state.text}</p>

        <input

          type="text"

          value={this.state.text}

          onChange={this.handleChangeText}

        />

      </div>

    );

  },

});

export default CreateClassComponent;

在这个示例中,React 的 createClass() 工厂方法接收一个对象,该对象定义了 React 组件的方法。getInitialState() 函数用于初始化组件的状态,而必需的 render() 方法使用 JSX 处理输出的显示。可以向对象添加其他方法,例如 incrementCounter(),作为组件的事件处理程序。

生命周期方法同样可以用于处理副作用。例如,如果我们想每次将 text 的状态值写入浏览器的本地存储,可以使用 componentDidUpdate() 生命周期方法。此外,当组件接收到初始状态时,还可以从本地存储读取该值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import createClass from "create-react-class";

const CreateClassComponent = createClass({

  getInitialState: function () {

    return {

      text: localStorage.getItem("text") || "",

    };

  },

  componentDidUpdate: function () {

    localStorage.setItem("text", this.state.text);

  },

  handleChangeText: function (event) {

    this.setState({ text: event.target.value });

  },

  render: function () {

    return (

      <div>

        <p>Text: {this.state.text}</p>

        <input

          type="text"

          value={this.state.text}

          onChange={this.handleChangeText}

        />

      </div>

    );

  },

});

export default CreateClassComponent;

React 的 createClass 方法已不再包含在 React 核心包中。如果现在还想尝试使用的话需要安装一个额外的 npm 包 create-react-class

React Mixins(模式)

React Mixins(已废弃)是 React 引入的第一个用于复用组件逻辑的模式。通过使用 Mixin,可以将组件的逻辑提取为一个独立的对象。当在组件中使用 Mixin 时,所有来自 Mixin 的功能都会被引入到该组件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import createClass from "create-react-class";

const LocalStorageMixin = {

  getInitialState: function () {

    return {

      text: localStorage.getItem("text") || "",

    };

  },

  componentDidUpdate: function () {

    localStorage.setItem("text", this.state.text);

  },

};

const CreateClassWithMixinComponent = createClass({

  mixins: [LocalStorageMixin],

  handleChangeText: function (event) {

    this.setState({ text: event.target.value });

  },

  render: function () {

    return (

      <div>

        <p>Text: {this.state.text}</p>

        <input

          type="text"

          value={this.state.text}

          onChange={this.handleChangeText}

        />

      </div>

    );

  },

});

export default CreateClassWithMixinComponent;

LocalStorageMixin 封装了处理 text 状态的逻辑,将其存储在本地存储中。在 getInitialState 中初始化 text,并在 componentDidUpdate 中进行更新。通过将 Mixin 添加到 mixins 数组中,组件可以复用这部分共享功能,而不必重复编写代码。

然而,React 中的 Mixins 已经不再使用,因为它们带来了许多缺点,并且仅限于 createClass 组件中使用。

React 类组件

React 类组件(不推荐)在 2015 年 3 月发布的 React 0.13 版本中被引入。在此之前,开发者使用 createClass 函数来定义组件,但最终在 2017 年 4 月发布的 React 15.5 版本中废弃了 createClass,并推荐使用类组件来替代。

类组件的引入是为了利用 JavaScript 的原生类(因为 2015 年发布的 ES6 提供了类的语法),使得 JS 类可以在 React 中使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react";

class ClassComponent extends React.Component {

  constructor(props) {

    super(props);

    this.state = {

      text: "",

    };

    this.handleChangeText = this.handleChangeText.bind(this);

  }

  handleChangeText(event) {

    this.setState({ text: event.target.value });

  }

  render() {

    return (

      <div>

        <p>Text: {this.state.text}</p>

        <input

          type="text"

          value={this.state.text}

          onChange={this.handleChangeText}

        />

      </div>

    );

  }

}

export default ClassComponent;

用 JavaScript 类编写的 React 组件自带一些方法,比如类的构造函数(主要用于在 React 中设置初始状态或绑定方法),以及必需的 render 方法,用于返回 JSX 作为输出。

所有的内部 React 组件逻辑都来源于面向对象的继承。但需要注意的是,React 不推荐组件使用继承而是推荐使用组合优于继承的原则。

此外,在使用 ES6 箭头函数时,类组件还提供了一种简化的方法,用于自动绑定方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react";

class ClassComponent extends React.Component {

  constructor(props) {

    super(props);

    this.state = {

      text: "",

    };

    // 使用箭头函数时不需要手动绑定

    // this.handleChangeText = this.handleChangeText.bind(this);

  }

  handleChangeText = (event) => {

    this.setState({ text: event.target.value });

  };

  render() {

    return (

      <div>

        <p>Text: {this.state.text}</p>

        <input

          type="text"

          value={this.state.text}

          onChange={this.handleChangeText}

        />

      </div>

    );

  }

}

export default ClassComponent;

React 类组件还提供了多种生命周期方法,用于组件的挂载、更新和卸载。在我们之前的本地存储示例中,也可以通过生命周期方法将其引入为副作用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react";

class ClassComponent extends React.Component {

  constructor(props) {

    super(props);

    this.state = {

      text: localStorage.getItem("text") || "",

    };

    this.handleChangeText = this.handleChangeText.bind(this);

  }

  componentDidUpdate() {

    localStorage.setItem("text", this.state.text);

  }

  handleChangeText(event) {

    this.setState({ text: event.target.value });

  }

  render() {

    return (

      <div>

        <p>Text: {this.state.text}</p>

        <input

          type="text"

          value={this.state.text}

          onChange={this.handleChangeText}

        />

      </div>

    );

  }

}

export default ClassComponent;

随着 React 16.8 版本(2019 年 2 月)引入 React Hooks,使用带有 Hooks 的函数组件成为了行业标准,从而使得类组件逐渐过时。在此之前,类组件与函数组件共存,因为函数组件在没有 Hooks 的情况下,无法管理状态或处理副作用。

React 高阶组件(模式)

React 高阶组件(不再推荐)曾是跨组件复用逻辑的流行高级模式。

高阶组件 的最简单解释是,它是一个以组件为输入并返回一个增强功能组件的函数。让我们回顾一下之前的本地存储功能提取示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react";

const withLocalStorage = (storageKey) => (Component) => {

  return class extends React.Component {

    constructor(props) {

      super(props);

      this.state = {

        value: localStorage.getItem(storageKey) || "",

      };

    }

    componentDidUpdate() {

      localStorage.setItem(storageKey, this.state.value);

    }

    onChangeValue = (event) => {

      this.setState({ value: event.target.value });

    };

    render() {

      return (

        <Component

          value={this.state.value}

          onChangeValue={this.onChangeValue}

          {...this.props}

        />

      );

    }

  };

};

class ClassComponent extends React.Component {

  render() {

    return (

      <div>

        <p>Text: {this.props.value}</p>

        <input

          type="text"

          value={this.props.value}

          onChange={this.props.onChangeValue}

        />

      </div>

    );

  }

}

export default withLocalStorage("text")(ClassComponent);

通过 withLocalStorage 高阶组件,我们将本地存储逻辑抽象出来,并将其与其他组件结合,赋予它们本地存储功能。

另一种常见的 React 高级模式是 React Render Prop 组件,它通常用作 React 高阶组件(HOCs)的替代方案。值得注意的是,HOCs 和 Render Prop 组件都可以在类组件和函数组件中使用。

然而,在现代 React 应用中,React 高阶组件和 Render Prop 组件的使用已经减少。使用 React Hooks 的函数组件已成为跨组件共享逻辑的主流方法。

React 函数组件

React 函数组件(Function Components,FC,过去有时被称为 函数无状态组件)现在常作为类组件的替代方案。它们以函数形式表达,而不是类。在过去,函数组件无法使用状态或处理副作用,因此也被称为无状态组件,但自从 React Hooks 的引入,它们已经能够管理状态和副作用,并重新定义为函数组件。

React Hooks函数组件引入了状态管理和副作用处理,使其成为现代 React 应用的 行业标准。React 提供了多种内置的 Hooks,也可以创建自定义 Hooks。以下是将之前的 React 类组件转为函数组件的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useState } from "react";

const FunctionComponent = () => {

  const [text, setText] = useState("");

  const handleChangeText = (event) => {

    setText(event.target.value);

  };

  return (

    <div>

      <p>Text: {text}</p>

      <input type="text" value={text} onChange={handleChangeText} />

    </div>

  );

};

export default FunctionComponent;

上述代码展示了函数组件使用 React 内置的 useState Hook 管理状态。而 React Hooks 的引入也让函数组件能够处理副作用。以下代码展示了使用 React 的 useEffect Hook,该 Hook 每次状态变化时执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useEffect, useState } from "react";

const FunctionComponent = () => {

  const [text, setText] = useState(localStorage.getItem("text") || "");

  useEffect(() => {

    localStorage.setItem("text", text);

  }, [text]);

  const handleChangeText = (event) => {

    setText(event.target.value);

  };

  return (

    <div>

      <p>Text: {text}</p>

      <input type="text" value={text} onChange={handleChangeText} />

    </div>

  );

};

export default FunctionComponent;

最后,我们可以将这些 Hooks 提取出来,封装为一个自定义 Hook,以确保组件状态与本地存储同步。最终,它会返回必要的值和设置函数,供函数组件使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useEffect, useState } from "react";

const useLocalStorage = (storageKey) => {

  const [value, setValue] = useState(localStorage.getItem(storageKey) || "");

  useEffect(() => {

    localStorage.setItem(storageKey, value);

  }, [storageKey, value]);

  return [value, setValue];

};

const FunctionComponent = () => {

  const [text, setText] = useLocalStorage("text");

  const handleChangeText = (event) => {

    setText(event.target.value);

  };

  return (

    <div>

      <p>Text: {text}</p>

      <input type="text" value={text} onChange={handleChangeText} />

    </div>

  );

};

export default FunctionComponent;

通过这个自定义 Hook,我们能够复用本地存储逻辑,并将其应用于不同的函数组件。

React 自定义 Hook 的抽象模式可以像 Mixins、高阶组件 (HOC)、以及 Render Prop 组件那样,将可复用的业务逻辑提取出来供不同组件使用。这种方式可以将逻辑封装,并在任意函数组件中复用,是目前 React 推荐的跨组件共享逻辑的最佳方式。

React Server Component

React 在 2023 年推出了 React 服务器组件 (React Server Components, RSC),这使得开发者可以在服务器上执行组件。其主要优势在于:仅将 HTML 发送到客户端,且组件可以访问服务器端资源。

由于服务器组件是在服务器端执行的,不能与之前的示例一一对应,因为它们服务于不同的场景。以下示例展示了一个服务器组件如何在发送渲染后的 JSX 作为 HTML 给客户端之前,从服务器端资源(如数据库)中获取数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ReactServerComponent = async () => {

  const posts = await db.query("SELECT * FROM posts");

  return (

    <div>

      <ul>

        {posts?.map((post) => (

          <li key={post.id}>{post.title}</li>

        ))}

      </ul>

    </div>

  );

};

export default ReactServerComponent;

随着服务器组件的出现,React 也引入了 客户端组件 (Client Components) 这一术语,指的是运行在客户端上的传统 React 组件,也就是你在本指南中看到的内容。

与客户端组件不同,服务器组件无法使用 React Hooks 或其他 JavaScript 功能(如事件处理),因为它们是在服务器端运行的。

React 本身仅提供服务器组件的底层规范和构建模块,实际的实现则依赖于 React 框架(如 Next.js)。

异步组件

目前,异步组件仅支持服务器组件,但未来有望支持客户端组件。如果组件被标记为 async,它可以执行异步操作(例如获取数据)。

在之前的服务器组件示例中,你看到了这种行为,组件从数据库中获取数据,然后在发送已渲染的 JSX 作为 HTML 给客户端之前进行渲染。在客户端组件中无法实现此功能,因为它会阻塞客户端的渲染。

目前,你只能将 JavaScript Promise 传递给客户端组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Suspense } from "react";

const ReactServerComponent = () => {

  const postsPromise = db.query("SELECT * FROM posts");

  return (

    <div>

      <Suspense>

        <ReactClientComponent promisedPosts={postsPromise} />

      </Suspense>

    </div>

  );

};

并在客户端组件中使用 use API 来解析它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use client";

import { use } from "react";

const ReactClientComponent = ({ promisedPosts }) => {

  const posts = use(promisedPosts);

  return (

    <ul>

      {posts?.map((post) => (

        <li key={post.id}>{post.title}</li>

      ))}

    </ul>

  );

};

export { ReactClientComponent };

未来,React 可能会支持客户端组件中的异步组件,允许你在渲染之前在客户端组件中获取数据。

最后

所有 React 组件在使用 React Props 时都遵循共同的原则,因 Props 主要用于在组件树中传递信息。然而,对于类组件和函数组件来说,状态管理和副作用处理的使用方式有所不同

参考

  • https://www.robinwieruch.de/react-component-types/
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
请问报错: 没有"pubmed_trend"这个函数,应该怎么解决呀,R小白
请问报错: 没有"pubmed_trend"这个函数,应该怎么解决呀,R小白
回复回复点赞举报
推荐阅读
R可视化:R可视化教程来了!
从本周开始会每周推送1~2次高质量R可视化内容,本系列内容来自github上面超级火爆的R语言可视化项目:tidyTuesday。tidyTuesday每周更新数据,大佬们会使用这些数据集自由创作出各种高质量的R语言可视化作品,是学习R语言数据分析和可视化极好的素材。
医学和生信笔记
2022/11/15
6210
R可视化:R可视化教程来了!
用python对汽车油耗进行数据分析(anaconda python3.6完全跑通)
编者按:前两天我们微信发了一篇文章《用python对汽车油耗进行数据分析》,有一网友学习后用python3.6重新跑了一下数据,请大家比较阅读。PPV课致力于为大家提供一个开放、分享、进步的数据科学社区,欢迎小伙伴们给我们分享你的学习心得和博客文章,有你的鼓励和支持,我们会做的更好。投稿请联系QQ149104196。 正文: 1.下载汽车油耗数据集并解压 下载地址:https://www.fueleconomy.gov/feg/download.shtml vehiclesData.py: #encodi
小莹莹
2018/04/23
1K0
用python对汽车油耗进行数据分析(anaconda python3.6完全跑通)
多年暴雨tif数据集合成为一个nc数据
当处理多年暴雨的 TIF 数据集时,我们可以使用 rioxarray 库将这些数据合成为一个 NetCDF (nc) 文件。NetCDF 是一种常用的科学数据格式,它具有跨平台、可扩展和自描述的特点,非常适合存储和共享地理空间数据。
用户11172986
2024/06/20
4020
多年暴雨tif数据集合成为一个nc数据
R可视化:动态热力地图
本系列内容来自github上面超级火爆的R语言可视化项目:tidyTuesday。是学习R语言数据分析和可视化极好的素材。
医学和生信笔记
2023/02/14
8650
R可视化:动态热力地图
【数据分析与可视化】Pandas Dataframe
import numpy as np import pandas as pd from pandas import Series, DataFrame # 引入网页 import webbrowser link = 'https://www.tiobe.com/tiobe-index/' webbrowser.open(link) True # 获取剪贴板数据 df = pd.read_clipboard() df Year Winner 2019 medal C 2018 medal Python 2
瑞新
2020/07/07
4130
PIE-engine 教程 ——提取黄河流域/山西省1980—2018年流域降水量并对比分析
这里面我们首先要上传我们自己的研究区,然后加载每一年的数据降水数据,通过系数转化,完成正常降水量的展示,我们通过对reduceregion的统计,分别算出平均降水量,分辨率设定为1000米,最后加载影像的chart折线图,用于存放坐标横轴时间和纵轴的对象(降水),这里我们首先看一下降水数据
此星光明
2024/02/02
2420
PIE-engine 教程 ——提取黄河流域/山西省1980—2018年流域降水量并对比分析
左右用R右手Python9——字符串合并与拆分
在文本处理和数据清洗阶段,对字符串或者字符型变量进行分割、提取或者合并虽然谈不上什么高频需求,但是往往也对很重要的。 接下来跟大家大致盘点一下在R语言与Pyhton中,常用的字符串分割与合并的函数。 R语言: 字符串向量: 针对向量: strsplit #针对字符串向量(拆分) str_split #针对字符串向量(拆分)stringr包内函数 paste #针对向量合并 针对数据框: unite #合并数据框中的某几列 separate #将数据框中某一列按照某种模式拆分成
数据小磨坊
2018/04/11
1.6K0
python list.remove的坑
那是因为list的遍历是基于下标的,当你删除其中的一个元素的时候,列表实际上已经发生了变化,该元素后面的所有元素都往前移动了一个位置,所以下次遍历的时候就会跳过该元素后面的一个元素。
葫芦
2019/04/17
9810
应用Python统计公司年报中指定词出现的次数
本文背景是大学关系很好的老师最近在做文本挖掘相关的项目,想要我用Python帮她实现公司年报中某些词出现次数的统计。
阿黎逸阳
2023/10/20
2570
应用Python统计公司年报中指定词出现的次数
一文读懂参考基因组和基因组注释+最全下载方法
自从 1990 启动的家喻户晓的人类基因组计划开始,全世界的科学家竭尽全力破译了第一个完整的人类基因组,从那时开始人类拿到了一本只有 ATCG 四个碱基书写的天书。后续人们逐步完善了基因组序列信息,并写在 Fasta 格式的文本文件“天书”中,这本天书就叫做参考基因组。
白墨石
2021/06/10
3.3K0
一文读懂参考基因组和基因组注释+最全下载方法
时间序列 | 时期(Period)及其算术运算
你可以将Period('2012','A-DEC')看做一个被划分为多个月度时期的时间段中的游标。下图对此进行了说明在将高频率转换为低频率时,超时期(superperiod)是由子时期(subperiod)所属的位置决定的。
数据STUDIO
2021/06/24
1.2K0
Google Earth Engine ——MOD16A2 V105产品以1公里的像素分辨率提供8天的全球陆地蒸发量(ET)信息
The MOD16A2 V105 product provides information about 8-day global terrestrial evapotranspiration at 1km pixel resolution. Evapotranspiration (ET) is the sum of evaporation and plant transpiration from the Earth's surface to the atmosphere. With long-term ET data, the effects of changes in climate, land use, and ecosystems disturbances can be quantified.
此星光明
2024/02/02
1520
Google Earth Engine ——MOD16A2 V105产品以1公里的像素分辨率提供8天的全球陆地蒸发量(ET)信息
80 - 抓取豆瓣音乐排行榜
使用自己熟悉的网络库和分析库,实现抓取豆瓣音乐Top250排行榜的数据,并将数据保存在csv文件中 更多爬虫教学及案例可查看我 “Python爬虫” 专栏 ''' https://music.doub
ruochen
2021/06/14
1.1K0
80 - 抓取豆瓣音乐排行榜
这么牛X的包,一般人我不告诉他!!!
本文将给大家介绍一个ggplot2灰常牛X的可视化扩展包,我将该包主页的包用法介绍整理成中文,分享给大家。 包名叫geofacet,有经验的charter大概能猜出来个大概,没错该包是关于可视化数据中的地理信息,以及维度分面。 作者命名非常讲究,将该包的两个主要核心功能进行组合命名。 地理信息可视化分面,这么吊的包你肯定是第一次看到吧(其实之前介绍过一些地图上的mini 柱形图、饼图等都算这一类),但是这里的分面功能做的更加彻底,作者还是遵循惯例,将这种基于地理信息分面的可视化功能对接了ggplot2,并
数据小磨坊
2018/04/11
8000
这么牛X的包,一般人我不告诉他!!!
Google Earth Engine(GEE) ——2000-2021年地球非洲海岸线数据集
数字地球非洲海岸线 数字地球非洲海岸线是一个大陆数据集,包括整个非洲海岸线的年度海岸线和海岸变化率。这是一项临时服务,已经生成了2000年至2021年的数据,我们希望与用户一起改进和操作。
此星光明
2024/02/02
2010
Google Earth Engine(GEE) ——2000-2021年地球非洲海岸线数据集
一文入门数分三剑客--Numpy、Pandas、Matplotlib
Numpy Pandas 和 Matplotlib 是数据分析领域著名的三大模块,今天我们来一起学习下这三剑客
周萝卜
2021/10/13
3.8K0
一文入门数分三剑客--Numpy、Pandas、Matplotlib
实验2 比例可视化之堆叠柱状图
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wpxu08/article/details/89384861
步行者08
2019/05/05
7750
实验2 比例可视化之堆叠柱状图
关于flask入门教程-ajax+echarts实现热力图
热力图 (Heatmap) 通过色彩变化来显示数据,热力图适合用来交叉检查多变量的数据。显示是否有彼此相似的变量;以及检测彼此之间是否存在任何相关性。也可以展现随着时间的变化指标的发展。
python与大数据分析
2022/03/11
4130
关于flask入门教程-ajax+echarts实现热力图
老板喊你调研文献?推荐你用R包软件②pubmed.mineR
R包安利 ② pubmed.mineR—又一个PubMed利器 https://mp.weixin.qq.com/s/bndecTSABox2dcr7aoheig
生信菜鸟团
2023/09/09
5950
老板喊你调研文献?推荐你用R包软件②pubmed.mineR
RTS人工智能研究的历史
在过去十年中,研究人员已经从单独研究RTS游戏的不同人工智能技术,转变为更加复杂的游戏中的合作与竞争,不同的技术进行了对比。为了使这项工作取得成功,以下条件是必要的: • 为研究人员开发和评估机器人开放的API • 比赛使研究人员能够比较不同的技术 • 重放学习算法用于培训 • 人类对手评估机器人的表现 这些条件大部分是在2009年发布了母巢战API的,但是这个平台的封闭性让研究人员对AI系统的训练过程实现自动化具有挑战性。随着星际争霸2开放环境的公布,研究人员将有很大机会在RTS游戏中开发具有专家级性能的
刀刀老高
2018/04/10
1.3K0
RTS人工智能研究的历史
推荐阅读
相关推荐
R可视化:R可视化教程来了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档