Vue.js 데이터 바인딩 스타일 backgroundImage가 작동하지 않음


89

요소에서 이미지의 src를 바인딩하려고하는데 작동하지 않는 것 같습니다. "Invalid expression. Generated function body : {backgroundImage : {url (image)}"가 표시됩니다.

문서는 '케밥의 경우'또는 '낙타 경우'를 사용하도록했다.

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

여기 바이올린이 있습니다 : https://jsfiddle.net/0dw9923f/2/

답변:


208

문제는의 값 backgroundImage이 다음과 같은 문자열이어야한다는 것입니다.

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

다음은 작동하는 간단한 바이올린입니다. https://jsfiddle.net/89af0se9/1/

Re : kebab-case에 대한 아래의 코멘트, 이것이 당신이 그것을 할 수있는 방법입니다 :

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

즉,의 값 v-bind:style은 단순한 Javascript 객체이며 동일한 규칙을 따릅니다.

업데이트 : 이것이 작동하는 데 문제가있는 이유에 대한 또 다른 참고 사항입니다.

image최종 결과 문자열이 다음과 같도록 값이 따옴표로 묶여 있는지 확인해야합니다 .

url('some/url/path/to/image.jpeg')

그렇지 않으면 이미지 URL에 특수 문자 (예 : 공백 또는 괄호)가있는 경우 브라우저가이를 제대로 적용하지 못할 수 있습니다. Javascript에서 할당은 다음과 같습니다.

this.image = "'some/url/path/to/image.jpeg'"

또는

this.image = "'" + myUrl + "'"

기술적으로 이것은 템플릿에서 수행 할 수 있지만 유효한 HTML을 유지하는 데 필요한 이스케이프는 그만한 가치가 없습니다.

여기에 더 많은 정보 : url ()의 값을 인용하는 것이 정말로 필요합니까?


15
2016 년 3 월 현재 문서에서 둘 중 하나 일 수 있다고하더라도 backgroundImage케밥 케이스 ( background-image)가 아닌 카멜 케이스 ( ) 여야합니다.
andrewtweber

2
사람이 나 같은 멍청이가 있다면, 당신은 할 수도 backgroundImage: image대신 backgroundImage: 'url('+image+')'. 나는 vue 구문에 너무 매달려서 url().
bendytree

Vue 구성 요소 내에서라고 말하는 것만으로도 효과가 v-bind:style="{ 'background-image': url(image) }"있었지만 구성 요소 외부 (일반 페이지에서만)는 url을 따옴표로 묶어야하는 것처럼 보였습니다. 그 이유를 아는 사람이 있습니까?
Keara

2
@David 실제로 내가 쓰고 잊은 URL 방법이 있다고 생각합니다. 그리고 그것은 내가 기대했던 것과 정확히 일치합니다 ... 꽤 재밌습니다. Vue 구성 요소가 별도의 파일에 있기 때문에 실제로 바이올린에서 테스트 할 수는 없지만 결국 이상한 동작을 일으키는 원인이라고 확신합니다. 감사!
Keara

1
누락 된 따옴표가 내 문제였습니다. 고맙습니다, 여기에서 시간을 낭비하고있었습니다!
DonMB


14

또 다른 해결책 :

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

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

이 솔루션을 더 편리하게 만드는 것은 무엇입니까? 첫째, 깨끗합니다. 그런 다음 Vue CLI를 사용하는 경우 (그렇다고 가정합니다) 웹팩으로로드 할 수 있습니다.

참고 : require()항상 현재 파일의 경로에 상대적 임을 잊지 마십시오 .


4
<div :style="{ backgroundImage: `url(${post.image})` }">

여러 가지 방법이 있지만 템플릿 문자열을 쉽고 간단하게 찾았습니다.


1
이것을 게시하기 위해 여기에 왔습니다. 확실히 ES6에서 가장 좋은 방법입니다.
코리 시몬

ES5 템플릿 리터럴은 새로운 방식으로 보입니다. 연결이 절름발이 🤓
zEELz

3

v-for 루프 의 동적 값을 사용하여 배경 이미지 스타일을 바인딩하는 방법은 다음과 같습니다.

<div v-for="i in items" :key="n" 
  :style="{backgroundImage: 'url('+require('./assets/cars/'+i.src+'.jpg')+')'}">
</div>

죄송합니다. 반대표 버튼을 클릭 한 기억이 없습니다. 우연히 일어난 게 틀림 없어. 푼.
mtsz

@mtsz 걱정 마세요.
Abdelsalam Shahlol

2

단일 반복 구성 요소의 경우이 기술이 나를 위해 작동합니다.

<div class="img-section" :style=img_section_style >

computed: {
            img_section_style: function(){
                var bgImg= this.post_data.fet_img
                return {
                    "color": "red",
                    "border" : "5px solid ",
                    "background": 'url('+bgImg+')'
                }
            },
}

2

@david 답변을 시도했지만 문제가 해결되지 않았습니다. 많은 번거 로움 끝에 메서드를 만들고 스타일 문자열로 이미지를 반환합니다.

HTML 코드

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

방법

bannerBgImage(image){
    return 'background-image: url("' + image + '")';
},

1

파일 이름에 공백이있는 배경 이미지에서 스타일이 적용되지 않는 문제가 발생했습니다. 이 문제를 해결하기 위해 문자열 경로가 작은 따옴표로 캡슐화되었는지 확인해야했습니다.

아래의 예제에서 이스케이프 된 \ '에 유의하십시오.

<div :style="{
    height: '100px',
    backgroundColor: '#323232',
    backgroundImage: 'url(\'' + event.image + '\')',
    backgroundPosition: 'center center',
    backgroundSize: 'cover'
    }">
</div>

0

받아 들여진 대답이 문제를 해결하지 못하는 것 같았지만 이것은

backgroundImage 선언이 url (및 따옴표로 묶여 있는지 확인하여 파일 이름에 관계없이 스타일이 올바르게 작동하는지 확인하십시오.

ES2015 스타일 :

<div :style="{ backgroundImage: `url('${image}')` }"></div>

또는 ES2015없이 :

<div :style="{ backgroundImage: 'url(\'' + image + '\')' }"></div>

출처 : vuejs / vue-loader 문제 # 646

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.