天天看點

elementui實作表格單選功能

elementui實作表格單選功能
大家好,我是雄雄,歡迎關注微信公衆号:雄雄的小課堂

前言

需求是這樣的:使用者單擊購買産品的按鈕時,會出現一個産品的清單,但是呢隻能買一種産品,暫時不可以多選。效果如下所示:

elementui實作表格單選功能

原來做的是,單擊前面的單選按鈕,後面的數量表單放開禁用,可以選擇和填寫;現在需要改成,直接點選某一行,則改行自動選中,當然數量表單也放開可供使用者直接輸入和填寫。

實作方法

架構原來用的是​

​avue​

​寫的,這個架構,确實好用,可以提高開發效率,很少的代碼實作很多的功能,但這也是個缺點,代碼是少了,實作的功能也确實多,不過你要單個實作某個子功能?那可真的是太難為了……

​avue​

​​也有表格的單選功能,還有例子呢,隻是我加上之後沒有效果。。。不知道是我代碼的問題還是官方已經不支援了,不想在去研究了,直接換成了​

​element ui​

​去實作了。

​html​

​代碼:

<div style="margin:-20px 20px 20px 0;line-height: 40px;float: right">
        <span style="font-size: 18px;color:#303133">目前餘額:</span>
        <span style="font-size: 18px;color:#F56C6C">¥{{currentBalance}}</span>
      </div>

  <el-table
        ref="cruds"
        :query="query"
        :data="cardData"
        highlight-current-row
        @row-click="cardRowClick"
        @current-change="handleCurrentChange"
      >
          <el-table-column label="選擇" width="80">
            <template slot-scope="{ row }">
              <el-radio :label="row.code" v-model="cardForm.code" @change="cardRadionChange(row)"><span></span></el-radio>
            </template>
          </el-table-column>
          <el-table-column label="類型" align="center" prop="typeName" />
          <el-table-column label="名稱" align="center" prop="name" />
          <el-table-column label="單價(元)" align="center" prop="price" />
          <el-table-column label="數量" align="center">
                <template slot-scope="{ row }">
                  <el-input-number
                    :disabled="checked != row.code"
                    size="small"
                    v-model="row.num"
                    :value="0"
                    :min="0"
                    @change="cardNumberChange(row)"
                  ></el-input-number>
                </template>
              </el-table-column>
          <el-table-column label="總價" align="center">
              <template slot-scope="{ row }">
                {{ row.num * row.price }}
              </template>
            </el-table-column>

      </el-table>

      <span slot="footer" class="dialog-footer avue-dialog__footer">
        <el-button @click="sailCardDialog = false">取 消</el-button>
        <el-button type="primary" @click="getSailCards" v-loading="buyLoading">
          申 購
        </el-button>
      </span>      

​data​

​中的變量:

/*目前使用者的餘額*/
      currentBalance:0.00,
      cardData: [],
       //單選是否選中
      checked: null,
      /*服務卡的表單*/
      cardForm:{
        cardid:0,
        typeName:'',
        name:'',
        price:'',
        num:1,
        totalPrice:0,
        code:'',
        days:'',
      },      

​methods​

​中的方法:

/*商品清單,行的單擊事件*/
    cardRowClick(row){
      this.cardForm.code = row.code;
      this.checked = row.code;
    },

     /*數量的改變事件*/
    cardNumberChange(row){
      this.cardForm.code = row.code;
      this.cardForm.name = row.name;
      this.cardForm.price = row.price;
      this.cardForm.days = row.days;
      this.cardForm.typeName = row.typeName;
      this.cardForm.totalPrice = row.price * row.num;
      this.cardForm.num = row.num;
    },
    /*單選按鈕的改變事件*/
    cardRadionChange(row) {
      this.checked = row.code;
    },


    //申請購買的按鈕(點選之後驗出來商品的清單框)
    getSailCard(row) {
      this.cardForm = {};
      this.checked = null;
      this.payorderList = row;
      this.loadCardList(this.page);
      this.sailCardDialog = true;
      //擷取目前使用者餘額
      getMyBalance().then((res) => {
        this.currentBalance = res.data.balance;
      });
    },

    //去購買的操作
    getSailCards() {

     if (this.cardForm.num == undefined || this.cardForm.num == 0) {
        this.$message({
          message: "請填寫購買數量",
          type: "warning",
        });
        return;
      }
     //如果餘額不足
     if(this.currentBalance<this.cardForm.totalPrice){
       this.$message({
         message: "目前餘額不足,請及時重制~",
         type: "warning",
       });
       //跳轉到充值頁面
       this.$router.push({
         path: "/capital/invest"
       })
       return;
     }

     this.isPayDialog = true;
    },

   //跳轉到充值頁面
       this.$router.push({
         path: "/capital/invest"
       })
       return;
     }

     this.isPayDialog = true;
    },