V-bind 中的条件: 样式

我有个简单的问题,希望你能帮忙:

<div>
<figure :style="{ 'background': 'url(' + item.main_featured + ') center no-repeat' }">
</div>

如果来自 API 的 URL 未定义,我希望样式属性“ backing”返回颜色

例如:

如果 item.Features _ photo 不为 null:

<figure style="background: url('localhost:6969/image.img') center no-repeat">

如果 item.Features _ photo 为 null:

<figure style="background: #FFF">
168737 次浏览

Use a computed property for this:

<figure :style="'{ background: `${background}` }'">


...


data () {
return {
item: {
featured_photo: null
}
}
},
computed: {
background () {
return !item.featured_photo ? '#fff' : `url(${item.featured_photo}) center no-repeat`
}
},
methods: {
setPhoto(val) {
this.item.featured_photo = val
}
}

Edit:

I'm making a bunch of assumptions here with your API and routes. This is a rough stab at generalizing it:

<figure :style="'{ background: `${getBackground('main_featured')}` }'">
<figure :style="'{ background: `${getBackground('featured_photo', 1)}` }'">
<figure :style="'{ background: `${getBackground('featured_photo', 2)}` }'">




...


methods: {
async getBackground (type, index) {
let r = await axios.get(`/images/${type}/${index}`).then(r => r.data.background)
return r || '#fff'
}
}

Use condition in V-bind:style VueJS:

v-bind:style= "[condition ? {styleA} : {styleB}]"

Here is the minimal example,

<figure :style="[item.main_featured ? {'background': 'url(' + item.main_featured + ') center no-repeat'} : {'background': '#FFF'}]">

If you need Parent-Child-Conditions, then this is the magic:

v-bind:style= "[condition_1 ? condition_2 ? {styleA} : {styleB} : {styleC}]"

In short of:

if (condition_1) {
if (condition_2) {
return styleA
} else {
return styleB
}
} else {
return styleC
}

Hope it helps!

Feed Git's answer is perfect, here's another example with multiple attributes. Just separate with commas:

:style="[printing ? {'margin' : '0px 0px 20px 0px', 'min-height': '830px', 'box- shadow': 'none', 'border': 'none'} : {'margin': '0px 0px 20px 0px', 'min-height': '830px'}]

The form follows (for someone like me who's new at this):

:style="[boolVariable ? { true } : { false }]

The previous references were very good, but for me what really worked was this:

<input type="text"
v-bind:style=" boolVariable ? 'border: 1px solid orange;' : 'border: none;' ">

In the documentation: https://v2.vuejs.org/v2/guide/syntax.html#Using-JavaScript-Expressions

Regards!

If you're iterating through an object, you can use a method. In such cases when the style is dependent on a property in the object, this is the only option I have found .... none of the options above work.

<div v-for="thing in things">
<div :style="'{ background: `${background(thing)}` }'"></div>
</div>
...


data () {
return {
item: {
featured_photo: null
}
}
},
methods: {
background (thing) {
return thing ? 'red' : 'black'`
}
}

In quasar framework

V-bind:style=" $q.screen.lt.md ? 'height:600px' : ''"

For Background Color you have to pay special attention you can't use

:style="[ isDark ? {background-color: 'black'}: {background-color: 'white'}]"

it won't work you can use the backgroundColor

:style="[ isDark ? {backgroundColor: 'black'}: {backgroundColor: 'white'}]"

this worked for me

<div :style="[ myboolean ? { backgroundImage: `url(${group.backgroundImage.sourceUrl})` } : null ]">

If you want to use not just Boolean conditional but also numbers. this worked for me.

:style="{ transform: `translate(${x}vw)` }"

In case someone needs multiple conditional style bindings on one element use this:

:style="[
condition1 ? { 'width': '50%' } : '',
condition2 ? { 'height' : '20rem' } : ''
]"