如何在vue js方法中捕获svg元素悬停事件以及如何将原生javascript悬停事件结合到vue方法

Ale*_*ine 4 svg native mousehover d3.js vue.js

我之前开发过 vuejs + d3.js + jit 库项目。现在,我需要将悬停功能附加到 d3.js svg 元素以显示悬停元素信息的弹出对话框。我按照一些 stackoverflow 说明尝试了很多次。但所有这些都不适合我。这是我的代码片段。

allNodes.append("circle").attr("@mouseover", "console.log('test');");
allNodes.append("circle").attr(":v-on:mouseover", "console.log('dfdfd');");
Run Code Online (Sandbox Code Playgroud)

上面的代码无论如何都不起作用,因为 d3.js 元素是在挂载 vue 组件时渲染的,并且 vue 模板解析器无法编译 v-on、@mouseover 属性。

但下面的代码工作正常。

allNodes.append("circle").attr("onmouseover", "console.log('test');");
Run Code Online (Sandbox Code Playgroud)

所以我想将本机 javascript 函数附加到 vue 方法来显示弹出对话框。

但我不确定如何配置所有项目结构以及将本机函数放置在项目中的位置。

请帮我。

谢谢。

thi*_*utg 5

您可以在Vue 组件对象内定义的.on("mouseover", this.vueMethod)d3 选择中使用。this.vueMethodmethods

new Vue({
  el: "#app",
  data: {
    todos: [
      { text: "Learn JavaScript", done: false },
      { text: "Learn Vue", done: false },
      { text: "Play around in JSFiddle", done: true },
      { text: "Build something awesome", done: true }
    ],
    todoHovered: "hover a circle"
  },
  mounted() {
    const svg = d3.select(this.$refs.chart)
      .append("svg")
        .attr("width", 400)
        .attr("height", 100);
    const circles = svg.selectAll("circle")
      .data(this.todos).enter()
      .append("circle")
        .attr("cx", 10)
        .attr("cy", (d,i) => 10 + i * 15)
        .attr("r", 5)
        .style("fill", d => d.done ? "green" : "red");
    circles.on("mouseover", this.showMessage);
    circles.on("mouseout", (e) => d3.select(e.currentTarget).attr("r", 5));
  },
  methods: {
    showMessage(e, d) {
      d3.select(e.currentTarget).attr("r", 8);
      this.todoHovered = `${d.text} is ${d.done ? 'done' : 'not done'}`;
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v6.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>

<div id="app">
  <div ref="chart">
  </div>
  <p>
    Message: {{ todoHovered }}
  </p>
</div>
Run Code Online (Sandbox Code Playgroud)

  • @djcaesar9114 从版本 [v6.0.0](https://github.com/d3/d3/releases/tag/v6.0.0) 开始,d3 使用事件本身作为 [selection.on](https:/ /github.com/d3/d3-selection/blob/master/README.md#selection_on)。我编辑了答案以反映此更改:“showMessage(d) {...}”变为“showMessage(e, d) {...}”。 (2认同)