row.components[4].setDisabled(true)调用后按钮未实际禁用问题求助
按钮
setDisabled(true)未生效的解决方案 我一看你的问题就明白症结在哪了——你只是修改了本地按钮对象的disabled属性,但没把这个更新同步给Discord服务器!控制台输出的是内存里的对象状态,可Discord客户端根本不知道你改了啥,自然不会显示按钮禁用。
核心问题
当你调用row.components[4].setDisabled(true)时,只是在本地修改了MessageButton的属性,但Discord的API不会自动感知这个变化。必须通过更新原消息的组件配置,才能让客户端显示出按钮禁用的状态。
修改后的代码示例
把你的逻辑调整一下,在设置按钮禁用后,通过交互对象的update方法把更新后的组件行发送给Discord:
if (id == "right") { shopcounter += 1 if ((shopcounter+1) * 3 > itemarray.length) { // 标记按钮为禁用 row.components[4].setDisabled(true) // 更新原消息的组件,同步禁用状态 return ButtonInteraction.first().update({ components: [row] }) .then(() => ButtonInteraction.first().followUp("No more pages!")) } shopCommand(receivedMessage, user) // 翻页后同步组件状态(保持交互一致性) return ButtonInteraction.first().update({ components: [row] }) .then(() => ButtonInteraction.first().followUp("Next page!")) }
为什么这样有效?
update方法会向Discord API发送请求,替换原消息的组件配置,这样客户端就能收到新的按钮状态并重新渲染- 用
followUp发送提示消息,避免直接reply产生冗余消息,保持交互的连贯性
如果你的row是之前发送消息时的组件行,确保它是可复用的对象,或者在每次交互时正确获取当前组件状态再修改。
内容的提问来源于stack exchange,提问作者DeathWarrior990
相关产品推荐
相关产品推荐

