1、概述

在element组件中使用vue-code-diff代码比对组件,比对xml数据

 2、代码实现

先安装vue-code-diff

npm install vue-code-diff -S

还需要安装 vue-json-viewer   x2js

npm install vue-json-viewer

npm install x2js

# 安装
npm install vue-code-diff

# 在需要应用的地方导入引用
# 导入
import CodeDiff from 'vue-code-diff'
import JSONViewer from 'vue-json-viewer'

# 引入组件
components: { CodeDiff , JSONViewer}

因为数据为xml格式所以需要解析转成JSON,这就用到了x2js

main.js

# 导入
import x2js from 'x2js'

Vue.prototype.$x2js = new x2js()

使用

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
    <el-table :data="tableData" style="width: 100%">
      <el-table-column prop="date" label="日期" width="180"> </el-table-column>
      <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
      <el-table-column prop="newtext"  label="新内容">
        <template slot-scope="scope">
          <el-popover trigger="hover" placement="bottom" @show="showpopver(scope)" width="600">
            <div style="max-height:400px;overflow:auto">
              <code-diff class="center" :old-string="oldSting" :new-string="newString" outputFormat="side-by-side" :drawFileList="true" :context="10000" :isShowNoChange="true"/>
            </div>
            <div slot="reference" class="new">
              <el-tag>{{scope.row.newtext}}</el-tag>
            </div>
          </el-popover>
        </template>
      </el-table-column>
      <el-table-column prop="oldtext"  label="旧内容"> </el-table-column>

    </el-table>
  </div>
</template>

<script>

import  CodeDiff  from 'vue-code-diff'
import JSONViewer from 'vue-json-viewer'
export default {
  name: 'HomeView',
  components: {
    CodeDiff,
    JSONViewer
  },
  data () {
    return {
      tableData: [
        { date: '2016-05-02', name: '王小虎', newtext: '<?xml version="1.0" encoding="GB18030"?> <RESPONSE> <HEAD> <TRCD>ZX10</TRCD> <BRCHNO>000</BRCHNO> <TRDT>WW</TRDT> </HEAD> <BODY> <LIMIT1>HDGUS</LIMIT1> <ROWS> <ROW-1>0</ROW-1> <ROW-2>1</ROW-2> </ROWS> </BODY> </RESPONSE>', oldtext: '<?xml version="1.0" encoding="GB18030"?> <RESPONSE> <HEAD> <TRCD>ZX10XZ</TRCD> <BRCHNO>000</BRCHNO> <TRDT>WW</TRDT> </HEAD> <BODY> <LIMIT1>HDGUS</LIMIT1> <ROWS> <ROW-1>0</ROW-1> <ROW-2>1</ROW-2> </ROWS> </BODY> </RESPONSE>' },
        { date: '2016-05-04', name: '王小虎', newtext: '<?xml version="1.0" encoding="GB18030"?> <RESPONSE> <HEAD> <TRCD>ZX10</TRCD> <BRCHNO>000</BRCHNO> <TRDT>WW</TRDT> </HEAD> <BODY> <ATTRBTE1>GUGU</ATTRBTE1> <LIMIT1>HDGUS</LIMIT1> <ROWS> <ROW-1>0</ROW-1> <ROW-2>1</ROW-2> </ROWS> </BODY> </RESPONSE>', oldtext: '<?xml version="1.0" encoding="GB18030"?> <RESPONSE> <HEAD> <TRCD></TRCD> <BRCHNO>000</BRCHNO> <TRDT>WW</TRDT> </HEAD> <BODY> <ATTRBTE1>GUGU</ATTRBTE1> <LIMIT1>HDGUS</LIMIT1> <ROWS> <ROW-1>0</ROW-1> <ROW-2>1</ROW-2> </ROWS> </BODY> </RESPONSE>' }
      ],
      oldSting: '',
      newString: ''
    }
  },
  methods: {
    showpopver (val) {
      this.newString = JSON.stringify(this.$x2js.xml2js(val.row.newtext), null, 2)
      this.oldSting = JSON.stringify(this.$x2js.xml2js(val.row.oldtext), null, 2)
    }

  }
}
</script>

<style scoped lang="less">
.center {
  line-height: 12px;    //用于解决每行内容后会出现上下图标的情况
  max-height: 600px;
  overflow-y: auto;
  overflow-x: hidden;
}
/* 样式穿透-起始行左右对齐,*/
/deep/ .d2h-wrapper .d2h-code-side-line,
.d2h-wrapper .d2h-code-line {
  height: 18px;
}
</style>

效果

 鼠标移入新内容区域显示比对

差异处会有高亮显示

 

当比较两个内容没有不同时,会不显示,为了能显示出内容建议可以把context值调大

例如    :context="10000"

vue-code-diff 推荐: GitHub - ddchef/vue-code-diff: vue文件差异对比

 

 

Logo

前往低代码交流专区

更多推荐