美文网首页
vue中监听信息详情(表单详情)

vue中监听信息详情(表单详情)

作者: 理想休想幻想 | 来源:发表于2019-10-11 17:42 被阅读0次

使用场景:对某个对象的详情进行编辑时,对数据的监听开标记修改的信息与对象原本具有的信息是否相同,从而控制更新的按钮是否为禁用状态(与原本信息一致时,按钮状态为禁用,反之,按钮则进行相关操作)
主要思路:请求接口获取详情时,同时存储两个相同的值,一个用于数据的渲染,一个用于保存原本的信息,通过渲染的数据的改变与原本的数据进行对比,从而判断出是否发生改变。
注意:deep监听使用过多会对性能产生影响,慎重使用,该方法是目前的暂时解决思路,希望能吸纳各方的精华,不断优化。请吐槽!!!

1、HTML

<el-button
  :disabled="!isChanged"
  type="primary"
  @click="onSubmit"
>
    更新
</el-button>

1、JavaScript

<script>
export default {
  data() {
      return {
        roleInfoForm: {
          roleId: this.roleId,
          roleName: '',
          createdTime: '',
          notification: [],
          codeRepo: [],
          ci: [],
          cd: [],
          sonar: [],
          unitTest: [],
          review: [],
          pipeline: []
        },
      oldRoleInfoForm: {}, // 保存角色原本信息
      isChanged: false, // 标记角色信息是否变化
  },
  watch: {
      roleInfoForm: {
      handler(newV, oldV) {
        // 存储改变的值 对应的key
        const is_changed_key_arr = []
        // 遍历表单 对比值
        _.forIn(this.oldRoleInfoForm, function (value, key) {
          const value_type = typeof (newV[key])

          /**
           * 判断角色详情改变的是功能模块的权限 or 其他基本信息,如角色名称
           * 权限信息的数据结构为数组即object
           * 对比新旧值是否相等,来判断角色信息是否变化
           * 1.权限发生改变:使用_.isEqual比较数组是否相等
           * 2.基本信息发生改变:直接使用===判断
           * 3.以上二者情况,只要与角色原本所具有的详情信息不一样都认为是发生变化,发生变化则把发生变化的对象字段标记入is_changed_key_arr
           * 4.最后对标记发生改变的的数组,是否有值,有则发生改变,否则,无改变
           */
          if (value_type === 'object') {
            // 对更新的模块的权限数组值进行排序——为了对应后台返回的顺序
            const new_V = _.sortedUniq(newV[key]).sort()
            // 对比改变的模块的权限 二者是否相等,相等则标记变化的模块
            if (!_.isEqual(new_V, value)) {
              is_changed_key_arr.push(key)
            }
          } else {
            if (newV[key] !== value) {
              is_changed_key_arr.push(key)
            }
          }
        })
       /** 
        * 存储标记改变的数组是否存在发生改变的对象字段
        */
        if (is_changed_key_arr.length) {
          this.isChanged = true // 存在变化
        } else {
          this.isChanged = false // 与原值一致
        }
        console.log('role permission is changed?:', this.isChanged)
      },
      deep: true
    }
  },
  created() {
    this.getRoleInfo() // 获取单个角色信息
  },
  methods: {
      // 获取单个角色的信息,包括权限
    getRoleInfo() {
      if (this.roleId) {
        getRoleInfo(this.currentProjectId, this.roleId).then((res) => {
          this.roleInfoForm = res
          this.oldRoleInfoForm = res
          console.log('role-info', this.roleInfoForm)
        }).catch((err) => {
          console.log('获取单个角色的信息失败:', err)
        })
      }
    }
  }
}
</script>

3、效果

1.未修改信息前


修改信息前.jpg
  1. 修改信息后


    修改信息后.jpg

相关文章

网友评论

      本文标题:vue中监听信息详情(表单详情)

      本文链接:https://www.haomeiwen.com/subject/dzlxmctx.html