如何为discord.js v13的下拉选择菜单设置默认选中值
解决方案
你使用的是Discord.js v13版本的MessageSelectMenu组件,可根据你的需求选择以下两种设置方式:
1. 设置未选择时的占位提示文字
如果只是需要下拉菜单未激活选择时显示默认提示文本,直接在初始化下拉菜单时调用setPlaceholder方法即可,同时注意必须给组件设置customId否则会报错,修改代码如下:
const select = new Discord.MessageSelectMenu() .setCustomId('help-category-select') // 必填,自定义ID可任意设置 .setPlaceholder('请选择命令分类') // 占位提示文字
2. 设置默认预先选中某个分类选项
如果需要页面加载时就默认选中某一个已有的分类选项,同时加载对应分类的命令列表,需要先提取有效分类列表,再调用setDefaultValues方法传入对应选项的value值,修改后完整代码如下:
// 先提取所有有效分类 const validCategories = [] const select = new Discord.MessageSelectMenu() .setCustomId('help-category-select') for (const category of categoriesFolders) { const len = category.length; if (fs.readdirSync(`./commands/${category}`).length < 1) {continue}; const cateValue = category.substring(0, len - '-commands'.length) validCategories.push(cateValue) select.addOptions([{ label: uppercaseFirst(cateValue), value: cateValue }]); } // 设置默认选中第一个有效分类 select.setDefaultValues([validCategories[0]]) // 初始化embed直接加载默认分类的命令内容,不用显示无分类提示 const helpEmbed = new Discord.MessageEmbed() .setColor(696969) const defaultFls = fs.readdirSync(`./commands/${validCategories[0]}-commands`).filter(file => file.endsWith('.js')); for (const cmd of defaultFls) { const command = require(`../${validCategories[0]}-commands/${cmd}`) helpEmbed.addField(command.name, command.description); } const row = new Discord.MessageActionRow().addComponents(select); const filter = (interaction) => interaction.isSelectMenu() && interaction.user.id === message.author.id; const collector = message.channel.createMessageComponentCollector({ filter }) collector.on('collect', async(collected) => { const value = collected.values[0]; // 选择后更新默认选中值 select.setDefaultValues([value]) const embed = new Discord.MessageEmbed() .setColor(696969) const fls = fs.readdirSync(`./commands/${value}-commands`).filter(file => file.endsWith('.js')); for (const cmd of fls) { const command = require(`../${value}-commands/${cmd}`) embed.addField(command.name, command.description); } // 更新消息同时更新组件的默认选中状态 collected.message.edit({ embeds: [embed], components: [row] }).catch(() => {}); await collected.deferUpdate(); }) message.channel.send({ embeds: [helpEmbed], components: [row] });
注意:
setDefaultValues传入的数组长度不能超过你设置的下拉菜单maxValues属性值,默认maxValues为1,所以仅需传入单个值即可。
内容的提问来源于stack exchange,提问作者SamCraftGames 13
相关产品推荐
相关产品推荐

