textarea与标签组合,点击标签填入标签内容,再次点击删除内容(vue)
需求:将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)的更多相关文章
- Html : 点击按钮弹出输入框,再次点击进行隐藏
上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- 点击按钮改变div背景色,再次点击恢复 -- 原生JS
如果对您有帮助,记得点个赞哦!
- 初学ToggleButton 点击button,更换button背景图片;再次点击,恢复之前背景图
上方的图标,R.drawable.register_checked 是选中图片 下方的图标, R.drawable.register_unchecked 是未选中图片 默认是上方的选中效果.点击 ...
- ThinkPHP框架下,给jq动态添加的标签添加点击事件移除标签
jq移除标签主要就是$("#要移除的id").remove();不再赘述,这里要提醒的是jq中动态添加标签后怎样添加点击事件.一般的jq添加点击事件是用这种方法$("#i ...
- 点击事件获得li标签内容
通过点击事件获得li标签内容 Table of contents 随笔 随笔 <li onclick="liClick(this)">数据</li> //点 ...
- 点击对应的a标签返回相应的第几个
面试中遇到的问题,前两天一直没有解决,今天想想还是得要想办法才行,其实仔细想的话很简单,惭愧啊,面试的时候没有做出来! 题目是这样的,如果一个body中有5个a标签,当我们点击对应的a标签时,aler ...
- jq再次封装自己的ajax & js 回调函数 & js方法注释&js 全局屏蔽点击事件及a标签
1.封装成一个独立JS var commonUrl = 'http://xx.xxx.com/'; function http({ url, type = "post", data ...
- JAVAWEB开发之JSTL标签库的使用、 自己定义EL函数、自己定义标签(带属性的、带标签体的)
JSTL JSTL简单介绍: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用: 提供给Java Web开发者一个标准通用的标签函数库 和E ...
- JSP标准标签库(JSTL)之核心标签(下)
前面记录了核心标签的前几种,现在来接着记录. 七.<c:import>标签 使用<c:import>标签可以包含一个FTP服务器中不同的网页内容.语法格式: <c:i ...
随机推荐
- Python的collections之namedtuple的使用及其优势
类实现: class User: def __init__(self, name, age, height): self.name = name self.age = age self.height ...
- IDEA子项目的相互依赖
A项目依赖B项目 一.B项目打包,执行install 这一步其实就是把你的项目打包到本地仓库,你可以在本地仓库看到相应的jar包 二.在A项目的pom.xml引入依赖可以了 当B项目修改后,需要重新打 ...
- k8s记录-etcd集群部署(三)
https://blog.csdn.net/fy_long/article/details/86542872 1)程序准备tar xvf etcd-v3.3.11-linux-amd64.tar.gz ...
- Vue学习笔记十一:按键修饰符和自定义指令(钩子函数)
目录 padStart:补位 按键修饰符 Vue提供的按键修饰符 自定义按键修饰符 自定义指令 自定义指令的使用 钩子函数 钩子函数参数 使用钩子函数的bingding参数 私有自定义指令 钩子函数的 ...
- [ kvm ] 学习笔记 1:Linux 操作系统及虚拟化
1. 前言 一台计算机是由一堆硬件设备组合而成,在硬件之上是操作系统,操作系统与计算机硬件密不可分,操作系统用来管理所有的硬件资源提供服务,各个硬件设备是通过 总线 进行连接起来的: 在操作系统之上, ...
- logstash 6.6.0 读取nginx日志 插入到elasticsearch中
logstash.conf input { # For detail config for log4j as input, # See: https://www.elastic.co/guide/en ...
- rtsp向rtmp推流
package com.awifi.video.media.test; import org.bytedeco.javacpp.avcodec; import org.bytedeco.javacv. ...
- ant 节点和属性
任务和javac命令是相似,它编译两种类型的java文件1)没有被编译的java文件2)曾经编译过,但是class文件版本和当前对应的java文件版本不匹配的java文件. 1)javac命令支持的参 ...
- Python字典dict的基本使用
可以将字典看作是特殊的列表,将下标0.1.2,表示成name,age,job. 程序列出了基本的增删改查,其余方法自行测试. 1.程序测试 #!/usr/bin/python # -*- coding ...
- C++ 中 static 与 const 的用法及对比
在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...