单击时如何将样式和文本仅应用于一个按钮而不是 Angular 10 中的所有按钮

How to apply styles and text to only one button when clicked instead of all buttons in Angular 10

所以我有一组链接,每个链接都有一个复制按钮,可以将文本复制到剪贴板。单击时,复制按钮应该将其内部文本更改为“已复制!”并且在超时将其恢复为原始状态之前,颜色也会发生变化。

问题是当我单击一个按钮时,样式和 innerText 应用于所有按钮。这是代码:

TS

  copyState = { text: 'copy', color: '' };

onClick() {
    this.copyState.text = 'Copied!';
    this.copyState.color = 'hsl(258, 40%, 30%)';

    setTimeout(() => {
      this.copyState.text = 'Copy';
      this.copyState.color = '';
    }, 5000);
  }
 

外部 API 生成链接

HTML:

  <div class="result" *ngFor="let result of Links; index as i">
    <p class="original_link">{{ result.original_link }}</p>

    <div class="new-link">
      <p>{{ result.short_link }}</p>
      <button 
        [ngStyle]="{ 'background-color': copyState.color }"
        [cdkCopyToClipboard]="result.short_link"
        (click)="onClick(i)"
      >
        {{ copyState.text }}
      </button>
    </div>

问题是您没有为 copyState.text 使用数组。像这样填充 Links 数组后修改它

Links.forEach(link) {
  link.copyStateColor = '';
  link.copyStateText = 'Copy';
});

现在数组中的每个对象都有两个新的properties.Apply它到html这样,

  <div class="result" *ngFor="let result of Links; index as i">
    <p class="original_link">{{ result.original_link }}</p>

    <div class="new-link">
      <p>{{ result.[enter image description here][1]short_link }}</p>
      <button [ngStyle]="{ 'background-color': result.copyStateColor }" 
              [cdkCopyToClipboard]="result.short_link" 
              (click)="onClick(i)">[enter image description here][1]
        {{ result.copyStateText }}
      </button>
    </div>
  </div>

现在像这样调用你的函数

onClick(idx) {
  this.Links[idx].copyStateText = 'Copied!';
  this.Links[idx].copyStateColor = 'hsl(258, 40%, 30%)';

  setTimeout(() => {
    this.Links[idx].copyStateText = 'Copy';
    this.Links[idx].copyStateColor = '';
  }, 5000);
}

我认为您应该考虑一种不同的方法来解决这种情况。

<div class="result" *ngFor="let result of Links; index as i">
  <p class="original_link">{{ result.original_link }}</p>

  <div class="new-link">
    <p>{{ result.short_link }}</p>
    <button
      [ngClass]="{'touched': clickedLink?.short_link === result.short_link}"
      (click)="onClick(i)"
    >
      {{ (clickedLink?.short_link === result.short_link)? 'copied': 'copy' }}
    </button>
  </div>
</div>

然后在组件文件中:

 clickedLink;
  onClick(i) {
    this.clickedLink = this.Links[i];
    setTimeout(() => {
      this.clickedLink = null;
    }, 5000);
  }

并在 css 中添加以下内容 class :

.touched {
  background-color: hsl(258, 40%, 30%);
}

这是一个工作示例:

Working demo