# @contensis/canvas-react 中文文档

规范地址：https://npmcn.com/package/%40contensis/canvas-react/

版本：1\.3\.2
npm 元数据更新时间：2026-02-12T17:09:00.477Z
中文译文更新时间：2026-11-10T16:25:58.109Z
软件包许可：ISC

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40contensis/canvas-react
原文对照：https://npmcn.com/package/%40contensis/canvas-react/?lang=original
项目主页：https://github.com/contensis/canvas/tree/main/packages/react
源码仓库：https://github.com/contensis/canvas

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：216 kB，8 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- peer 依赖：react \>16\.8\.0，react-dom \>16\.8\.0
- 首次发布：2023-12-01T20:37:36.489Z
- 最新版本发布：2026-02-12T17:09:00.122Z
- 近 30 天下载量：6496（2026-10-11 至 2026-11-09，npm 官方下载统计）
- 已发布版本数：11（近 12 个月 1 个）

## 中文简介

用 React 绘制画面内容

## 安装

```sh
npm install @contensis/canvas-react
```

也可以使用：`pnpm add @contensis/canvas-react`、`yarn add @contensis/canvas-react`、`bun add @contensis/canvas-react`

## README

# @ contensis/canvas- react 页面存档备份,存于互联网档案馆

在您的 React 工程中, 内容在 Contensis 画布中被整理 .

## 安装

用您工程的首选软件包管理器安装

```sh
npm install --save @contensis/canvas-react
```

```sh
yarn add --save @contensis/canvas-react
```

## 使用量

用 React 绘制画面内容

```tsx
import React, { useState } from 'react';
import ReactDOM from 'react-dom/client';
import { RenderContextProvider, Renderer } from '@contensis/canvas-react';
import * as CanvasData from './canvas-data';

// Our React App
const App = () => {
  const [data] = useState(CanvasData.data); // Demo data

  return (
    <div className="content">
      <RenderContextProvider>
        <Renderer data={data} />
      </RenderContextProvider>
    </div>
  );
};

const element = document.getElementById('root') as HTMLElement;
ReactDOM.createRoot(element).render(
    <React.StrictMode>
        <App />
    </React.StrictMode>
);

```

您可以在创建画布渲染器时, 通过添加自己的渲染组件来覆盖内容块的默认渲染

```tsx
import React, { useState } from 'react';
import ReactDOM from 'react-dom/client';
import { Block, Image, ImageBlock, RenderBlockProps, RenderContextProvider, Renderer, Table, TableBlock } from '@contensis/canvas-react';
import * as CanvasData from './canvas-data';

const MyImage = (props: RenderBlockProps<ImageBlock>) => {
    // Embelish the image markup if a caption is included
    const caption = props.block?.value?.caption;
    // Set a className for the image in all cases
    return !!caption ? (
        <figure className="figure" style={{ display: 'block' }}>
            <Image {...props} className="figure-img img-fluid" />
            <figcaption className="figure-caption text-end">{caption}</figcaption>
        </figure>
    ) : (
        <Image {...props} className="img-fluid" />
    );
};

const MyTable = (props: RenderBlockProps<TableBlock>) => {
    // Set CSS className on tables
    return <Table {...props} className="table table-striped" />;
};

// Component wrapping a Renderer for simple usage
const SimpleRenderer = ({ data }: { data: Block[] }) => {
    return (
        <RenderContextProvider
            blocks={{
                _image: MyImage,
                _table: MyTable
            }}
        >
            <Renderer data={data} />
        </RenderContextProvider>
    );
};

// Our React App
const App = () => {
    const [data] = useState(CanvasData.data); // Demo data

    return (
        <div className="content">
            <SimpleRenderer data={data} />
        </div>
    );
};

const element = document.getElementById('root') as HTMLElement;
ReactDOM.createRoot(element).render(
    <React.StrictMode>
        <App />
    </React.StrictMode>
);

```

对于Canvas数据中的任何组件字段,我们也可以这样做

```tsx
import React, { useState } from 'react';
import ReactDOM from 'react-dom/client';
import { Block, Image, RenderContextProvider, Renderer, Table } from '@contensis/canvas-react';
import * as CanvasData from './canvas-data';

type Book = { cover: string; name: string };

// Render a "book" component within the canvas data
const MyBookComponent = (props: RenderBlockProps<ComponentBlock<Book>) => {
  const book = props.block?.value;
  if (!book) return null;
  return (
    <div className="card mb-3">
      <div className="row g-0">
        <div className="col-md-8">
          <div className="card-body">
            <h5 className="card-title">{book.name}</h5>
            <p className="card-text">{book.name}</p>
          </div>
        </div>
        <div className="col-md-4">
          <img src={book.cover} className="img-fluid rounded-start" />
        </div>
      </div>
    </div>
  );
}

// Component wrapping a customised Renderer for use in our app
const SimpleRenderer = ({ data }: { data: Block[] }) => {
    return (
        <RenderContextProvider
            components={{
                book: MyBookComponent,
            }}
        >
            <Renderer data={data} />
        </RenderContextProvider>
    );
};

// Our React App
const App = () => {
    const [data] = useState(CanvasData.data); // Demo data

    return (
        <div className="content">
            <SimpleRenderer data={data} />
        </div>
    );
};

const element = document.getElementById('root') as HTMLElement;
ReactDOM.createRoot(element).render(
    <React.StrictMode>
        <App />
    </React.StrictMode>
);
```

你试试这个 [反应示例项目](https://github.com/contensis/canvas/tree/main/apps/react)

## 常见问题

### @contensis/canvas-react 是什么？

用 React 绘制画面内容

### 如何安装 @contensis/canvas-react？

在项目目录运行 npm install @contensis/canvas-react，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：react（\>16\.8\.0）、react-dom（\>16\.8\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @contensis/canvas-react 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @contensis/canvas-react 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @contensis/canvas-react 可以商用吗？

@contensis/canvas-react 使用 ISC 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @contensis/canvas-react 的下载量有多少？

根据 npm 官方下载统计，@contensis/canvas-react 在 2026/10/11 – 2026/11/09 这 30 天内被下载 6,496 次，日均约 217 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @contensis/canvas-react 还在维护吗？

最新版本 1\.3\.2 发布于 2026/02/13（8 个月前）；至今共发布 11 个版本，其中过去 12 个月发布了 1 个；首次发布于 2023/12/02。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

