【问题标题】:How to disabled button after 1 time clicked in Svelte?如何在 Svelte 中单击 1 次后禁用按钮?
【发布时间】:2022-01-03 11:37:37
【问题描述】:

您好,我有一个循环选择题的测验应用程序。我使用 {#each} 循环的使用按钮的选择。

我试图在单击按钮后禁用 1 个按钮,但没有成功。

如何在 Svelte 中单击按钮后禁用单个按钮?

let isCorrect
let isAnswered = false
let isDisabled = false

function checkAnswer(correct) {
    isCorrect = correct
    isAnswered = true
    isDisabled = true
    if(isCorrect) {
      addPoint()
    }
  }

let all_answers = [
  {answer: 'Elton John', correct: false},
  {answer: 'Andrew Gold', correct: true}, 
  {answer: 'Leo Sayer', correct: false},  
  {answer: 'Barry White ', correct: false}
]

{#each all_answers as answer}
  <button on:click={() => checkAnswer(answer.correct)}>
    {@html answer.answer} 
  </button>
{/each}

【问题讨论】:

    标签: svelte svelte-3


    【解决方案1】:

    您可以从当前事件中获取对与之交互的元素的引用。

    首先,将事件传递给处理程序:

    <button on:click={(e) => checkAnswer(e, answer.correct)}>
    

    在事件处理程序中,获取对被点击的按钮元素的引用并禁用它:

    function checkAnswer(e, correct) {
      isCorrect = correct;
      isAnswered = true;
      isDisabled = true;
      if (isCorrect) {
        addPoint();
      }
    
      // get the button element and disable it
      const node = e.currentTarget;
      node.disabled = true;
    }
    

    【讨论】:

    • 谢谢,我不知道我可以使用e.currentTarget。这要简单得多,只需要禁用e.currentTarget
    【解决方案2】:

    不确定这是否是您要查找的内容,但如果您只想跟踪每个按钮是否已被单击,您可以在all_answer 列表中的每个对象上添加一个isClicked 属性。然后在checkAnswer 中传递整个对象并在单击后翻转属性。然后重新创建all_answers 数组。

    这个REPL 做了类似的事情。

    <script>
    let isCorrect
    let isAnswered = false
    let isDisabled = false
    
    let total = 0
    const addPoint = () => total += 1
    
    function checkAnswer(answer) {
        isCorrect = answer.correct
        isAnswered = true
        answer.isClicked = true;
        if(isCorrect) {
          addPoint()
        }
        all_answers = [...all_answers]
      }
    
    let all_answers = [
      {answer: 'Elton John', correct: false, isClicked: false},
      {answer: 'Andrew Gold', correct: true, isClicked: false}, 
      {answer: 'Leo Sayer', correct: false, isClicked: false},  
      {answer: 'Barry White ', correct: false, isClicked: false}
    ]
    
    </script>
    {#each all_answers as answer}
      <button on:click={() => checkAnswer(answer)} disabled={answer.isClicked}>
        {@html answer.answer} 
      </button>
    {/each}
    

    【讨论】:

    • 谢谢,我之前想过这个问题。我明白我现在错过了什么。现在,我可以删除顶部的let isDisabled = false
    猜你喜欢
    • 2015-01-12
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2019-10-25
    相关资源
    最近更新 更多