需求:将textarea与span标签组合,点击标签自动填入标签文本内容,再次点击删除标签文本对应内容

原理:点击标签时,将标签内容作为参数,将内容拼接在textarea的value后面,再次点击标签,使用js的replace替换(这里只能替换找到的第一个与标签内容相同的值)

实现代码如下:

<template>
<div class="relative-element">
<textarea v-model="myForm.remark" type="textarea" :maxlength="300" placeholder="请输入备注,300字以内"></textarea>
<div class="bottom-labels" ref="remarkLabels">
<span title="九零后" @click.stop="autoFillIn('九零后', $event)">九零后</span>
<span title="小说迷" @click.stop="autoFillIn('小说迷', $event)">小说迷</span>
<span title="天真无邪" @click.stop="autoFillIn('天真无邪', $event)">天真无邪</span>
<span title="可爱迷人" @click.stop="autoFillIn('可爱迷人', $event)">可爱迷人</span>
<span title="帅气逼人" @click.stop="autoFillIn('帅气逼人', $event)">帅气逼人</span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
myForm: {
remark: '小说迷 '
}
}
},
mounted() {
this.initLabelsCheck(this.myForm.remark);
},
methods: {
// textarea初始化(标签根据内容是否选中)
initLabelsCheck(remark) {
if(remark){
let remarkArr = remark.split(" ");
if(remarkArr.length > 0 && this.$refs.remarkLabels){
let labels = this.$refs.remarkLabels.querySelectorAll("span");
for(let i=0; i<remarkArr.length; i++){
for(let l=0; l<labels.length; l++) {
if(remarkArr[i].trim()!=='' && remarkArr[i] === labels[l].getAttribute("title")){
labels[l].classList.add('active');
}
}
}
}
}
},
// textarea点击标签自动填入
autoFillIn(text, event){
let target = event.target;
if(target.classList.contains("active")){
// 再次点击删除
text = text + " ";
this.myForm.remark = this.myForm.remark.replace(text, '');
} else {
if(this.myForm.remark.length === 0){
this.myForm.remark += text + " ";
} else {
this.myForm.remark = this.myForm.remark.trim() + " " + text + " ";
}
}
target.classList.toggle("active");
}
}
}
</script>
<style lang="scss" scoped>
.relative-element {
position: relative;
margin: 30px 40px;
width: 400px;
textarea {
display: block;
padding: 5px 15px;
width: 100%;
height: 150px;
resize: vertical;
line-height: 1.5;
box-sizing: border-box;
font-size: inherit;
color: #606266;
background-color: #fff;
border: 1px solid #dcdfe6;
border-radius: 4px;
transition: border-color .2s cubic-bezier(.645,.045,.355,1);
}
.bottom-labels {
position: absolute;
left: 10px;
right: 10px;
bottom: 3px;
line-height: 18px;
background-color: #fff;
user-select: none; span {
display: inline-block;
margin: 0 3px;
padding: 0 6px;
font-size: 12px;
background-color: #f3f3f3;
vertical-align: middle;
&:hover {
cursor: pointer;
}
&.active {
color: #29e;
}
}
}
}
</style>

textarea与标签组合,点击标签填入标签内容,再次点击删除内容(vue)的更多相关文章

  1. Html : 点击按钮弹出输入框,再次点击进行隐藏

    上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  2. 点击按钮改变div背景色,再次点击恢复 -- 原生JS

    如果对您有帮助,记得点个赞哦!

  3. 初学ToggleButton 点击button,更换button背景图片;再次点击,恢复之前背景图

    上方的图标,R.drawable.register_checked  是选中图片 下方的图标,   R.drawable.register_unchecked 是未选中图片 默认是上方的选中效果.点击 ...

  4. ThinkPHP框架下,给jq动态添加的标签添加点击事件移除标签

    jq移除标签主要就是$("#要移除的id").remove();不再赘述,这里要提醒的是jq中动态添加标签后怎样添加点击事件.一般的jq添加点击事件是用这种方法$("#i ...

  5. 点击事件获得li标签内容

    通过点击事件获得li标签内容 Table of contents 随笔 随笔 <li onclick="liClick(this)">数据</li> //点 ...

  6. 点击对应的a标签返回相应的第几个

    面试中遇到的问题,前两天一直没有解决,今天想想还是得要想办法才行,其实仔细想的话很简单,惭愧啊,面试的时候没有做出来! 题目是这样的,如果一个body中有5个a标签,当我们点击对应的a标签时,aler ...

  7. jq再次封装自己的ajax & js 回调函数 & js方法注释&js 全局屏蔽点击事件及a标签

    1.封装成一个独立JS var commonUrl = 'http://xx.xxx.com/'; function http({ url, type = "post", data ...

  8. JAVAWEB开发之JSTL标签库的使用、 自己定义EL函数、自己定义标签(带属性的、带标签体的)

    JSTL  JSTL简单介绍: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用:   提供给Java Web开发者一个标准通用的标签函数库   和E ...

  9. JSP标准标签库(JSTL)之核心标签(下)

      前面记录了核心标签的前几种,现在来接着记录. 七.<c:import>标签 使用<c:import>标签可以包含一个FTP服务器中不同的网页内容.语法格式: <c:i ...

随机推荐

  1. Ionic4.x ion-refresher 下拉更新

    官方文档:https://ionicframework.com/docs/api/refresher <ion-header> <ion-toolbar> <ion-ti ...

  2. 我非要捅穿这 Neutron(二)上层资源模型篇

    目录 文章目录 目录 Neutron 的资源模型 Network 运营商网络和租户网络 创建运营商网络 创建租户网络 创建外部网络 Network 小结 Subnet IP 核心网络服务 Subnet ...

  3. Django 将APP存储至统一目录

    项目根目录下创建apps目录 mkdir apps 将应用移动到apps目录下 这里取消  search for references   ,open moved files in edito 选择 ...

  4. Mysql关键字之Group By(二)

    原文地址,优先更新https://hhe0.github.io 我们在上一节简单介绍了Mysql中group by关键字的用法,没有看过的同学点击这里了解一下; 文中提到的courses表和相关记录可 ...

  5. Flink FileSink 自定义输出路径——BucketingSink

    今天看到有小伙伴在问,就想着自己实现一下. 问题: Flink FileSink根据输入数据指定输出位置,比如讲对应日期的数据输出到对应目录 输入数据: 20190716 输出到路径 20190716 ...

  6. Go 包导入备忘

    一 包的导入语法     在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下:     import(         "fmt"     )    ...

  7. 【JQuery插件】团购倒计时

    案例截图 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3. ...

  8. Difference between Process and thread?

    What are the differences between a process and a thread? How are they similar? How can 2 threads com ...

  9. 对象的加减乘除运算demo

    1 class Square: 2 def __init__(self, wh): #因为是正方形, 只取一条边的长度 3 if isinstance(wh,(int,float)): 4 self. ...

  10. 原生js 实现better-scroll效果,饿了么菜单内容联动,即粘即用

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...