Vue.js数据绑定样式backgroundImage不起作用

Cos*_*osX 59 html javascript vue.js

我试图在一个元素中绑定图像的src,但它似乎不起作用.我得到一个"无效的表达式.生成的函数体:{backgroundImage:{url(image)}".

文件说要使用'烤肉串案例'或'驼峰案例'.

<div class="circular" v-bind:style="{ backgroundImage: { url(image) }"></div>

这是一个小提琴:https://jsfiddle.net/0dw9923f/2/

Dav*_*ess 150

问题是需要的值是这样的backgroundImage字符串:

<div class="circular" v-bind:style="{ backgroundImage: 'url(' + image + ')' }"></div>
Run Code Online (Sandbox Code Playgroud)

这是一个简化的小提琴,它起作用:https://jsfiddle.net/89af0se9/1/

Re:关于kebab-case的评论如下,这是你怎么做的:

<div class="circular" v-bind:style="{ 'background-image': 'url(' + image + ')' }"></div>
Run Code Online (Sandbox Code Playgroud)

换句话说,值v-bind:style只是一个普通的Javascript对象,遵循相同的规则.

更新:另一个说明为什么你可能无法让这个工作.

您应该确保image引用您的值,以便最终得到的字符串是:

url('some/url/path/to/image.jpeg')
Run Code Online (Sandbox Code Playgroud)

否则,如果您的图像URL中包含特殊字符(例如空格或括号),则浏览器可能无法正确应用它.在Javascript中,赋值看起来像:

this.image = "'some/url/path/to/image.jpeg'"
Run Code Online (Sandbox Code Playgroud)

要么

this.image = "'" + myUrl + "'"
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这可以在模板中完成,但保持有效HTML所需的转义是不值得的.

更多信息: 引用url()的值真的有必要吗?

  • 截至2016年3月,它还需要是驼峰案例(`backgroundImage`)而不是kebab案例(`background-image`),即使文档说它也可以. (14认同)
  • 如果有人像我一样傻,你可能已经做了 `backgroundImage: image` 而不是 `backgroundImage: 'url('+image+')'`。我对 vue 语法太着迷了,以至于忘记了 `url()`。 (2认同)
  • @David我认为实际上有一个我编写并忘记了的url方法,它确实符合我的期望……真是太好笑了。由于Vue组件位于单独的文件中,因此我无法真正对其进行测试,但是我敢肯定,这毕竟是造成奇怪行为的原因。谢谢! (2认同)

egd*_*vid 21

另一种解决方案:

<template>
  <div :style="cssProps"></div>
</template>

<script>
  export default {
    data() {
      return {
        cssProps: {
          backgroundImage: `url(${require('@/assets/path/to/your/img.jpg')})`
        }
      }
    }
  }
</script>
Run Code Online (Sandbox Code Playgroud)

是什么让这个解决方案更方便?首先,它更干净。然后,如果您使用 Vue CLI(我假设您使用),您可以使用 webpack 加载它。

注意:不要忘记它require()总是相对于当前文件的路径。


moh*_*ari 16

<div class="img-banner" :style="{'background-image': 'url(' + require('./assets/media/baner1.jpg') + ')'}"></div>
Run Code Online (Sandbox Code Playgroud)


Nis*_*hah 11

我在这篇文章中进行了搜索,但没有人发布文件requiredynamic,这就是我发布它的原因。

:style="{ backgroundImage: `url(${require('@/assets/' + banner.image)})` }"
Run Code Online (Sandbox Code Playgroud)


cho*_*aud 8

<div :style="{ backgroundImage: `url(${post.image})` }">
Run Code Online (Sandbox Code Playgroud)

有多种方法,但我发现模板字符串简单易行

  • 来这里是为了发布这个。绝对是 ES6 的最佳方法。 (2认同)

dev*_*kir 8

我尝试了@david 的回答,但它没有解决我的问题。经过一番麻烦之后,我做了一个方法并返回带有样式字符串的图像。

HTML 代码

<div v-for="slide in loadSliderImages" :key="slide.id">
    <div v-else :style="bannerBgImage(slide.banner)"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

方法

bannerBgImage(image){
    return `background-image: url(${image})`;
},
Run Code Online (Sandbox Code Playgroud)