【vue】对比两个对象的差异并在页面标记

在这里插入图片描述
如上demo,当text的内容发生变化时,会将变化标记变红,代码如下:

HTML页面,给元素动态绑定ref

    <div id="app" class="flex">
      <div class="container flex">
        <!-- 上一个版本内容 -->
        <div class="container-left flex">
          <h3>上一个版本</h3>
          <p v-for="item in lastVersions">{{ item.text }}</p>
        </div>
        <!-- 当前版本内容 -->
        <div class="container-right flex">
          <h3>当前版本</h3>
          <p v-for="item of currentVersions" :ref="item.key">{{ item.text }}</p>
        </div>
      </div>
    </div>

使用了lodash工具库的_.transform和_.isEqual方法

    <script>
      const vm = new Vue({
        el: "#app",
        data: {
          lastVersions: [
            {
              text: "文本1",
              key: "text1",
            },
            {
              text: "文本2",
              key: "text2",
            },
            {
              text: "文本3",
              key: "text3",
            },
          ],
          currentVersions: [
            {
              text: "文本1 -- change",
              key: "text1",
            },
            {
              text: "文本2",
              key: "text2",
            },
            {
              text: "文本3",
              key: "text3",
            },
          ],
        },

        created() {
          this.renderDiff();
        },

        methods: {
          // 渲染
          renderDiff() {
            const res = this.difference(
              this.currentVersions,
              this.lastVersions
            );

            res.forEach((item) => {
              this.$nextTick(() => {
                this.$refs[item.key][0].className = "change-color";
              });
            });
          },
          // 比较差异,使用了lodash工具库的_.transform和_.isEqual方法
          difference(object, base) {
            function changes(object, base) {
              return _.transform(object, function (result, value, key) {
                if (!_.isEqual(value, base[key])) {
                  result[key] = value;
                }
              });
            }
            return changes(object, base);
          },
        },
      });
    </script>

样式

    <style>
      html,
      body,
      #app {
        margin: 0;
        height: 100%;
      }

      .flex {
        display: flex;
        align-items: center;
        justify-content: center;
      }

      .container {
        width: 600px;
        height: 300px;
        border: 2px solid gray;
      }

      .container-left,
      .container-right {
        flex-direction: column;
        flex: 1;
        height: 100%;
      }

      .container-left {
        border-right: 1px dashed gray;
      }

      .change-color {
        color: red;
      }
    </style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值