vue项目自定义复选框、引用vuetify组件相关的一系列问题汇总、日期组件、表格组件

本文探讨了Vue.js中单选框、复选框及时间组件的数据同步问题,通过示例代码展示了如何使用$set方法确保数据更新,并处理了计算属性未实时更新的情况。同时,分享了解决循环生成的Vuetify日期组件导致多个日期弹窗问题的解决方案,以及自定义Vuetify表格页脚内容的方法。
摘要由CSDN通过智能技术生成

图例:

一、

<template>
<div class="moreSelect">
            <div
              class="moreSelectLi"
              v-for="(item, index) in riskDataList"
              :key="index"
              :class="{ liActive: checkedGroup.includes(item.value) }"
              @click="selChange(item.value)"
            >
              <div
                class="picBg"
                :class="{ picBgActive: checkedGroup.includes(item.value) }"
              ></div>
              <div>{{ item.label }}</div>
            </div>
          </div>
</template>
<script>
data: () => ({
riskDataList: [
      {
        value: 2,
        label: '低风险'
      },
      {
        value: 3,
        label: '中风险'
      },
      {
        value: 4,
        label: '高风险'
      },
      {
        value: 5,
        label: '极高风险'
      }
    ],
checkedGroup: [2]
}),
methods:{
selChange(value) {
      if (this.checkedGroup.includes(value)) {
        if (this.checkedGroup.length === 1) {
          return
        }
        this.checkedGroup = this.checkedGroup.filter(function (ele) {
          return ele !== value
        })
      } else {
        this.checkedGroup.push(value)
      }
    },
}
</script>
<style lang="less" scoped>
.moreSelect {
      display: flex;
      margin-top: 16px;
      margin-bottom: 24px;
      .moreSelectLi {
        width: 72px;
        height: 32px;
        border-radius: 2px;
        border: 1px solid rgba(0, 0, 0, 0.15);
        font-size: 12px;
        color: #595959;
        margin-right: 12px;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        .picBg {
          width: 12px;
          height: 12px;
          border: 1px solid #dbd6d1;
          margin-right: 6px;
          background: url("~@/assets/unselected.png") center center no-repeat;
          background-size: 100% 100%;
        }
        .picBgActive {
          width: 12px;
          height: 12px;
          border: 1px solid #0b41cd;
          margin-right: 6px;
          background: url("~@/assets/pitchon.png") center center no-repeat;
          background-size: 100% 100%;
        }
      }
      .moreSelectLi:nth-last-child(1) {
        width: 84px;
      }
      .liActive {
        border: 1px solid #0b41cd;
      }
    }
</style>

附加一段ui组件单选框、复选框、时间组件有时候数据变化未实时更新问题,以下问题与上面无关

采用$set方法进行更新

this.questInfoOne.forEach((item) => {
                if (item.answerContent !== undefined) {
                  item.answerContent = JSON.parse(item.answerContent)
                } else {
                  item.answerContent = this.$set(item, 'answerContent', JSON.parse('[]'))
 // item.answerContent = this.$set(item, 'answerContent', '') 
                }
            })

computed指令未重新set问题

computed: {
    dateOneFlag: {
      get: function () {
        return this.editDateFlag()  
        //指令中一般不可以进行逻辑判断,所以将逻辑写在下面methods方法中
      },
      set: function (v) {
        this.dataCompuFlag = v
      }
    }
  },
data: () => ({
dataCompuFlag: false
}),
methods:{
editDateFlag() {
      if (this.tabsValue === 0) {
        if (this.intoRiskValue.length === 2) {
          this.dataCompuFlag = false
        } else if (this.intoRiskValue.length === 1) {
          this.dataCompuFlag = true
        }
      }
      return this.dataCompuFlag
    }
}

vue项目中,一个页面循环生成多个vuetify日期组件,页面上会弹出多个日期框,解决绑定questMenu1为[]

<div
                        class="formQuestionData"
                        style="position: relative"
                        id="dateAllOne"  //滚动滚动条,让组件框跟随页面一起移动
                      >
                        <v-row cols="12" style="width: 410px">
                          <v-col cols="12">
                            <v-menu
                              ref="newMenu"
                              v-model="questMenu1[item1.titleId]"  //questMenu1为数组
                              :close-on-content-click="false"
                              transition="scale-transition"
                              offset-y
                              min-width="auto"
                              attach="#dateAllOne" //滚动滚动条,让组件框跟随页面一起移动
                            >
                              <template v-slot:activator="{ on, attrs }">
                                <v-text-field
                                  v-model.trim="item1.answerContent"
                                  label=""
                                  prepend-inner-icon="mdi-calendar-month-outline"
                                  readonly
                                  v-bind="attrs"
                                  v-on="on"
                                  dense
                                  outlined
                                  hide-details="auto"
                                ></v-text-field>
                              </template>
                              <v-date-picker
                                type="date"
                                no-title
                                v-model="item1.answerContent"
                                @input="questMenu1[item1.titleId] = false"
                              >
                              </v-date-picker>
                            </v-menu>
                          </v-col>
                        </v-row>
                      </div>

data: () => ({
questMenu1:[]
})

vuetify组件中表格页脚内容自定义

 

<v-data-table
          :headers="visitDataHead"  //表头
          :items="planDataList"   //表格内容
          :items-per-page="10"
          class="tableAllStyl"
          :options.sync="options"
          :server-items-length="total"
          :footer-props="{
            showFirstLastPage: true,
            firstIcon: 'mdi-arrow-collapse-left',
            lastIcon: 'mdi-arrow-collapse-right',
            prevIcon: 'mdi-minus',
            nextIcon: 'mdi-plus',
            'items-per-page-options': [10, 20, 50],
          }"  //页脚内容自定义
          @update:options="updateOptions"
          :loading="isData"
        >
          <template v-slot:[`item.detail`]="{ item }">  //自定义字段内容
            <div style="display: flex; align-items: center">
              <v-btn
                text
                style="padding: 0 4px; min-width: 0px"
                color="#0B41CD"
                @click="editChange(item)">
                查看
              </v-btn>
            </div>
          </template>
        </v-data-table>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值