element-ui下拉輸入框+resetFields無法回顯的問題解決
描述
第一次進(jìn)入頁面,不做任何操作,點擊重置按鈕,再進(jìn)行下拉選擇,輸入框并不能回顯數(shù)據(jù),點擊搜索后,選中的數(shù)據(jù)就能顯示出來。
重置代碼,resetForm的底層用的是表單的resetFields。
resetFields的作用:對整個表單進(jìn)行重置,將所有字段重置為初始值(而不是設(shè)置為空值)并移除校驗結(jié)果
注意:一定要加上prop,否則無法清除
// 重置按鈕操作 resetQuery: _.debounce(function () { //重置表單 this.resetForm("queryForm"); //搜索 this.handleQuery(); }, 500),
原因
表單綁定的是搜索的對象內(nèi)容,而表單的內(nèi)容使用的是v-model來綁定,如果沒給表單內(nèi)容初始值,那么綁定的內(nèi)容就不是響應(yīng)式,打印出來也可以看見。所以就會出現(xiàn)搜索后才會回顯選中的內(nèi)容。
這時候就有兩種解決方法
- 給表單初始值,讓它變成響應(yīng)式,但是如果表單內(nèi)容有100個的話,得一個個加。
- 清空的時候,不必使用表單的清除屬性resetField,而是使用封裝好的清空對象方法。
問題重現(xiàn)
這里只給了請假類型初始值,而未給請假方式初始值。
<template> <div style="margin-top: 100px"> <el-form :model="form" ref="ruleForm" label-width="100px" class="demo-ruleForm" > <el-form-item label="請假類型" prop="leaveType"> <el-select v-model="form.leaveType" placeholder="請選擇請假類型"> <el-option label="事假" value="1"></el-option> <el-option label="病假" value="2"></el-option> </el-select> </el-form-item> <el-form-item label="請假方式" prop="leaveWay"> <el-select v-model="form.leaveWay" placeholder="請選擇請假方式"> <el-option label="單次請假" value="1"></el-option> <el-option label="長期請假" value="2"></el-option> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('ruleForm')" >確定</el-button > <el-button @click="resetForm('ruleForm')">重置</el-button> </el-form-item> </el-form> </div> </template> <script> export default { data() { return { form: { leaveType: "", }, }; }, methods: { resetForm(formName) { console.log("form", this.form); this.$refs[formName].resetFields(); }, }, }; </script> <style lang="scss" scoped></style>
解決方案
方法一
給表單初始值,讓它變成響應(yīng)式,可以很明顯地看到表單的初始化內(nèi)容,都有響應(yīng)式。
form: { leaveType: "", leaveWay: "", },
缺點是需要一個個加,很費時間。
方法二
不使用表單的resetFields清空表單,而是使用清空對象的cleanObject方法。
<template> <div style="margin-top: 100px"> <el-form :model="form" ref="ruleForm" label-width="100px" class="demo-ruleForm" > <el-form-item label="請假類型" prop="leaveType"> <el-select v-model="form.leaveType" placeholder="請選擇請假類型"> <el-option label="事假" value="1"></el-option> <el-option label="病假" value="2"></el-option> </el-select> </el-form-item> <el-form-item label="請假方式" prop="leaveWay"> <el-select v-model="form.leaveWay" placeholder="請選擇請假方式"> <el-option label="單次請假" value="1"></el-option> <el-option label="長期請假" value="2"></el-option> </el-select> </el-form-item> <el-form-item> <el-button type="primary">確定</el-button> <el-button @click="resetForm(form)">重置</el-button> </el-form-item> </el-form> </div> </template> <script> export default { data() { return { form: {}, }; }, methods: { resetForm(formName) { this.cleanObject(formName); }, cleanObject(obj) { // 判斷對象是否為非對象或null if (typeof obj !== "object" || obj === null) { return obj; } // 判斷對象是否為數(shù)組 if (Array.isArray(obj)) { // 遞歸處理數(shù)組中的每個元素 return obj.map((item) => this.cleanObject(item)); } // 如果是對象,則遍歷其屬性 for (const key in obj) { // 判斷值是否為數(shù)組 if (Array.isArray(obj[key])) { // 如果是數(shù)組,則將其置為空數(shù)組 obj[key] = []; } else { // 遞歸處理對象中的每個值 obj[key] = this.cleanObject(obj[key]); } } }, }, }; </script> <style lang="scss" scoped></style>
總結(jié)
實際場景用方法二會比較好點,如果有100個下拉框,給初始值的話,那你就要給100個內(nèi)容進(jìn)行初始化,很浪費時間。在vue3中也存在這樣的情況,不知道這是不是resetFields遺留下來的bug,還需要看一下resetFields的源碼。具體的原理還需要大家在評論區(qū)進(jìn)行補(bǔ)充,附上vue3試驗的代碼。
<template> <el-form :model="form" ref="form" label-width="100px" class="demo-ruleForm"> <el-form-item label="請假類型" prop="leaveType"> <el-select v-model="form.leaveType" placeholder="請選擇請假類型"> <el-option label="事假" value="1"></el-option> <el-option label="病假" value="2"></el-option> </el-select> </el-form-item> <el-form-item label="請假方式" prop="leaveWay"> <el-select v-model="form.leaveWay" placeholder="請選擇請假方式"> <el-option label="單次請假" value="1"></el-option> <el-option label="長期請假" value="2"></el-option> </el-select> </el-form-item> <el-form-item> <el-button type="primary">確定</el-button> <el-button @click="resetForm(form)">重置</el-button> </el-form-item> </el-form> </template> <script setup> import { ref } from "vue"; const form = ref({}); const resetForm = (formEl) => { if (!formEl) return; formEl.resetFields(); }; </script>
到此這篇關(guān)于element-ui下拉輸入框+resetFields無法回顯的問題解決的文章就介紹到這了,更多相關(guān)element resetFields無法回顯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!