引用参数编辑时作为整体编辑的逻辑(思路记录)

        需求背景:要做一个通知的推送消息,消息是一个异常汇总的通知,里面涉及到异常个数,这些数字又是不一定的,获取这些的异常个数的接口也不一样,所以要做一个灵活的配置。在做编辑的时候为了方便,需要把引用的参数整体删除掉。

          由于本人表达限制,不清楚需求背景的兄弟看下图:

      

         大概的需求就是这个样子。

思路:

       1.  首先每个参数都是会存在多个,当我们作为整体删除时,要知道删除的是哪个,因此要定位光标位置,使用事件对象的 event.target.selectionStart 定位我们目前处于那个参数的范围,结合光标位置以及参数名称的长度,我们可以定位到具体查找字符串的开始位置和结束位置;

        2. 要区分是 backspace 键还是 delete 键,backspace删除的是前面的内容,delete是删除后面的内容,因此要用 keyCode进行判断;

        3. 匹配到字符串之后,将相应位置的字符串替换为空即可。

        4. 输入框内对应参数的个数为0时,需要把参数列表清空

思路完毕,处理函数代码如下:

 const deleteParamsFn = (event: any) => {
    const { target, code } = event
    let startIndex = target.selectionStart
    let _value = sessionStorage.getItem('keyDownParamsValue') || target.value
    function replaceString(str: any, startPos: any, endPos: any, replacement: any) {
      return str.substring(0, startPos) + replacement + str.substring(endPos);
    }
    function setDesFun(keyCode: any) {
      for (let i = 0; i < paramsSettingList.length; i++) {
        let replaceStr = `{${paramsSettingList[i].key}}`
        let index = _value.lastIndexOf(replaceStr, startIndex)
        if (keyCode === "Backspace") {
          index = _value.lastIndexOf(replaceStr, startIndex)
          if (target.selectionStart - index > 1 && target.selectionStart - index < replaceStr.length) {
            startIndex = index
          }
        }
        if (keyCode === "Delete") {
          index = _value.lastIndexOf(replaceStr, startIndex + replaceStr.length)
          if (target.selectionStart - index > 1 && target.selectionStart - index < replaceStr.length) {
            startIndex = index
          }
        }
        if (index === startIndex) {
          _value = replaceString(_value, index, index + replaceStr.length, '')
          form.setFieldsValue({
            description: _value,
          })
          break
        }
      }
    }
    if (code === "Backspace" || code === 'Delete') {
      setDesFun(code)
    }
    setTimeout(() => {
      let _list = paramsSettingList.filter((e: any) => {
        return _value.includes(`{${e.key}}`)
      })
      setparamsSettingList([..._list])
    })
  }

如有不妥之处,欢迎评论区讨论~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值