【问题标题】:VueJS - toggle background image of list item on hoverVueJS - 悬停时切换列表项的背景图像
【发布时间】:2020-01-25 00:30:56
【问题描述】:

我对 Vue 比较陌生,我想知道我的组件有什么问题,我的 isHover 变量(prop?)无法改变鼠标悬停时的背景。

<template>
  <div class="list-wrap" v-if="gridItems">
    <div
      class="list-itme"
      v-for="(item, index) in gridItems"
      :key="index"
      @click.stop="setCurrentLocation(location)"
    >
      <a
        @mouseover="mouseOver(index)"
        @mouseleave="mouseLeave(index)"
        :style="{
          background: isHover 
            ? `url(${item.location_image.thumbnails.large.url})`
            : `url(${item.location_image.thumbnails.largeHover.url})`
        }"
      >
        {{ item.location_name }}
        {{ isHover }}
      </a>
    </div>
  </div>
</template>

<script>

export default {
  name: "GridItems",
  computed: mapState(["filters", "GridItems"]),
  methods: {
    mouseOver(index) {
      this.item[index].isHover = true;
    },
    mouseLeave(index) {
      this.item[index].isHover = false;
    }
  },
  data() {
    return {
      isHover: false
    };
  }
};
</script>

【问题讨论】:

  • 我可以澄清一下,如果鼠标悬停在项目上,您想更改项目的背景图像吗?
  • 既然简单的 CSS 就足够了,为什么还要用 Vue 来做呢?
  • @stephenthomas 因为每个背景图像对于每个项目都是唯一的,通过 API 拉取。
  • @evan 是的,项目的背景图片。图片是通过 api 在循环中设置的,每个项目。
  • @StephenThomas 你说得对,我在示例中愚蠢地使用了颜色来保持简单,但我只是更改了它以反映真实情况。

标签: vue.js mouseover


【解决方案1】:
background: isHover 
        ? `url(${item.location_image.thumbnails.large.url})`
        : `url(${item.location_image.thumbnails.largeHover.url})`

上面的isHover引用了组件的data属性。

您的mouseOver()mouseLeave() 方法正在为this.item[index] 分配一个也称为isHover 的属性。这是两个完全不同的属性。你从哪里得到this.item?我没有看到任何道具或它被声明为数据属性。

编辑

你可以在 gridItem 上有一个isHover 属性。因此,您实际上可以传递item,而不是将index 作为参数传递给鼠标事件方法。然后只需设置item.isHover = true。在样式绑定上,您只需检查 item.isHover

这意味着您不需要组件上的“其他”isHover 数据属性。

【讨论】:

  • 我正在尝试修改我没有构建的组件,所以我不确定。我一直在尝试不同的连接方式,比如盲目的蛞蝓。我能做的最好的就是得到它,所以如果我悬停一个项目,他们都会得到悬停样式。我不确定在哪里将isHover 定义为道具并给它一个默认值false。我也不确定我是否需要导出中的 data() 函数。
  • 我对JS的掌握比较扎实,但是我没有构建应用程序,也没有时间清理以前开发人员的代码。这是一个庞大而复杂的应用程序,我只是想为客户端做一些调整,而不是通过重构有效的东西来为自己创造更多的工作,尽管可能很丑。
  • “重构有用的东西” .. 但它不起作用?无论如何 - 你能不能只使用 CSS 来处理悬停?您可以为组件添加自定义样式。 vuejs.org/v2/guide/single-file-components.html
  • 这个版本坏了,因为我还没有让它工作。我发布了损坏的代码,希望有人能发现一个明显的修复。该组件适用于静态背景图像。是的,对于简单的背景颜色更改,我可以使用 CSS……我在示例中愚蠢地使用它们来尝试简化我的发布代码。我改变了它以反映现实。 bg 图片像url(${item.location_image.thumbnails.large.url})
  • 对,现在更有意义了!我编辑了我的答案。
【解决方案2】:

在您的代码中有几件事需要考虑,用于更改元素背景的 isHover 变量是一个数据属性,但在您的 mouseOvermouseLeave 中,您正在尝试更改isHover 属性来自名为 item 的数组上的元素,该数组未在您发布的代码中声明。需要注意的另一件事是,没有必要在 mouseOver 和 mouseLeave 方法上返回任何内容。

据我了解,您的代码的预期行为是更改您用光标悬停的项目的背景颜色。一些建议,您应该使用类绑定而不是向模板元素添加内联样式,您也可以在 mouseover 和 mouseleave 处理程序上传递项目而不是索引。另一件要提的事情是,如果出于某种原因您需要项目上的 isHover 属性来做其他事情,我只建议这样做,否则您应该使用 CSS :hover 来实现这一点。我做了一个小演示,你可以看看你可以做些什么来让你的代码工作:codepen

编辑

要在将鼠标悬停在某个项目上时更改图像,您应该使用该特定项目的 isHover 属性,而不是您当前用来尝试更改图像 URL 的组件的数据属性 isHover。我更新了我的codepen

【讨论】:

  • 是的,我意识到我可以将 CSS 用于非动态样式...我在示例中愚蠢地使用了十六进制颜色来尝试简化我的发布代码,但实际上,这是一个动态的 bg 图像喜欢url(${location.location_image.thumbnails.large.url})。我在示例中对其进行了更改以反映现实。
  • 好的,你必须使用数组中每个项目的 isHover 属性,我更新了我的答案和 codepen。
  • 感谢您的 codepen。它在那里工作,但唯一的问题是项目对象来自我无权访问的 API,因此我无法将 isHover 属性添加到对象。我可以在循环渲染期间为每个项目添加道具吗?
  • 没问题,是的,您可以将该属性添加到 mouseOver 和 mouseLeave 处理程序上的项目,如下所示:this.$set(item, 'isHover', true)this.$set(item, 'isHover', false),您需要使用 this.$set 才能反应否则它不会使用该更改更新您的组件,请参阅 codepen。
  • 行得通!我把它放在我的 mouseOver() 方法中。虽然有一个控制台错误。 Property or method "isHover" is not defined on the instance but referenced during render.当页面首次渲染时,如何在每个项目上设置初始 isHover 属性?
猜你喜欢
  • 2014-02-27
  • 2015-12-01
  • 2013-01-27
  • 2020-07-24
  • 1970-01-01
  • 2018-10-31
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多