พื้นหลังสไตล์การผูกข้อมูล Vue.js


93

ฉันพยายามผูก src ของรูปภาพในองค์ประกอบ แต่ดูเหมือนจะไม่ได้ผล ฉันได้รับ "นิพจน์ไม่ถูกต้อง Generated function body: {backgroundImage: {url (image)}"

เอกสารกล่าวว่าจะใช้อย่างใดอย่างหนึ่ง 'Kebab กรณี' หรือ 'อูฐกรณี'

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

นี่คือซอ: https://jsfiddle.net/0dw9923f/2/

คำตอบ:


214

ปัญหาคือค่าสำหรับ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
ณ เดือนมีนาคม 2559 จะต้องเป็นเคสอูฐ ( 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


16

วิธีแก้ปัญหาอื่น:

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

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

อะไรทำให้โซลูชันนี้สะดวกขึ้น ประการแรกมันสะอาดกว่า จากนั้นหากคุณใช้ Vue CLI (ฉันคิดว่าคุณทำ) คุณสามารถโหลดด้วย webpack

หมายเหตุ: อย่าลืมว่าrequire()จะสัมพันธ์กับเส้นทางของไฟล์ปัจจุบันเสมอ


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

มีหลายวิธี แต่ฉันพบว่าสตริงแม่แบบนั้นง่ายและสะดวก


1
มาที่นี่เพื่อโพสต์สิ่งนี้ วิธีที่ดีที่สุดแน่นอนกับ ES6
corysimmons

เทมเพลตตัวอักษร ES5 ดูเหมือนจะเป็นวิธีใหม่ การต่อกันเป็นเรื่องง่อย🤓
zEELz

3

การผูกลักษณะภาพพื้นหลังโดยใช้ค่าไดนามิกจากv-for loop สามารถทำได้เช่นนี้

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

ขออภัยฉันจำไม่ได้ว่าคลิกปุ่มโหวตลงคะแนน ต้องเกิดขึ้นโดยบังเอิญ เลิกทำ
mtsz

@mtsz ไม่ต้องห่วง.
Abdelsalam Shahlol

3

สำหรับองค์ประกอบที่ทำซ้ำเพียงครั้งเดียวเทคนิคนี้ใช้ได้กับฉัน

<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

ฉันประสบปัญหาเกี่ยวกับภาพพื้นหลังที่มีช่องว่างในชื่อไฟล์ที่ทำให้ไม่สามารถใช้สไตล์นี้ได้ เพื่อแก้ไขสิ่งนี้ฉันต้องแน่ใจว่าเส้นทางสตริงถูกห่อหุ้มด้วยเครื่องหมายคำพูดเดี่ยว

สังเกต Escape \ 'ในตัวอย่างของฉันด้านล่าง

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

1

คำตอบที่ยอมรับดูเหมือนจะไม่สามารถแก้ปัญหาให้ฉันได้ แต่สิ่งนี้ทำได้

ตรวจสอบให้แน่ใจว่าการประกาศ backgroundImage ของคุณอยู่ใน url (และใส่เครื่องหมายคำพูดเพื่อให้สไตล์ทำงานได้อย่างถูกต้องไม่ว่าจะเป็นชื่อไฟล์ก็ตาม

ES2015 สไตล์:

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

หรือไม่มี ES2015:

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

ที่มา: vuejs / vue-loader issue # 646


0

จากความรู้ของฉันหากคุณใส่โฟลเดอร์รูปภาพในโฟลเดอร์สาธารณะคุณสามารถทำสิ่งต่อไปนี้:

   <div :style="{backgroundImage: `url(${project.imagePath})`}"></div>

หากคุณใส่ภาพของsrc/assets/คุณคุณต้องใช้ต้องใช้ แบบนี้:

   <div :style="{backgroundImage: 'url('+require('@/assets/'+project.image)+')'}">. 
   </div>

สิ่งสำคัญอย่างหนึ่งคือคุณไม่สามารถใช้นิพจน์ที่มี URL แบบเต็มเช่นนี้project.image = '@/assets/image.png'ได้ คุณต้องฮาร์ดโค้ด'@assets/'ส่วนนี้ นั่นคือสิ่งที่ฉันได้พบ ฉันคิดว่าเหตุผลก็คือใน Webpack บริบทจะถูกสร้างขึ้นหากความต้องการของคุณมีนิพจน์ดังนั้นจึงไม่ทราบโมดูลที่แน่นอนในเวลาคอมไพล์ แต่จะค้นหาทุกอย่างใน@/assetsโฟลเดอร์แทน ข้อมูลเพิ่มเติมสามารถพบได้ที่นี่ นี่คือเอกสารอื่นที่อธิบายถึงวิธีที่ Vue loader ปฏิบัติต่อลิงก์ในคอมโพเนนต์ไฟล์เดียว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.