Состояние в V-Bind: Стиль - VueJS
У меня есть простой вопрос, на который, я надеюсь, вы могли бы помочь:
<div>
<figure :style="{ 'background': 'url(' + item.main_featured + ') center no-repeat' }">
</div>
Я хочу, чтобы атрибут стиля 'background' возвращал цвет, если URL из API не определен
Пример:
Если item.featured_photo не является нулевым:
<figure style="background: url('localhost:6969/image.img') center no-repeat">
Если item.featured_photo имеет значение null:
<figure style="background: #FFF">
Ответы
Ответ 1
Используйте условие в V-bind: style VueJS:
v-bind:style= "[condition ? {styleA} : {styleB}]"
==>
<figure :style="[item.main_featured ? {'background': 'url(' + item.main_featured + ') center no-repeat'} : {'background': '#FFF'}]">
Если вам нужны родительские-детские условия, то это волшебство:
v-bind:style= "[condition_1 ? condition_2 ? {styleA} : {styleB} : {styleC}]"
Короче говоря:
if (condition_1) {
if (condition_2) {
return styleA
} else {
return styleB
}
} else {
return styleC
}
Надеюсь, поможет!
Ответ 2
Предыдущие ссылки были очень хорошими, но для меня действительно работало следующее:
<input type="text"
v-bind:style=" boolVariable ? 'border: 1px solid orange;' : 'border: none;' ">
В документации: https://vuejs.org/v2/guide/syntax.html#Using-JavaScript-Expressions
С уважением!
Ответ 3
Для этого используйте вычисленное свойство:
<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
}
}
Редактировать:
Я делаю кучу предположений здесь с вашим API и маршрутами. Это грубый удар по его обобщению:
<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'
}
}
Ответ 4
Ответ Feed Git идеален, вот еще один пример с несколькими атрибутами. Просто разделите запятыми:
:style="[printing ? {'margin' : '0px 0px 20px 0px', 'min-height': '830px', 'box- shadow': 'none', 'border': 'none'} : {'margin': '0px 0px 20px 0px', 'min-height': '830px'}]
Форма следует (для кого-то, как я, кто новичок в этом):
:style="[boolVariable ? { true } : { false }]
Ответ 5
Если вы перебираете объект, вы можете использовать метод. В тех случаях, когда стиль зависит от свойства объекта, это единственный вариант, который я нашел... ни один из указанных выше вариантов не работает.
<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''
}
}