#独家
vue使用watch监听表单数据变更,如何触发表单重新渲染?

2023-04-12 0 2,540

的形式,动态增减表单,如图所示。想实现一组中的两个下拉框的互斥关系。比如类型选择1 ,则禁用 等级 这一项。

当前实现方法:在数据中加一个isLock字段,默认为 false 。使用 watch 监听,当类型选择1 时,设置 isLock字段为 true。并在 等级 下拉选项绑定 :disabled="item.isLock" 属性。

问题:

  1. watch 监听 设置 isLock字段为 true后,如何触发页面更新?this.$forceUpdate() 无效
  2. 这种思路是否能满足需求?

一、数据结构:

      model: {
        typeId: '',
        partId: '',
        partName: '模块名称',
        projects: [
          {
            isLock: false,
            name: '名称',
            type: '类型',
            standard: '规格',
            level: '等级',
          }
        ]
      },

二、新增方法:

    addItem() {
      this.model.projects.push({
            isLock: false,
            name: '',
            type: '',
            standard: '',
            level: '',
      })
    },

三、watch监听:

watch: {
    model: {
      handler(newName, oldName) {
        for (let i = 0; i < this.model.projects.length; i++) {
          if (this.model.projects[i].projectType === '1') {
            this.model.projects[i].isLock = true
          }
        }
      },
      deep: true
    }
}

四、页面结构:

      <z-form
        ref="modelDialog"
        :model="model"
        :label-width="100"
        label-position="left"
      >
        <z-row>
          <z-col span="8">
            <z-form-item label="模块名称">
              <z-input
                v-model="model.partName"
                :maxlength="40"
                placeholder="请输入..."
                clearable
              />
            </z-form-item>
          </z-col>
        </z-row>
        <div v-for="(item, index) in model.projects" :key="index">
          <z-edit-panel class="m-t-15 p-t-20">
            <z-row>
              <z-col span="8">
                <z-form-item label="类型">
                  <z-select
                    v-model="item.type"
                    placeholder="请选择..."
                    @on-change="handleChange"
                  >
                    <z-option
                      v-for="item in typeName"
                      :value="item.value"
                      :key="item.value"
                      >{{ item.label }}</z-option
                    >
                  </z-select>
                </z-form-item>
              </z-col>
            </z-row>
            <z-row>
              <z-col span="8">
                <z-form-item label="名称">
                  <z-input
                    v-model="item.name"
                    :maxlength="40"
                    placeholder="请输入..."
                    clearable
                  />
                </z-form-item>
              </z-col>
            </z-row>
            <z-row>
              <z-col span="9">
                <z-form-item label="等级">
                  <z-select v-model="item.level" placeholder="请选择...">
                    <z-option
                      v-for="item in projectLevelOption"
                      :value="item.value"
                      :key="item.value"
                      :disabled="item.isLock"    // 禁用
                      >{{ item.label }}</z-option
                    >
                  </z-select>
                </z-form-item>
              </z-col>
              <z-col span="8">
                <z-form-item label="规格">
                  <z-select
                    v-model="item.standard"
                    placeholder="请选择..."
                  >
                    <z-option
                      v-for="item in checkFunction"
                      :value="item.value"
                      :key="item.value"
                      >{{ item.label }}</z-option
                    >
                  </z-select>
                </z-form-item>
              </z-col>
            </z-row>
            <z-row>
              <z-col span="10">
                <z-form-item label="标准">
                  <z-input
                    v-model="item.projectStandard"
                    type="textarea"
                    :autosize="{ minRows: 3, maxRows: 5 }"
                    placeholder="Please enter the detailed address"
                    class="standard-textarea"
                  ></z-input>
                </z-form-item>
              </z-col>
              <z-col span="4">
                <z-form-item
                  class="standardTextarea"
                  v-if="index === model.projects.length - 1"
                >
                  <z-button
                    type="primary"
                    size="small"
                    icon="plus-round"
                    @click="addItem"
                    >添加</z-button
                  >
                </z-form-item>
                <z-form-item
                  class="standardTextarea"
                  v-if="index === model.projects.length - 1"
                >
                  <z-button
                    type="error"
                    size="small"
                    icon="minus-round"
                    @click="delItem"
                    >删除</z-button
                  >
                </z-form-item>
              </z-col>
            </z-row>
          </z-edit-panel>
        </div>
      </z-form>

五、select @on-change 事件 this.$forceUpdate()不更新:

    handleChange(val, index) {
      for (let i = 0; i < this.model.projects.length; i++) {
        if (this.model.projects[i].projectType === '1') {
          this.model.projects[i].isLock = true
        }
      }
      this.$forceUpdate()
    }

低级错误 :disabled="item.isLock" 应该写在 z-select 标签内。

Vue中可以使用$forceUpdate()方法强制组件重新渲染。在watch的回调函数中,可以调用$forceUpdate()方法触发组件重新渲染,从而更新表单数据。例如:

watch: {
  formData: function() {
    // 数据变更时强制组件重新渲染
    this.$forceUpdate();
  }
}
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 vue使用watch监听表单数据变更,如何触发表单重新渲染? https://www.jkxiazai.com/1505.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务