如何在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
相关产品推荐
相关产品推荐

