You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在discord.js中追踪选择菜单交互并获取选中值?

如何在discord.js中追踪选择菜单交互并获取选中值?

嘿,我来帮你搞定这个问题!你已经成功用循环创建了多个选择菜单,现在差的就是监听这些菜单的交互事件,然后取出选中的值啦。下面分两步来帮你实现:

第一步:给每个选择菜单设置唯一的自定义ID

你现在的代码里没有给选择菜单加自定义ID,这会导致你没法区分到底是哪一个菜单被触发了。所以先修改你创建菜单的代码,给每个select加上独一无二的customId:

for (let i = 0; i < arr.length; i++) {
  const select = new SelectMenuBuilder()
    .setCustomId(`role-select-${i}`) // 给每个菜单设置唯一标识
    .addOptions([
      {
        label: `${i}`,
        value: `value${i}`,
        description: `${i} role`
      }
    ]);
  // 将选择菜单添加到行动行组件中
  const row = new ActionRowBuilder().addComponents(select);
  // 后续将row添加到消息组件集合中发送即可
}

第二步:监听选择菜单的交互事件

接下来你需要在客户端上监听interactionCreate事件,判断触发的交互是不是选择菜单,再根据自定义ID区分菜单,最后获取选中的值:

client.on('interactionCreate', async interaction => {
  // 先过滤掉非选择菜单的交互
  if (!interaction.isSelectMenu()) return;

  // 通过自定义ID前缀判断是否是我们创建的角色选择菜单
  if (interaction.customId.startsWith('role-select-')) {
    // 选择菜单支持多选,所以values是数组,单选场景取第一个元素即可
    const selectedValue = interaction.values[0];
    // 这里可以编写你需要的业务逻辑,比如给用户反馈选中结果
    await interaction.reply(`你选中的值是:${selectedValue}`);
  }
});

额外小提示

如果你的选择菜单是临时消息里的一次性组件(比如用channel.send()发送的临时消息),也可以用组件收集器来监听:

const message = await interaction.channel.send({ components: [row] });
// 创建一个60秒有效期的组件收集器
const collector = message.createMessageComponentCollector({ time: 60000 });

collector.on('collect', async i => {
  if (i.isSelectMenu()) {
    const selectedValue = i.values[0];
    await i.reply(`你选中了:${selectedValue}`);
    collector.stop(); // 处理完后停止收集器
  }
});

备注:内容来源于stack exchange,提问作者X_Comatose_X

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 08:18:09