通过div模拟textarea对数据进行编辑及可插入标签

 通过div去模仿textarea文本  我们可以通过contenteditable属性去改变div,将其改为一个可编辑div
<template>
  <div>
    <el-form :model="dataform">
      <el-form-item label="内容" :label-width="formLabelWidth">
        <!-- <el-input type="textarea" :rows="2" v-model="broadcastTemplate"> -->
        <div
          class="textarea"
          ref="textArea"
          :contenteditable="true"
          v-html="dataform.broadcastTemplate"
        ></div>
        <!-- </el-input> -->
      </el-form-item>
      <div class="chooseText">
                <span
                  class="item"
                  v-for="(item, index) in formArray"
                  :key="index"
                  @click="insertStr(index, item)"
                >插入{{ item }}</span
                >
      </div>
    </el-form>
  </div>
</template>
 js主要处理数据以及对可编辑div进行数据赋值,我这里是通过使用v-html方法对span标签解析,
这里v-html无法对第三方组件库(例如:饿了吗)中的el-tag标签进行解析,这里大家可以去查询一下资料或者有好的解决办法,可以和我私聊,其他的数据匹配是后端的同事对#xxx#进行匹配,我这里有个bug就是对标签进行删除时发生的bug,希望有大神可以帮忙完善下。
<script>
  export default {

    data() {
      return {
        dataform: {
          broadcastTemplate: '', // 播报模板
        },
        VoiceStr: '',
        formLabelWidth: '120px',
        formArray: [
          '姓名',
          '手机号',
          '住址',
          '学校',
        ],
        tempStr: '',
      }
    },
    props: {
      voiceData: {
        type: Object
      },
    },
    computed: {},
    methods: {
      cancelVoice() {
        this.dataform.voiceBroadcastTime = 3
        this.dataform.broadcastTemplate = ''
      },
      sureVoiceGet() {
        this.dataform.broadcastTemplate = this.$refs.textArea.innerText
        this.$emit('sureVoice', { flag: false, dataform: this.dataform })
        this.updataVoice()
      },
      insertStr(index, value) {
        // this.VoiceStr = this.$refs.textArea.innerHTML + `<span class="itemText" style="color:#1989fa;">#${value}#</span>` + `<span style="color:black;">,</span>`
        this.VoiceStr =
          this.$refs.textArea.innerHTML +
          `<span style="color:black;">&nbsp</span>` +
          `<span class="itemText" style="color:#1989fa;">#${value}#</span>` +
          `<span style="color:black;">&nbsp</span>`
        this.tempStr = this.VoiceStr.replace('[object HTMLDivElement]', '')
        this.dataform.broadcastTemplate = this.tempStr
      },
      updataVoice() {
        this.dataform = {
          voiceBroadcastTime: 3,
          broadcastTemplate: '',
        }
      },
    },
    created() {
      console.log(this.voiceData)
      this.dataform.voiceBroadcastTime  = this.voiceData.voiceBroadcastTime
      this.dataform.broadcastTemplate = this.voiceData.broadcastTemplate
    },
  }
</script>

下面就是简单的对样式的一些处理,我使用的scss,大家可以改为其他的预处理语言 。第一次发不喜勿喷。谢谢大家

<!-- 可使用less为预处理语言 -->
<style scoped lang="scss">
  .textarea {
    width: 300px;
    height: 60px;
    border: 1px solid #cbd8e8;
    border-radius: 5px;
    line-height: 25px;
    resize: both;
    overflow: auto;
  }

  .chooseText {
    margin-left: 81px;
    width: 400px;
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: flex-start;
  }

  .item {
    width: 130px;
    text-align: center;
    margin: 5px 0px;
    color: #1989fa;
    display: flex;
  }
</style>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值