Vue.js 中动态渲染(v-html)带 data-value 属性的 HTML 元素并获取其值

1,205 阅读2分钟

在 Vue.js 中,我们有时需要根据后端数据动态生成 HTML 元素,并希望这些元素能够包含自定义属性,例如 data-value。然而,直接使用 v-html 指令将动态 HTML 字符串渲染为 Vue 组件的模板是行不通的,因为 Vue 的模板编译不会处理 v-html 中的表达式。那么,我们该如何解决这个问题呢?本文将介绍一个解决方案,并通过示例代码来演示如何动态渲染带 data-value 属性的 HTML 元素并获取其值。

问题描述

假设我们有一个 Vue 组件,其中有一个数据 htmlString,它是一个包含 HTML 标签的字符串,如下所示:

<template>
  <div>
    <!-- htmlString 中包含了带 data-value 属性的 HTML 元素 -->
    <div v-html="htmlString"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      htmlString: '<div class="btn" style="font-size: 16px;cursor:pointer;" :data-value="one">Button 1</div><div class="btn" style="font-size: 16px;cursor:pointer;" :data-value="two">Button 2</div>',
    };
  },
};
</script>

我们希望在点击这些动态生成的 HTML 元素时,能够获取它们各自的 data-value 属性的值。

解决方案

1、在 Vue 组件中,我们不能直接在 v-html 中绑定含有 Vue 表达式的 HTML,因为 Vue 的模板编译不会处理 v-html 中的表达式。因此,我们需要使用事件委托(Event Delegation)的方式来处理点击事件。

2、事件委托是一种在父元素上监听事件,然后通过事件冒泡机制来处理子元素的事件的方法。在我们的示例中,我们可以在父元素上添加点击事件 @click,并在点击事件中使用 event.target 获取点击的具体元素,并从中获取 data-value 的值。

示例代码

<template>
  <div>
    <div v-html="htmlString" @click="handleClick"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      htmlString: '<div class="btn" style="font-size: 16px;cursor:pointer;" :data-value="one">Button 1</div><div class="btn" style="font-size: 16px;cursor:pointer;" :data-value="two">Button 2</div>',
    };
  },
  methods: {
    handleClick(event) {
      const target = event.target;
      const dataValue = target.getAttribute(':data-value');
      if (dataValue) {
        console.log('data-value 的值为:', dataValue);
      }
    },
  },
};
</script>

在上述代码中,我们在父元素的 <div> 上添加了点击事件 @click,并在点击事件的处理方法 handleClick 中,使用 event.target 获取点击的具体元素,并通过 getAttribute('data-value') 方法获取 data-value 的值。

结论

通过使用事件委托的方式,我们成功解决了在 Vue.js 中动态渲染带 data-value 属性的 HTML 元素,并获取其值的问题。通过这种方法,我们可以在动态生成的 HTML 中添加自定义属性,并且能够轻松地获取这些属性的值,实现更灵活和便捷的交互功能。