vue文本输入框怎么写,vue 输入提示

  vue文本输入框怎么写,vue 输入提示

  本文主要介绍如何使用Vue实现输入框@功能。文章中的样例代码讲解的很详细,对我们学习Vue很有帮助。有兴趣的可以学习一下。

  

目录

  前言成员列表创建使用输入框获取光标的坐标,保存光标插入文本的运行结果汇总。

  

前言

  前面的文章分别介绍了如何实现聊天输入框的双向绑定,发送回车键,粘贴文字和图片等。为了改进输入框,本文重点介绍了如何实现聊天框的@功能。

  文章评论:

  Vue实现contenteditable元素双向绑定的方法详解

  Vue实现了进入输入框发送粘贴文字和图片的功能。

  首先,你需要理清思路:

  成员列表组件需要根据光标的位置进行调整。点击成员项时,回调成员信息,获取光标位置坐标(x值,y值)。当输入框不在焦点上时,记录光标。成员列表回调时,将成员信息插入光标位置。在此之前,需要恢复之前的光标,将光标移动到新的位置。既然有了想法,就可以一步一步去实现。

  

成员列表

  

创建

  实现成员列表的方法相对简单。其实就是一个列表,简单的v-for循环就可以完成。单击时,当前选定的成员项将被回调到父组件。

  添加新的AtPop.vue文件:

  模板

   at-pop-index

   div v-for=(item,index)in list data :key= index class= at-pop-item @ click . stop= click item(item) { { item . name } }/div

  /div

  /模板

  脚本

  导出默认值{

  道具:{

  //传入需要@的成员数组

  列表数据:{

  类型:数组,

  默认值:()=[]

  }

  },

  方法:{

  单击项目(项目){

  这个。$emit(onSelect ,item);//调用父组件的方法处理成员选择,返回当前选择。

  }

  }

  }

  /脚本

  

使用

  在父组件中,注册并使用成员列表组件。我们需要在用户输入@时弹出成员列表,所以需要监控用户的输入,然后在用户选择成员后关闭。关键是获取光标位置,这个位置是由输入框获取的,只需要在父组件中使用。

  //核心代码

  .

  //选择成员时插入数据,关闭弹出窗口

  onSelect(项目){

  console.log(onSelect ,item);

  这个。$ refs . inputbox . insert content(` $ { item . name } `);//有空格

  this.isShowAt=false

  },

  //输入框输入时回调函数。

  inputFunc(数据,事件){

  console.log(inputFunc ,data,event);

  if (event.data===@) {

  this.isShowAt=true//显示弹出窗口

  这个。$nextTick(()={

  设DOM=document . getelementsbyclassname( at-pop-index )[0];//获取成员列表弹出窗口,需要放在nextTick中

  //设置位置

  DOM . style . position= fixed ;

  DOM . style . left=math . floor(data . left 10) px ;

  DOM . style . top=math . floor(data . top) px ;

  DOM . style . zindex=9999;

  })

  }否则{

  this.isShowAt=false

  }

  },

  .

  

输入框

  输入框是这个函数的核心,需要处理光标位置的获取,并将值插入光标位置。

  当输入框被聚焦时,我们会看到光标闪烁。如果我们想得到光标位置以便插入数据,我们需要选择对象的帮助。选择指示用户选择的文本范围或插入数据的当前位置。由于获得了选择范围,所以当前选择范围的索引=0是当前光标位置。我们想要达到的效果是成员列表随光标移动,所以需要获取光标的坐标值。

  

获取光标的坐标

  let range=window.getSelection()。getRangeAt(0);//获取当前光标

  let position=range . getboundingclientrect();//获取当前光标的位置

  getBoundingClient()方法返回一个包含矩形区域坐标值的DOMRect矩形对象。获得的坐标值被回调到父组件,并显示成员列表。

  当我们在输入框中输入@时,页面上会出现成员列表,此时输入框仍然是焦点。但是,如果我们单击成员列表中的一个条目,输入框此时会失去焦点,尽管我们可以获得所选的成员并插入它。如果只是简单的字符串加法,在下一次输入时光标会默认定位在开头;或者我们需要在中间插入选中的成员,就会发现没有地方可以插入。因此,我们需要在失焦时保存当前光标,在插入时恢复光标。

  

保存光标

  //DivEditable.vue

  //焦点不在

  inputBlur(事件){

  this . selection=this . save selection();

  这个。$emit(blurFunc ,event);

  },

  //焦点不在时保存光标

  saveSelection() {

  如果(!window.getSelection) {

  返回null

  }

  let sel=window . get selection();

  if(sel . getrangeat sel . range count){

  return sel . getrangeat(0);

  }

  },

  游标是临时存储的,所以我们需要把插入的成员封装成一个方法,这个方法可以调用到父组件,这样父组件在获得成员信息后就可以直接调用了。接下来,您需要使用上面保存的光标位置:

  

插入文本

  //DivEditable.vue

  //恢复光标

  恢复重新选择(范围){

  if(范围){

  let sel=window . get selection();

  sel . removeallranges();

  sel.addRange(范围);

  }

  },

  //插入数据

  插入内容(值){

  //这个。$ refs . editor . focus();

  让范围,节点;

  this . restore selection(this . selection);//恢复失去焦点前的光标位置

  range=window.getSelection()。getRangeAt(0);

  range . collapse(false);//光标移动到末尾

  node=range . createcontextualfragment(value);

  let child=node . last child;

  console.log(lastChild ,child);

  range.insertNode(节点);

  //在当前插入的元素后面设置光标的起始位置

  if(子级){

  range.setEndAfter(子级);

  range . setstartafter(child);

  }

  let sel=window . get selection();

  sel . removeallranges();

  sel.addRange(范围);

  这个。$emit(input ,this。$ refs . editor . innerhtml);

  },

  其实这里已经基本实现了@功能,但是还有一个问题。当输入框失焦时,父组件的blurFunc方法被回调,导致成员列表被关闭,但数据还没有获取。处理这类问题有两种方法:

  使用setTimeout设置计时器,推迟关闭成员列表的操作,将检索逻辑修改为异步操作,等到获得数据后再关闭成员列表。很简单,使用setTimeout。

  //InputBox.vue

  模糊函数(事件){

  //焦点不在时,延迟关闭弹出窗口,以免还没有得到数据。

  如果(this.isShowAt) {

  setTimeout(()={

  this.isShowAt=false

  }, 500);

  }

  },

  

运行结果

  在输入框中输入@,在光标位置附近弹出成员列表。

  选择成员后,将成员信息插入输入框。

  

总结

  介绍了输入框@功能的实现方法,简单易用。

  主要利用选择和范围对象的相关方法,完成光标处理和输入插入。

  本文实现的@函数不能整体删除。目前有两种思路:把@xxx转换成图片,插入输入框。作者简单的写了一个demo来验证,但是效率不高,会出现卡顿;另一种方式是监听退格键,在删除时判断被删除的对象是否包含在有意义的@xxx中。如果是,则整体删除,如果不是,则默认删除。这个方法作者没有尝试过,比较难。

  至此,输入框的功能基本完善。需要看到可移动项目地址的完整代码。

  以上是Vue的输入框@函数的样例代码的详细内容。更多关于Vue的输入框@功能,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: