# api.addPostMenuButton 带条件

**URL:** <https://meta.discourse.org/t/api-addpostmenubutton-with-conditions/209902>\
**Category:** Development\
**Created:** [2021年十一月22日 19:02 UTC](https://meta.discourse.org/t/api-addpostmenubutton-with-conditions/209902 "2021-11-22T19:02:51Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Programer-D](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/programer-d/32/215194_2.png) [@Programer-D](https://meta.discourse.org/u/Programer-D)\
**Post date:** [2021年十一月22日 19:02 UTC](https://meta.discourse.org/t/api-addpostmenubutton-with-conditions/209902/1 "2021-11-22T19:02:52Z")

</div>

首先，我为我的蹩脚英语道歉。  
我想添加一个“显示更多…”按钮。  
下图中的帖子由 10 行文本组成，但只显示了 5 行。

用户可以通过点击“显示更多”来查看完整文本。

 ![image](https://global.discourse-cdn.com/meta/original/3X/d/a/da5578c1b7d20045d73268b50ea94d285e0c4935.png)

此按钮应根据每个帖子已渲染部分的高度或行数来决定是否显示。

 ![image](https://global.discourse-cdn.com/meta/original/3X/8/d/8dee3967e5cd7d6eceb3435e8a21c97f70aa7387.png)

我不知道如何使用 `api.addPostMenuButton` 进行分支，所以目前即使是像下面这样只有一行的短帖子也会显示此按钮。

这对我来说不是很理想。

我认为条件分支应该能够获取已渲染部分的高度或行数（或字符数）。  
我查阅了文档，但找不到 `api.addPostMenuButton` 的任何选项。  
非常感谢您的帮助。

---

<div class="post-metadata">

**Author:** ![Johani](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/johani/32/176920_2.png) [@Johani](https://meta.discourse.org/u/Johani)\
**Post date:** [2021年十二月12日 22:58 UTC](https://meta.discourse.org/t/api-addpostmenubutton-with-conditions/209902/2 "2021-12-12T22:58:26Z")

</div>

`api.addPostMenuButton` 方法只关心你返回的值。该值需要是一个对象。你在 return 之前做的任何事情都不重要。按钮将为每个帖子渲染，该方法会给你 `post` 对象，你可以用它来完成你的工作。

例如，假设我想让按钮只显示在字数超过 300 的帖子中。我就可以这样做。

`common > header`

```xml
<script type="text/discourse-plugin" version="0.8">
  const MIN_WORD_COUNT = 300;

  api.addPostMenuButton("myButton", (post) => {
    // 你可以记录 post 属性来查看有什么可用
    // console.log(post);

    // 示例
    const roughWordCount = post.cooked.match(/\S+/g).length;

    if (roughWordCount < MIN_WORD_COUNT) {
      // 按钮不会渲染
      return;
    }

    // 按钮将渲染，创建返回对象
    const result = {
      action: SOME_ACTION,
      icon: ICON_NAME,
      title: TITLE_TRANSLATION_KEY,
      className: CLASSNAMES,
      position: "first", // 可以是 `first`, `last` 或 `second-last-hidden`
    };

    // 如果在桌面端，则添加一个标签
    if (!post.mobileView) {
      result.label = LABLE_TRANSLATION_KEY;
    }

    // 返回对象
    return result;
  });
</script>

```

将大写字母替换为实际数据，并在字数超过 300 的帖子中尝试一下。你会发现它在那里渲染了。
