实现将字符串中的特殊字符转化为输入框或者下拉框

字符串特殊字符转输入框或下拉框实现

前提:
最近项目有个需求,自定义模板,模板为一段文字,但是规定好一个规则:将字符串中的 {提示文字} 和 [选项一|选项二|选项三] 分别转换为输入框和下拉选择框。在自己没有很好的思路下选择查找网上的资料,找到一篇类似的文章,在这感谢大佬提供的思路原文链接,但大佬的使用情景很简单,只针对了在输入框即提示文字相同的情况下会出现第二个输入框不出现(用的split分割导致),下拉框同理。
要实现的效果如下下拉框和输入框
个人模板编辑时要想实现输入框就使用{} 以及下拉选择使用 [xxx|xxx|xxx]
![在这里插入图片描述](https://img-blog.csdnimg.cn/5d04f3c375c6451293b3ed8bc9086d41.png#pic_center width=512 height=256)

相关代码:

解析相关代码

setWords(item) {
   
   
      this.tkArrDes = [];
      this.tkArrHint = [];
      this.formData.ultrasoundDescribe = item.ultrasoundDescribe;
      this.formData.ultrasoundHint = item.ultrasoundHint;
      this.formData.name = item.name;
      this.formData.superiorId = item.superiorId;
      this.formData.ultrasoundDescribe = this.formData.ultrasoundDescribe.replaceAll('{}', '{xxx}');
      this.formData.ultrasoundHint = this.formData.ultrasoundHint.replaceAll('{}', '{xxx}');
      this.handTK(this.formData.ultrasoundDescribe, '', this.tkArrDes);
      this.handTK(this.formData.ultrasoundHint, '', this.tkArrHint);
    },
    handTK(tkString, t1, tkArr) {
   
   
      var s1 = tkString.match(/\{(.+?)\}|\[(.+?)\]/g);
      if (s1 != null && s1.length > 0) {
   
   
        var obj = {
   
   };
        const index = tkString.indexOf(s1[0]);
        var s = [tkString.substring(0, index), tkString.substring(index + s1[0].length, tkString.length)];
        obj.question = s[0];
        obj.questionType = s1[0];
        if (obj.questionType.indexOf('{') !== -1) {
   
   //输入框
          obj.input = '';
          obj.flag = '0';
          let p = s1[0].replace(/,(.+?)\}/g, '');
          p = p.replace('{', '');
          //暂时不要提示文字
          // obj.placeholder = p;
          let t = s1[0];
          t = t.replace(/\{(.+?),/g, '');
          t = t.replace('}', '');
          obj.flagType = t;
          tkArr.push(obj);
          if (s[1] !== '' && s[1] !== undefined && s[1] != null) {
   
   
            this.handTK(s[1], t1, tkArr);
          }
        } else if (obj.questionType.indexOf('[') !== -1) {
   
   //下拉框
          obj.input = '';
          obj.flag = '1';
          // debugger
          let p = s1[0].replace(/,(.+?)\]/g, '');
          p = p.replace('[', '');
          p = p.replace(']', '');
          //切割 选项
          const options = p.split('|');
          obj.options = options;
          let t = s1[0];
          t = t.replace(/\[(.+?),/g, '');
          t = t.replace(']', '');
          obj.flagType = t;
          tkArr.push(obj);
          if (s[1] !== '' && s[1] !== undefined && s[1] != null) {
   
   
            this.handTK(s[1], t1, tkArr);
          }
        } else {
   
   
          obj1.input = '';
          obj1.flag = '-1';
          obj1.placeholder = '';
          obj1.flagType = 
### Vue.js 中实现输入框下拉框组合组件 在 Vue.js 应用中,可以轻松创建一个由输入框和下拉菜单组成的复合组件。这种类型的组件通常用于允许用户既可以通过手动输入也可以通过选择预定义选项来设置值。 #### 创建基础模板结构 首先构建 HTML 结构: ```html <div id="app"> <div class="combo-box"> <input v-model="selectedValue" @blur="handleBlur" /> <select v-model="selectedValue" style="display:none;"> <option disabled value="">请选择</option> <option v-for="item in options" :key="item.value" :value="item.value">{{ item.text }}</option> </select> </div> 已选中的值:{{ selectedValue }} </div> ``` 此部分代码设置了基本的 UI 布局,并利用 `v-model` 将输入框和隐藏的选择器绑定到同一个变量上[^1]。 #### 初始化 Vue 实例并定义数据模型 接着初始化 Vue 实例以及必要的属性: ```javascript new Vue({ el: '#app', data () { return { selectedValue: '', options: [ { text: '选项一', value: 'one' }, { text: '选项二', value: 'two' }, { text: '选项三', value: 'three' } ] }; }, methods: { handleBlur(event) { const inputValue = event.target.value; // 如果输入的内容不在可选项内,则清空输入框 let isExisted = false; for (let i = 0; i < this.options.length; i++) { if (this.options[i].text === inputValue || this.options[i].value === inputValue) { isExisted = true; break; } } if (!isExisted && inputValue !== '') { alert('请输入有效值'); this.selectedValue = ''; } } } }); ``` 这段 JavaScript 定义了一个简单的验证逻辑,在失去焦点时检查输入是否存在于给定的选项列表中;如果不是有效的选项则提示错误信息并将输入重置为空字符串。 为了使用户体验更友好,还可以进一步增强功能,比如当用户点击输入框时显示可用选项供其挑选,或是支持模糊匹配等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值