前端工作总结03

1、includes()与indexOf()的结合使用解决删除否的情况。

因为我们的列表中有些会有签发signMark的值,有些没有,

我用map方法返回相应数组某些值,返回一些新数组,如果没有返回的是[undefined],此时我们的length为1,所以我们可以通过arr.indexOf(undefined)来反映是否有这个值,通过includes()来判断是否数组中是否有某些值。用map()方法,includes(),indexOf()三个结合使用判断。

其实includes()也可以顶替indexOf()进行使用,includes(undefined)也是可以使用,indexOf(undefined)>=0两个是一个意思。

 2. 解决内容过长 提示语显示不全的问题 2023/11/30

dev-bugfix

全局src/style/index.scss

.el-tooltip__popper {
  max-width: 300px;
}
把这个调大或者取消掉

3.出现一种情况就是提交业务审核的时候发现,有问题,控制台报错,一直走不下去。

看了下控制台出现的原因是因为fileUrl这个字段取不到,因为后端做了判断有提示语,所以我就进行了搜索,发现子组件里边有一个clearFile方法,初始化fileUrl的值付了一个null,但是我们在父组件判断的时候是按照''空的字符串进行判断的,所以出现了这个问题。

所以把fileUrl的值赋值为'' 就可以了。

4、子票区间显示问题 

if(rowData.billRange&&rowData.billRange.indexOf(",") != -1) {
     label = rowData.billRange.replace(/\,/g, "-")

}

 5、mixin案例1  为了进行获取相关的一些信息

import Api from '@api/modules/busiCenter'
export default {
  data() {
    return {
      boundUKeyType: '工商',
      boundUKeyList: [],
      boundAllUKeyList: [],
      usbKeyForms: {
        ukeyIssuingAuthority: 6,
        SerialNumber: '',
        SubjectCN: '',
        IssuerDN: ''
      },
      endorsedRecordStatus: [
        { code: 6, label: 'CFCA' }
      ]
    }
  },
  mounted() {
    this.getUkeyInfo()
  },
  methods: {
    bussinessDia(boundRecord) {
      if (boundRecord.remitterBankName && boundRecord.remitterBankName.indexOf('中信') >= 0) {
        this.boundUKeyType = 'cfca'
      } else if (boundRecord.remitterBankName && boundRecord.remitterBankName.indexOf('上海浦东') >= 0) {
        this.boundUKeyType = 'cfca'
      } else if (boundRecord.bankSource && boundRecord.bankSource.indexOf('CNCB') >= 0) {
        this.boundUKeyType = 'cfca'
      } else if (boundRecord.bankSource && boundRecord.bankSource.indexOf('SPD') >= 0) {
        this.boundUKeyType = 'cfca'
      } else if (boundRecord.bankSource && boundRecord.bankSource.indexOf('ICBC') >= 0) {
        this.boundUKeyType = '工商'
      // } else if (boundRecord.acceptorBankName && boundRecord.acceptorBankName.indexOf('中信') >= 0) {
      //   this.boundUKeyType = 'cfca'
      // } else if (boundRecord.acceptorBankName && boundRecord.acceptorBankName.indexOf('上海浦东') >= 0) {
      //   this.boundUKeyType = 'cfca'
      } else {
        this.boundUKeyType = '工商'
      }
      const boundUKeyList = []
      for (var i = 0; i < this.boundAllUKeyList.length; i++) {
        if (this.boundUKeyType == '工商' && this.boundAllUKeyList[i].ukeyIssuingAuthority == 1) {
          boundUKeyList.push(this.boundAllUKeyList[i])
        }
        if (this.boundUKeyType == 'cfca' && this.boundAllUKeyList[i].ukeyIssuingAuthority != 1) {
          if (this.boundAllUKeyList[i].serialNo) {
            boundUKeyList.push(this.boundAllUKeyList[i])
          }
        }
      }
      this.boundUKeyList = boundUKeyList
      // this.getUkeyInfo();
      this.boundUKeyDialog = true
    },
    getUkeyInfo() {
      Api.getUkeyInfo().then((resp) => {
        if (resp.code == 200) {
          const respdata = resp.data
          this.boundAllUKeyList = respdata
        }
      })
    },
    closeBoundUkey() {
      this.boundUKeyDialog = false
      this.doInit()
    },
    confirmBoundUkey() {
      if (this.boundUKeyType == 'cfca') {
        this.usbKeyDialog = true
        if (this.$refs.usbKeyForm) {
          this.$refs.usbKeyForm.clearform()
        }
      } else {
        this.usbKeyVarity()
      }
    }
  }
}

6、mixin案例2 判断这个盾是否有效

import Api from '@api/modules/busiCenter'
export default{
  data(){
    return {
      usbKeyDialog:false,
      boundUKeyDialog: false,
      dialogHTMLVisible: false
    }
  },
  methods:{
    dialogHTMLShow(){
      this.dialogHTMLVisible = true;
    },
    closeNotHasUkey(){
      this.dialogHTMLVisible = false;
    },
    usbKeyVarity(val){
      this.usbKeyDialog = false
      this.boundUKeyDialog = false
      // console.log(val);
      this.register()
    },
    async addUsbkey() {
      const varity={
        serialNo:this.usbKeyForms.SerialNumber, //序列号
        issuerDn:this.usbKeyForms.IssuerDN //颁发者DN
      }
      const resp = await Api.getUkeyVerify(varity)
      if(resp.code==200){
        const respdata=resp.data
        if(respdata.status=='0'){
          if(this.usbKeyForms.CSPName.indexOf('Ucan')>-1){
            const billData = this.multipleSelections[0];
            let source = '<?xml version="1.0" encoding="utf-8"?><T><D><M>'+
            '<k>人名称</k><v>'+ billData.remitterName+
            '</v></M><M><k>账号</k><v>'+ billData.remitterAcctNo+
            '</v></M><M><k>金额</k><v>'+ billData.billAmount+
            '</v></M><M><k>姓名</k><v>'+ billData.payeeName+
            '</v></M></D></T>'
            this.$refs.usbKeyForm.SignOnClick512(source);
          }else{
            this.usbKeyVarity();
          }
        }else if(respdata.status=='1'){
          this.$message.error('已过期,请使用其他')
        }else if(respdata.status=='2'){
          this.$message.error('已吊销,请使用其他')
        }else if(respdata.status=='3'){
          this.$message.error('匹配失败,请使用其他')
        }
        // this.usbKeyDialog = false
      }
    },
    usbKeyFormFn(val){
        this.usbKeyForms=JSON.parse(JSON.stringify(val))
        // this.usbKeyForms.ukeyIssuingAuthority=6
    },
  }
}

 7、退出登录清空vuex协议的缓存

methods: {
    ...mapActions({
      clearUserInfo: 'clearUserInfo'
      clearTreaty: 'clearTreaty'
    }),

    this.clearTreaty()

}



export default {
  state: {
    user: sessionStorage.getItem('user') && JSON.parse(sessionStorage.getItem('user')) || {},
    signStatus: sessionStorage.getItem('signStatus'),
    signXpStatus: sessionStorage.getItem('signXpStatus'),
    signZcStatus: sessionStorage.getItem('signZcStatus')
  },
  mutations: {
    saveUser(state, user) {
      state.user = user
      sessionStorage.setItem('user', JSON.stringify(user))
      sessionStorage.setItem('authorization', user.token)
    },
    signStatus(state, status) {
      state.signStatus = status
      sessionStorage.setItem('signStatus', status)
    },
    signXpStatus(state, status) {
      state.signXpStatus = status
      sessionStorage.setItem('signXpStatus', status)
    },
    signZcStatus(state, status) {
      state.signZcStatus = status
      sessionStorage.setItem('signZcStatus', status)
    },
    clearXy(state) {
      state.signStatus = ''
      state.signXpStatus = ''
      state.signZcStatus = ''
    }
  },
  actions: {
    clearUserInfo(context) {
      context.commit('saveUser', {})
    },
    clearTreaty(context) {
      context.commit('clearXy')
    },
    saveSignStatus(context, signStatus) {
      context.commit('signStatus', signStatus)
    },
    saveXpStatus(context, signStatus) {
      context.commit('signXpStatus', signStatus)
    },
    saveZcStatus(context, signStatus) {
      context.commit('signZcStatus', signStatus)
    }
  },
  getters: {
    getUser(state) {
      return state.user
    }
  }
}

8、全局使用mixin

我们常常会在src文件夹里边放入很多mixin,那么请大家思考一下,如果单组件单独引用,我们可以去做,如果全局呢?

第一步:main.js

import commonMixin from './mixin/commonMixin'
Vue.mixin(commonMixin)

 第二步:mixin里边建立这个js 文件

export default {
  methods: {
    showChangeIngAlert() {
      console.log('走这里吗?')
      const enterpriseInfo = JSON.parse(sessionStorage.getItem('enterpriseInfo')) || {companyDto: {}}
      const { updateStage } = enterpriseInfo.companyDto
      // updateStage 0---无事发生 1---提交待审核 2---审核通过(名称修改了) 3---信息认证 4---认证完成 5---审核不通过
      if(updateStage == '1') {
        this.$alert('变更审核中,暂时不能做该业务', '提示', {
          confirmButtonText: '确定',
          type: 'warning',
          center: true
        })
        return true
      }
      return false
    }
  }
}

第三步:在文件中直接使用

    // 提交复核
    applyClick() {
      if(this.showChangeIngAlert()) { return }
      if (this.multipleSelections.length > 1) {
        this.$message.error('只能选择一条数据')
      } else if (this.multipleSelections.length > 0) {
        this.$emit('applyClick', this.multipleSelections)
      } else {
        this.$message.error('请至少选择一条数据')
      }
    },

9、通过提交一直转圈 获取tradeInfoId 添加判断

问题是一个提交业务的按钮出现的,出现这个问题在于控制台报错,走不下去了,tradeInfoId,因为不存在这个键,怎么会不报错呢?

tradeInfoId: getMybjObj.tradeInfoDto.tradeInfoId || ''

看一行这个代码,如果没有值的时候就会出现错误

咱们更改一下

let tradeInfoId = ''
        if (getMybjObj.tradeInfoDto && getMybjObj.tradeInfoDto.tradeInfoId) {
          tradeInfoId = getMybjObj.tradeInfoDto.tradeInfoId
        } else {
          tradeInfoId = ''
        }


tradeInfoId: tradeInfoId

10、本地可以反显,但是线上就出现问题,问题如下:

TypeError: Cannot read properties of undefined (reading ‘replace‘)

然后再点击第一个文件指向这一行的代码

query.billRange==0?"0-0":query.billRange.replace(/\,/g,'-')

我们思考一下 

如果说 没有query.billRange,那么replace方法肯定用不了,那么我们想一想本地可以,线上不可以,本地和线上的区别在哪里呢?那就是异步任务的问题,有的时候跑的快也会出现问题,所以会出现this.$nextTick,所以我们在获取值的时候给其他的值直接赋值,然后再使用新的值也可以解决这个问题。代码如下:

if (this.query.billRange) {
          this.billRange = this.query.billRange
        } else {
          this.billRange = ''
        }



billRange==0?"0-0":billRange.replace(/\,/g,'-')

 11、上传企业logo展示大小调整

<div class="navbar-left-font" :class="{'logoPathDiv': logoPath}">


 .navbar-left-font.logoPathDiv {
        width: 180px;
        height: 50px;
        img{
          width: 180px;
          height: 50px;
        }
      }

12、el-date-picker在Ie下的样式问题(外边框断断续续)

.el-date-editor .el-range-input{
  height: 98% !important;
}

因为盒子高度太高盖住了 

13、线上出现一些禁用效果无效。 

通过父组件传值过来来进行判断是否给true,但是发现有个问题就是偶尔会出现这个true不存在,这个值通过computed,解决的方案就是直接给了true,不用传的值,因为这个组件单用,并不影响,

通过这个我们应该思考一下,一般情况下,我们应该通过传值是没有问题了,一般值出现问题给this.$nextTick进行使用也是可以的,出现问题的本质还是没有拿到相应的值。

14、工作台出现问题。 

问题的出现发现我们的控制台报了一个错误,大概意思就是一个getInfo方法找不到,然后找了相关的代码,发现这个方法调用了,但是方法被注释掉了,后来通过沟通是不需要了,所以需要把调用的代码也需要去掉就可以了。

不影响后边的调用。

15、滚动条的效果不是很如意怎么办

function smoothScroll(targetPosition) {
  const startPosition = window.pageYOffset
  const distance = targetPosition - startPosition
  const duration = 1000 // 滚动时间
  let start = null

  function step(timestamp) {
    if (!start) start = timestamp
    const progress = timestamp - start
    const scrollY = progress / duration * distance + startPosition
    window.scrollTo(0, scrollY)
    if (progress < duration) {
      window.requestAnimationFrame(step)
    }
  }

  window.requestAnimationFrame(step)
},


// 在滚动事件中调用smoothScroll函数,传入目标位置
window.addEventListener('wheel', (e) => {
  e.preventDefault()
  const targetPosition = window.pageYOffset + e.deltaY * 800
  console.log('获取的数据是', targetPosition)
  this.smoothScroll(targetPosition)
})

上边的方法慎重使用,因为鼠标的滚动有默认的事件,但是我们要知道是可以进行操作的,里边的两个参数一个是延迟时间及滚动到的地方

16、网页的titile更改(Vue项目)

项目中出现两个功能菜单出现公用的组件,再设置单页面路由的时候titile都一样,导致显示的内容一样,那么我们通过查看在后置守卫有相应的代码

import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import store from '@/store'

NProgress.configure({ showSpinner: false })

Vue.use(VueRouter)

const router = new VueRouter({
  mode: 'hash',
  routes
})

router.afterEach((to) => {
  if (to.meta.title) {
    document.title = '平台-' + to.meta.title
  }
  NProgress.done()
})

router.beforeEach((to, from, next) => {
  NProgress.start()
})

export default router

 在后置守卫进行了设置。

我们给了两个解决方法

1、重新再写一个路由重新命名,name,title不一样,但是引用的组件一样

2、在后置守卫里边进行判断做更改,代码如下。

if (to.name == 'billAuditExaminApprove') {
      const urls = decodeURIComponent(to.fullPath.split('?')[1].split('=')[1])
      if (JSON.parse(urls).billBeh === 'BB03') {
        document.title = '平台-' + '贴现业务审核-审批'
      } else {
        document.title = '平台-' + to.meta.title
      }
    } else {
      document.title = '平台-' + to.meta.title
    }

延申

decodeURIComponent()

decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。

17、table原生css样式不容许内容自适应宽度 

table{
     table-layout:fixed;
     word-break:break-all;
}

18、el-descriprtion的内容有数字时候在IE下失效

第一步 首先给内容套一个div标签

第二步 给标签一个属性样式

word-wrap:break-all; 

19、有个el-radio的提示语莫名出现

从我知道的分支上发现并没有相关的代码,然后又问相关的功能环境的分支,确定了是某个分支的代码,然后找到了,发现是某个同事增加了校验条件,但是校验的变量一样了,这样就会有结果不同功能但是同一校验,提交功能上不去。

解决的测试就是校验放在组件上,谁的校验谁用,分别校验。

猜你喜欢

转载自blog.csdn.net/2201_75705263/article/details/134716444
今日推荐