如果在 Vue 3 中加载了动态变化的图像,请更改 CSS

Change the CSS if dynamically changing image is loaded in Vue 3

我正在尝试根据是否加载图像来更改 div 的 CSS class。图片 URL 取自 <input> 字段,因此 <img src> 可以更改。我已经设法使用 @load 事件在第一个页面加载时设置了 CSS class。但是,如果我将输入字段中图像的 URL 更改为不存在的图像,则 CSS 不会改变。如何跟踪输入的值是否已更改并“重新检查”图像是否已加载?

在下面的示例中,如果图像存在,我想要 green-bg,如果图像不存在,我想要 red-bg

 <div id="app">

    <div :class="imgLoaded ? 'green-bg' : 'red-bg'">
      <img :src=imgURL @load="imgLoaded = true" />
      <br/>
      <input v-model="imgURL" />
    </div>
    
  </div>
<script>
export default {
  data() {
    return {
      imgURL: 'https://picsum.photos/200/300',
      imgLoaded: false,
    };
  }
};
</script>

Link to CodePen

给你添加输入:

<input type="text" v-model="imgURL" @input="updateURL">

并在方法部分创建函数:

updateURL() {
    this.imgLoaded = false
}

这是使用观察者的好地方。

watch: {
    imgURL(newVal, oldVal) {
      if (newVal !== oldVal) this.imgLoaded = false
    }
  }

挂钩到输入事件也可以,但有一种边缘情况,即新值与旧值相似。如果您随后将 imgLoaded 设置为 false,则 CSS class 不会更改为 green-bg 因为加载事件不会触发(因为 url不变)。

使用观察器时,您可以将旧值与新值进行比较,如果值不同,则仅将 imgLoaded 设置为 false。

这里是 pen.

我设法使用 @error 方法解决了我的问题。 imgLoaded 将在出错时设置为 false,并在加载时设置为 true

<div id="app">

    <div :class="imgLoaded ? 'green-bg' : 'red-bg'">
      <img :src=imgURL @load="imgLoaded = true" @error="imgLoaded = false" />
      <br/>
      <input v-model="imgURL" />
    </div>
    
  </div>

这适用于 CSS class 根据图像是否存在而改变的情况。