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 ...
随机推荐
- MySQL there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause同时创建多个更新当前时间戳字段 解决方法
问题重现 在写这篇文章之前,明确我的MySQL版本,MariaDB 或者你使用 MySQL 8 也会出现如下问题 MySQL 版本 现在有这样的需求,一张表中有一个字段created_at记录创建该条 ...
- pytorch nn.Sequential()动态添加方法
之前我们使用nn.Sequential()都是直接写死的,就如下所示: # Example of using Sequential model = nn.Sequential( nn.Conv2d(, ...
- ubuntu2 setting
luo@luo-ThinkPad-W540:research$ conda create -n tf2019 python=3.6Solving environment: done ==> WA ...
- 【Java】分布式自增ID算法---雪花算法 (snowflake,Java版)
一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...
- 【翻译】Flink window
本文翻译自flink官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/stream/operators/window ...
- python那些事儿
一.探索python 1.尝试安装python3 https://www.python.org/downloads/mac-osx/ 2.问题 安装了3.7,但是python -V还显示2.7.10. ...
- Haproxy+keepalived高可用集群实战
1.1 Haproxy+keepalived高可用集群实战 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡 ...
- Extjs locked无效,使用enableLocking即可
一.前言 在使用 extjs 做表格时,由于表格的列太多,我们需要设置一些固定列来查看数据,所以我们需要用到 locked 属性.普通加载 columns 的列是有效的,如果是动态加载的话,使用 lo ...
- LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
110. 平衡二叉树 110. Balanced Binary Tree 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点的左右两个子树 ...
- LeetCode 102. 二叉树的层次遍历(Binary Tree Level Order Traversal) 8
102. 二叉树的层次遍历 102. Binary Tree Level Order Traversal 题目描述 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 每 ...