首页 > 其他分享 >directive自定义指令把文案转html+输入功能

directive自定义指令把文案转html+输入功能

时间:2024-04-11 16:59:09浏览次数:22  
标签:el Vue console 自定义 directive value item html log

文案: 

"甲方(贷款人): 全称:$var<text_aasdrup06rc00> 法定代表人/负责人:$var<text_k2s9cffkhls00>地址:$var<text_6356yvx7oag00>\n\n乙方(借款人): 全称/姓名:(变量-姓名), 身份证号码/统一社会信用代码:(变量-身份证) 地址:$var<text_1g9bed61qp7k0>\n\n鉴于:\n\n甲方与乙方于  $var<date_3lday4c7pbs00>  日签订《贷款合同》,因还款纠纷,双方同意通过调解方式解决争议。\n经过友好协商,双方现已就贷款偿还、利息支付以及其他相关事项达成一致意见。\n调解协议条款:\n\n乙方确认尚欠甲方本金人民币  $var<money_etzhsw0n36o00>  元及至 $var<date_ispx8oc0ldk00>止的利息 $var<money_j784z1f8c8000> 元。\n\n乙方承诺按照以下分期还款计划偿还上述款项:\n\n第一期还款:$var<date_2j148ln3jzm00>前支付 $var<money_gmbbo2mnkrs00> 元;\n最后一期还款:$var<date_fueb9me7qxs00>前全部结清。\n若乙方按期足额偿还,则甲方同意免除逾期罚息和其他违约金;否则,甲方保留追索全部未偿债务及相关费用的权利。\n\n双方确认,本协议生效后,《贷款合同》中的争议即视为解决,任何一方不得再就已调解事项提起诉讼或仲裁,除非对方严重违反本协议。\n"   效果图:   vuex:
state
const state = {
  protocolData:[],//协议添加数据
}

export default state;
 
getters
/**
 * @description 全局的getters
 */
 const getters = {
  protocolData:(state)=>state.protocolData
}

export default getters;
mutations
 const mutations = {
  /**
   * [改变state的值]
   * @param  {[type]} state         [description]
   * @param  {[type]} options.key   [description]
   * @param  {[type]} options.value [description]
   * @return {[type]}               [description]
   */
  [TYPES.CHANGE_STATE]: (state, {
    key,
    value
  }) => {
    state[key] = value;
  },
}
export default mutations;
查看代码
 const actions = {

  /**
   * [changeStateValue 改变state的值]
   * @param  {[type]} options.commit [description]
   * @param  {[type]} options.key    [description]
   * @param  {[type]} options.value  [description]
   * @return {[type]}                [description]
   */
  changeStateValue({
    commit
  }, {
    key,
    value,
    callback
  }) {
    commit(TYPES.CHANGE_STATE, {
      key,
      value
    });
    if (callback) callback();
  },
}

export default actions;

 vue呈现窗口:

        <div
              class="custom_dom"
              v-insertDom="输入字符串内容"
         ></div>

css样式:

  .el-input{
                    .w(250) !important;
                    .el-input__inner{
                        // border: none !important;
                        border-left: none !important;
                        border-right: none !important;
                        border-top: none !important;
                        border-bottom: 1px solid #DCDFE6;
                        &:hover{
                            border-bottom: 1px solid #14DAAF; 
                        }
                    }
                }

 

vue自定义指令:

index.js
 
import insertDom from "./insertDom";

const install=function(Vue){
    Vue.directive('insertDom', insertDom)
}

if (window.Vue) {
    window['insertDom'] = insertDom
    Vue.use(install)
}
insertDom.install=install;
export default insertDom;

 

insertDom.js
 import {
  verifyString,
  extractStringVariables
} from "@/utils";
import store from '@/store';
import {
  Input,
  DatePicker,
  Message
} from 'element-ui'
export default {
  inserted(el, binding, vnode) {
    const {
      value
    } = binding
    console.log(value);
    let _curStrArr = extractStringVariables(value);
    let _protocolData = store.getters && store.getters.protocolData;
    console.log(_curStrArr);
    let _modifiedStr = value;
    (_curStrArr || []).forEach(item => {
      _modifiedStr = _modifiedStr.replace(item.key, `--$--${item.id}--$--`);
    });
    let _domConArr = _modifiedStr.split('--$--');
    console.log(_domConArr);
    (_domConArr || []).forEach(item => {
      if (_protocolData.some(v => v.id == item)) {
        // let _childInput = document.createElement('input');
        // _childInput.setAttribute('type', 'text');
        // _childInput.setAttribute('placeholder', '请输入内容');
        // _childInput.setAttribute('id', item);
        // _childInput.addEventListener('change', (event) => {
        //     console.log(event.target.value);
        //     console.log(event.target.id);
        //     console.log(_protocolData, "_protocolData");
        //   });
        // el.appendChild(_childInput);
        // let instance = new Vue(Input).$mount();
        // 创建一个新的 Vue 实例,基于 Input 组件,并传入选项对象
        // 创建一个新的 Vue 实例,并传入选项对象  
        let instance = null;
        if (item.indexOf("text_") > -1 || item.indexOf("money_") > -1) {
          instance = new Vue({
            //   el: document.createElement('div'), // 创建一个临时的 div 元素作为挂载点  
            render(h) {
              // 使用 render 函数渲染 Input 组件  
              return h(Input, {
                attrs: {
                  id: item, // 将 id 属性绑定到 Vue 实例的 data 中的 inputId
                },
                props: {
                  placeholder: this.placeholder,
                  type: "text",
                //   value: this.value,
                },
                model: {
                  value: this.value, // 将 value 属性绑定到 Vue 实例的 data 中的 value
                  callback: this.handleInput, // 绑定 input 事件到 handleInput 方法
                  expression: 'value',
                },
                on: {
                  // input: this.handleInput,
                  change: this.handleChange, // 添加 change 事件处理器
                },
              });
            },
            data() {
              return {
                // 在这里添加组件的属性  
                value: "",
                placeholder: item.indexOf("text_") > -1 ? '请输入内容' : '请输入金额',
              };
            },
            methods: {
              // 在这里添加组件的事件处理函数  
              handleInput(newValue) {
                this.value = newValue; // 更新 Vue 实例的 data 中的 value
                //   console.log('输入内容:', this.value);
              },
              handleChange(event) {
                console.log('值已更改:', event);
                if (item.indexOf("money_") > -1) {
                  let _regex = /^(\d+(\.\d{1,7})?)$/;
                  if (!_regex.test(event)) {
                    Message.error("请输入正确的金额格式");
                    this.value = "";
                    return
                  }
                }
                //   console.log(this.$el);
                let inputElement = this.$el.querySelector('input');
                console.log('当前 input 的 id:', inputElement.getAttribute('id'));
              },
            },
            mounted() {
              // 通常不需要手动添加事件监听器,因为我们在 render 函数中已经做了这件事  
            },
            beforeDestroy() {
              // 通常不需要手动移除事件监听器,因为 Vue 会自动处理  
            },
          }).$mount(); // 手动挂载实例
        } else if (item.indexOf("date_") > -1) {
          instance = new Vue({
            //   el: document.createElement('div'), // 创建一个临时的 div 元素作为挂载点  
            render(h) {
              // 使用 render 函数渲染 Input 组件  
              return h(DatePicker, {
                attrs: {
                  id: item, // 将 id 属性绑定到 Vue 实例的 data 中的 inputId
                },
                props: {
                  placeholder: this.placeholder,
                  type: "date",
                  valueFormat: "yyyy-MM-dd"
                  // value: this.value,
                },
                model: {
                  value: this.value, // 将 value 属性绑定到 Vue 实例的 data 中的 value
                  callback: this.handleDate, // 绑定 input 事件到 handleDate 方法
                  expression: 'value',
                },
                on: {
                  // input: this.handleDate,
                  change: this.handleChange, // 添加 change 事件处理器
                },
              });
            },
            data() {
              return {
                // 在这里添加组件的属性  
                value: '',
                placeholder: '请选择日期',
              };
            },
            methods: {
              // 在这里添加组件的事件处理函数  
              handleDate(newValue) {
                this.value = newValue; // 更新 Vue 实例的 data 中的 value
                //   console.log('输入内容:', this.value);
              },
              handleChange(event) {
                console.log('值已更改:', event);
                //   console.log(this.$el);
                let inputElement = this.$el.querySelector('input');
                console.log('当前 input 的 id:', inputElement.getAttribute('id'));
              },
            },
            mounted() {
              // 通常不需要手动添加事件监听器,因为我们在 render 函数中已经做了这件事  
            },
            beforeDestroy() {
              // 通常不需要手动移除事件监听器,因为 Vue 会自动处理  
            },
          }).$mount(); // 手动挂载实例
        }

        // let parent = el.parentNode;
        // 将新创建的实例插入到指令所在的元素之后
        if (instance) {
          el.appendChild(instance.$el);
        }

        // parent.insertBefore(instance.$el, el.nextSibling);

      } else {
        el.appendChild(document.createTextNode(item));
      }
    });


    console.log(_protocolData, "_protocolData");

    // const all_permission = '*:*:*'
    // const permissions = store.getters && store.getters.permisaction
    // // console.log(permissions,"permissions122");
    // // console.log(store.getters);
    // if (value && value instanceof Array && value.length > 0) {
    //   const permissionFlag = value

    //   const hasPermissions = permissions.some(permission => {
    //     return all_permission === permission || permissionFlag.includes(permission)
    //   })

    //   if (!hasPermissions) {
    //     el.parentNode && el.parentNode.removeChild(el)
    //   }
    // } else {
    //   throw new Error(`请设置操作权限标签值`)
    // }
  },
  unbind(el) {
    // 销毁组件实例
    if (el.firstChild && el.firstChild.$destroy) {
      el.firstChild.$destroy();
    }
  }
}

全局注册:

main.js
 import insertDom from "@/utils/insertDom";
Vue.use(insertDom);

标签:el,Vue,console,自定义,directive,value,item,html,log
From: https://www.cnblogs.com/wxchun/p/18129556

相关文章

  • php去掉字段文本的所有html标签
    方法1:php内建函数strip_tags()除去HTML标签<?phpheader("content-type:text/html;charset=utf-8");functionstrip_html_tags($str){$pattern='/<("[^"]*"|\'[^\']\*\'|[^>"\'])*>......
  • Python+Django+Html网页版人脸识别考勤打卡系统
    程序示例精选Python+Django+Html人脸识别考勤打卡系统如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!前言这篇博客针对《Python+Django+Html网页版人脸识别考勤打卡系统》编写代码,代码整洁,规则,易读。学习与应用推荐首选。运行结果文章......
  • VScode里用MPE插件导出带大纲的HTML和PDF文件
    前置条件:1.在VScode里安装好MarkdownPreviewEnhanced插件2.导出PDF文件,需要用到Prince软件,要先在电脑上安装Prince软件,可以去它的官网下载                Prince-DownloadPrince(princexml.com)windows系统的,选这个就可以了,解压后放在自己想放的......
  • 自定义校验(这里是Validation)
    1.自定义注解Statepackagecom.itheima.anno;importcom.itheima.Validator.StateValidator;importjakarta.validation.Constraint;importjakarta.validation.Payload;importjava.lang.annotation.*;@Documented//元注解@Target(ElementType.FIELD)@Retention(R......
  • 数据可视化-ECharts Html项目实战(11)
    在之前的文章中,我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。数据可视化-EChartsHtml项目实战(10)-CSDN博客文章浏览阅读775次,点赞20次,收藏16次......
  • Elasticsearch 创建自定义分析器(4)
    一.自定义分析器当内置分析器不能满足时,可以创建一个自定义分析器,自定义分析器(analyzer)由:1)0或多个charactcrfilter字符过滤器2) 1个tokenizer分词器,将文本切分为分词  3)0或多个tokenfilter令牌过滤器,是属于分词后再过......
  • Django ModelSerializer 中如何实现自定义验证
    随着Web开发的日益复杂化,对数据验证的需求也日益增加。DjangoRESTframework提供了一套强大的、灵活的验证系统,帮助开发者轻松处理各种复杂情况。本文将重点探讨DjangoModelSerializer中如何实现自定义验证。1.简介DjangoModelSerializer不仅简化了序列化过程,还内建了......
  • html学习
    <!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <metaname="viewport"content="width=d......
  • Spring Actuator 自定义HealthIndicator
    在SpringActuator实现自定义端点中案例的的基础上,实现自定义HealthIndicator。为什么还要实现HealthIndicator呢?SpringActuator实现自定义端点中案例只是对status的数据进行了监控,至于这个数据是否健康并没有进行评价。实现HealthIndicator就是对自定义监控数据的健康状态根......
  • (二)网页前端开发基础之HTML
    HTML是一种在因特网上常见的网页制作标注性语言,但因缺少程序设计语言所应有的特征,不能算作一种程序设计语言。它通过浏览器的翻译将网页中的内容呈现给用户。对于网站设计人员,HTLM和CSS是一起用的,它俩的关系是“内容”和“形式”,由HTML确定网页的内容,CSS实现页面的表现形式。两......