关于element-ui的blur事件失效,select的blur的bug,以及row在@blur延迟的解决

本文探讨了在Vue中遇到的blur事件失效问题,提出通过添加`capture`和`native`修饰符确保事件在元素失去焦点时正确触发。同时,针对blur事件延迟执行导致的数据获取错误,使用Promise的sleep函数实现延迟处理,确保在正确的时间获取到所需数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、blur事件失效

  • 这个blur的生效十分有问题,很多时候都无效,偶尔点击元素内部以及选项的时候突然就生效了
<el-select @blur="handleBlur">
</el-select>

二、使用nativecaptureblur生效

  • 虽然点击元素内部还是会让blur生效(点开选项隐藏选项的时候生效,但是这能够确保点击元素后,在光标出去时能够生效(而这也足够了)。
@blur.capture.native="handleBlur(row)"
  • capture是添加事件监听中的捕获
  • addEventListener(<event-name>, <callback>, <use-capture>);

三、关于row,在@blur延迟的问题

  • 直接使用的时候,handleBlur每次都是获取row的上一条数据
handleBlur(row) {
        if(!Named.checkAttrCodeNum(row.columnsCode.length)) this.$refs.type.focus()
      }
  • 于是想到了js中的sleep延迟,代码就变成了这样来解决
sleep(time) {
        return new Promise(resolve => setTimeout(resolve, time));
},
handleBlur(row) {
         this.sleep(100).then(() => {
            console.log('handleBlur', row.columnsCode.length);
            if(!Named.checkAttrCodeNum(row.columnsCode.length)) this.$refs.type.focus()
	})


}

到这里就解决了。(这里主要解决的是要给选择器做数据检查,有错误时不让他离开)

<el-dialog :visible.sync="pageModel.pageInfo.formConfig.isShow" :close-on-click-modal="false" width="50%"> <span slot="title" class="dialog-header">{{ pageModel.pageInfo.formConfig.dialogTitle }}</span> <el-form :rules="formRules" :model="pageModel.form" label-width="120px" size="small"> <el-row :gutter="24"> <el-col :span="11"> <el-form-item label="姓名" prop="policeName" class="content"> <el-input v-model.trim="pageModel.form.policeName" class="w100Percent" :disabled="pageModel.pageInfo.formConfig.type == '2' " /> </el-form-item> </el-col> <el-col :span="11" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="性别" prop="" class="content"> <el-select v-model="pageModel.form.sex" placeholder="请选择" style="width: 100%" class="w100Percent" :disabled="pageModel.pageInfo.formConfig.type == '2' "> <el-option v-for="(item, index) in pageModel.pageInfo .sexType" :key="index" :label="item.dictLabel" :value="item.dictValue"> </el-option> </el-select> </el-form-item> </el-col> <el-col :span="11" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="身份证号" prop="" class="content"> <el-input v-model="pageModel.form.idCard" class="w100Percent" :disabled="pageModel.pageInfo.formConfig.type == '2' " /> </el-form-item> </el-col> <el-col :span="11"> <el-form-item label="所属单位" prop="deptId" class="content"> <el-cascader :options="pageModel.listDept" v-model="pageModel.form.deptId" :props="{ children: 'children', label: 'deptName', value: 'deptId', checkStrictly: true, }" style="width: 100%" @change="changeHandel" :disabled="pageModel.pageInfo.formConfig.type == '2' " clearable /> </el-form-item> </el-col> <el-col :span="11"> <el-form-item label="警号" prop="policeCode" class="content"> <el-input v-model="pageModel.form.policeCode" class="w100Percent" :disabled="pageModel.pageInfo.formConfig.type == '2' " onkeyup="this.value=this.value.replace(/[^\w_]/g,'')" /> </el-form-item> </el-col> <el-col :span="11"> <el-form-item label="警种" prop="policeType" class="content"> <el-input v-model="pageModel.form.policeType" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="11"> <el-form-item label="接入方式" prop="" class="content"> <el-select v-model="pageModel.form.pattern" placeholder="请选择" style="width: 100%" :disabled="pageModel.pageInfo.formConfig.type == '2' "> <el-option v-for="(item, index) in pageModel.pageInfo .type" :key="index" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> </el-col> <el-col :span="11"> <el-form-item label="单位信息" prop="" class="content"> <el-input v-model="pageModel.form.shortName" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="11" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="职务" prop="" class="content"> <el-input v-model="pageModel.form.post" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="11" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="手机号" prop="" class="content"> <el-input v-model="pageModel.form.phone" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="11" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="邮箱" prop="" class="content"> <el-input v-model="pageModel.form.email" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="24" v-if="pageModel.pageInfo.environmentShow === true"> <!-- :disabled="" --> <el-form-item label="头像" prop="" class="content"> <img class="tx" v-if="pageModel.pageInfo.formConfig.type == '2'" :src="pageModel.form.userPic" alt="" /> <el-upload class="upload-demo" action="" v-else v-model="pageModel.form.userPic" :http-request="uploadActionHandle" :before-upload="beforeAvatarUpload" :before-remove="beforeDeleteImage" :on-remove="deleteImageHandel" :file-list="pageModel.pageInfo.imageList" list-type="picture"> <el-button size="small" type="primary">点击上传 </el-button> </el-upload> </el-form-item> </el-col> <el-col :span="24" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="备注" prop="" class="content"> <el-input v-model="pageModel.form.remark" :disabled="pageModel.pageInfo.formConfig.type == '2' " type="textarea" :rows="3" class="w100Percent" /> </el-form-item> </el-col> </el-row> </el-form> <div class="mgt15" style="text-align: center"> <el-button class="mgl18" @click="pageModel.pageInfo.formConfig.isShow = false" size="small">取消 </el-button> <el-button type="primary" size="small" @click="submitHandle">保存 </el-button> </div> </el-dialog>为什么输入姓名是汉字,会在下方出现空白,检查发现这里什么都没有,还有选择 <el-cascader :options="pageModel.listDept" v-model="pageModel.form.deptId" :props="{ children: 'children', label: 'deptName', value: 'deptId', checkStrictly: true, }" style="width: 100%" @change="changeHandel" :disabled="pageModel.pageInfo.formConfig.type == '2' " clearable />之后也会有空白
最新发布
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值