elementUI 的 input无法输入bug解决

1、出现bug的原因
        是因为数据层虽然改变了,但是并没有引起视图层的变化

2、解决方案

@input="forceUpdate($event)" //在input框上加输入事件

forceUpdate(e) {
this.$forceUpdate() 强制刷新
}

jeecg-boot框架前端写了个筛选组件:SearchBox.vue,测试人员发现输入框无法输入数据,经查是这个问题。

<template>
  <div>
    <el-form :inline="true" ref="searchForm" :model="formData" :label-width="labelWidth">
      <el-row style="display: flex;flex-wrap: wrap;">
        <template v-for="(item, index) in searchOptions">
          <el-col :xs="12" :sm="8" :md="8" :lg="6" :xl="4">
            <el-form-item :label="item.label" :prop="item.prop">
              <!-- 输入框 -->
              <template v-if="item.isInput && item.isInput == 1">
                <el-input style="width:100%;" :allowClear="true" placeholder="请输入" @input="forceUpdate($event)" v-model="formData[item.prop]" />
              </template>
              <!-- 选择框 -->
              <template v-if="item.isSelect && item.isSelect == 1">
                <el-select style="width:100%;" :disabled="item.disabled" filterable :clearable="item.isClearable != '0' " v-model="formData[item.prop]" placeholder="请选择" @change="val => { handleChange(val, item) }">
                  <el-option v-for="(el, i) in item.options" :key="i" :value="el.value" :label="el.name" />
                </el-select>
              </template>
              <!-- 树选择框 -->
              <template v-if="item.isTreeSelect && item.isTreeSelect == 1">
                <a-tree-select :allowClear="true" style="width:100%;" :replaceFields="item.replaceFields" :disabled="item.disabled" v-model="formData[item.prop]" placeholder="请选择" :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" :tree-data="item.options" @change="val => { handleChange(val, item) }" />
              </template>
              <!-- 时间选择 -->
              <template v-if="item.isDate && item.isDate == 1">
                <el-date-picker style="width:100%;" v-model="formData[item.prop]" :format="item.format" :value-format="item.valueFormat" :type="item.type" placeholder="请选择" />
              </template>
            </el-form-item>
          </el-col>
        </template>
        <!-- 查询重置按钮 -->
        <el-col :xs="12" :sm="8" :md="8" :lg="6" :xl="4" style="margin-left: auto;">
          <el-form-item label="" prop="" style="display: flex;justify-content: flex-end;">
            <div class="btn-group-s">
              <el-button type="primary" icon="el-icon-search" @click="onSearch(true)">查询</el-button>
              <el-button style="margin-left: 8px" @click="onSearch(false)">重置</el-button>
              <el-button v-for="(btn, idx) in extendBtn" :key="idx" :type="btn.type || 'primary'" style="margin-left: 8px" @click="btnClick(btn)">{{ btn.label }}</el-button>
            </div>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
  </div>
</template>
<script>
export default {
  props: {
    searchOptions: { type: Array, default: () => [] },
    extendBtn: { type: Array, default: () => [] },
    labelWidth: { type: String, default: '160px' },
  },
  components: {},
  data() {
    return {
      formData: {},
    }
  },
  mounted() {},
  computed: {},
  methods: {
    init() {
      this.searchOptions.map((i) => {
        if (i.defaultVal) {
          this.formData[i.prop] = i.defaultVal
        } else {
          this.formData[i.prop] = undefined
        }
      })
      this.$emit('onSearch', this.formData)
    },
    btnClick(btn) {
      this.$emit(btn.clickFn)
    },
    forceUpdate(e) {
      this.$forceUpdate()   //强制刷新
    },
    // 查询or重置
    onSearch(flag) {
      if (!flag) {
        this.formData = {}
        this.$refs.searchForm.resetFields()
        this.searchOptions.map((i) => {
          if (i.defaultVal) {
            this.formData[i.prop] = i.defaultVal
          } else {
            this.formData[i.prop] = undefined
          }
        })
        this.$forceUpdate()
      }
      this.$emit('onSearch', this.formData)
    },
    handleChange(value, obj) {
      this.formData = { ...this.formData, [obj.prop]: value }
      this.$emit('handleChange', value, obj)
    },
  },
}
</script>
<style lang="less" scoped>
@import '~@assets/less/normal.less';

/deep/.el-form-item {
  margin-bottom: 5px;
  width: 100%;
}
/deep/.el-form-item--mini .el-form-item__content {
  width: calc(100% - 140px);
}

.btn-group-s {
  height: 28px;
  display: flex;
  align-items: center;
  display: flex;
  justify-content: flex-end;
}
/deep/.ant-select-selection__rendered {
  line-height: 28px;
}
/deep/.ant-select-selection--single {
  height: 28px;
}
/deep/.ant-select {
  font-size: 12px;
}
</style>



posted @ 2024-09-26 14:12  雪莉06  阅读(503)  评论(0编辑  收藏  举报