> For AI agents: the complete documentation index is available at https://docs.halo.run/llms.txt, the full documentation bundle is available at https://docs.halo.run/llms-full.txt.

# 文章数据列表操作菜单

此扩展点用于扩展文章数据列表的操作菜单项。

![文章数据列表操作菜单](/img/developer-guide/plugin/extension-points/ui/post-list-item-operation-create.png)

## 定义方式

```ts
export default definePlugin({
  extensionPoints: {
    "post:list-item:operation:create": (
      post: Ref<ListedPost>,
    ): OperationItem<ListedPost>[] => {
      return [
        {
          priority: 10,
          component: markRaw(VDropdownItem),
          props: {},
          action: (item?: ListedPost) => {
            // do something
          },
          label: "foo",
          hidden: false,
          permissions: [],
          children: [],
        },
      ];
    },
  },
});
```

`OperationItem<T>` 由 `@halo-dev/ui-shared` 提供，请直接使用当前依赖中的类型。`priority` 和使用 `markRaw` 包装的 `component` 为必需字段；`props`、`action`、`label`、`hidden`、`permissions` 和递归的 `children` 为可选字段。

`priority` 越小，操作项的显示位置越靠前（内置操作项通常以 0、10、20… 依次排列，如需插入到内置项之间，可选择中间值）。

## 示例

此示例将实现一个操作菜单项，点击后会将文章内容作为文件下载到本地。

```ts
import type { ListedPost } from "@halo-dev/api-client";
import { VDropdownItem } from "@halo-dev/components";
import { definePlugin } from "@halo-dev/ui-shared";
import axios from "axios";
import { markRaw } from "vue";

export default definePlugin({
  extensionPoints: {
    "post:list-item:operation:create": () => {
      return [
        {
          priority: 21,
          component: markRaw(VDropdownItem),
          label: "下载到本地",
          permissions: [],
          action: async (post: ListedPost) => {
            const { data } = await axios.get(
              `/apis/api.console.halo.run/v1alpha1/posts/${post.post.metadata.name}/head-content`,
            );
            const blob = new Blob([data.raw], {
              type: "text/plain;charset=utf-8",
            });
            const url = window.URL.createObjectURL(blob);
            const link = document.createElement("a");
            link.href = url;
            link.download = `${post.post.spec.title}.${data.rawType}`;
            link.click();
          },
        },
      ];
    },
  },
});
```

## 类型定义

### ListedPost

`ListedPost` 由 `@halo-dev/api-client` 提供，请直接使用当前依赖中的生成类型。它包含：

- `post`：文章资源。
- `categories` 和 `tags`：解析后的分类与标签。
- `owner` 和 `contributors`：作者与贡献者。
- `stats`：访问、评论等统计数据。
