我有两个组件来设置按钮,在调用按钮组件的地方,有一个v-for来循环其他项.现在,我希望最后一个内的按钮或如果只生成一个则被禁用.

这是我的代码

<template>
  <div class="clickable-text" @click="() => !disabled && onClick()">
    <div :class="className">{{ text }}</div>
    <IconSpinner v-if="loading" class="ml-1" />
  </div>
</template>

<script lang="ts">
import { Vue, Component, Prop } from 'vue-property-decorator';
@Component({})
export default class ClickableText extends Vue {
  @Prop({ default: true }) text: string;
  @Prop({ default: 'default' }) disabled: boolean;
  @Prop() classes: string;
  @Prop({ default: true }) clickable: boolean;
  @Prop({ default: () => {} }) onClick: () => void;
  @Prop({}) loading: boolean;

  get className() {
    return {
      disabled: this.disabled,
      [this.classes]: this.classes,
      clickable: this.clickable && !this.disabled,
    };
  }
}
</script>

上面的组件是在里面使用的

<component :is="item[header.value].component" v-bind="item[header.value].props" />

,{{text}} prop位于v-bind=" title[header.Value].props"中

<template>
  <div>
    <table>
      <thead>
        <tr>
          <th v-for="header in headers" :key="header.value">
            <div @click="headerClicked(header)">
              {{ header.text }}
            </div>
          </th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(item, n) in items" :key="n" data-qa="row" :id="item.id ? item.id.value : n">
          <td v-for="header in headers" :key="header.value" :data-qa="header.value">
            <div :class="itemClass(item, header)" @click="itemClicked(item, header)">
              <div v-if="item[header.value] && item[header.value].value">{{ item[header.value].value }}</div>
              <div v-else>
                <component :is="item[header.value].component" v-bind="item[header.value].props" />
              </div>
            </div>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script lang="ts">
import { Vue, Component, Prop } from 'vue-property-decorator';
import { TableHeader, TableItem, TablePagination, AppTableItemClick } from './interfaces';

@Component
export default class AppTable extends Vue {
  @Prop() headers: TableHeader[];
  @Prop() items: TableItem[];
  @Prop() pagination?: TablePagination;

  itemClass(item: TableItem, header: TableHeader) {
    const isClickable = item[header.value]?.clickable;
    return { link: isClickable, clickable: isClickable };
  }

  headerClicked(header: TableHeader) {
    if (header.sortable) {
      this.$emit('headerClicked', header);
    }
  }

  itemClicked(item: TableItem, header: TableHeader): AppTableItemClick | undefined {
    const headerName = header.value;
    if (item[headerName]?.clickable) {
      const returnValue = { item, id: headerName };
      this.$emit('itemClicked', returnValue);
      item[headerName]?.onClick?.();
      return returnValue;
    }
  }
}
</script>

循环的结果是这样的,如果隐藏联系人按钮是唯一的项或最后一项,我想禁用它.

enter image description here

推荐答案

只需将disabledprops 添加到component,并将其分配给函数的返回,判断index是否是items数组中的最后一个索引.

<tbody>
        <tr v-for="(item, index) in items" :key="index" data-qa="row" :id="item.id ? item.id.value : index">
          <td v-for="header in headers" :key="header.value" :data-qa="header.value">
            <div :class="itemClass(item, header)" @click="itemClicked(item, header)">
              <div v-if="item[header.value] && item[header.value].value">{{ item[header.value].value }}</div>
              <div v-else>
                <!-- Add disabled property based on the condition -->
                <component :is="item[header.value].component" 
                           v-bind="item[header.value].props"
                           :disabled="isLastOrSingleItem(index)" />
              </div>
            </div>
          </td>
        </tr>
      </tbody>

定义一个名为isLastOrSingleItem的新方法来判断索引.


  isLastOrSingleItem(index: number): boolean {
    return index === this.items.length - 1 || this.items.length === 1;
  }

Javascript相关问答推荐

如何在react + react路由域名中使用DeliverBrowserRouter?

我的YouTube视频没有以html形式显示,以获取免费加密信号

foreach循环中的Typescript字符串索引

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

防止用户在selectizeInput中取消 Select 选项

为什么ngModel不能在最后一个版本的Angular 17上工作?'

Msgraph用户邀请自定义邮箱模板

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

将本机导航路由react 到导航栏中未列出的屏幕?

更改JSON中使用AJAX返回的图像的路径

使用GraphQL查询Uniswap的ETH价格

使用Promise.All并发解决时,每个promise 的线性时间增加?

如何在使用rhandsontable生成表时扩展数字输入验证?

与svg相反;S getPointAtLength(D)-我想要getLengthAtPoint(x,y)

在Java脚本中录制视频后看不到曲目

重新呈现-react -筛选数据过多

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';

有没有办法在R中创建一张具有多个色标的热图?

在Press Reaction本机和EXPO av上播放单个文件

将以前缓存的 Select 器与querySelector()一起使用