Vuejs 中列表对象中文本的样式部分
style part of the text within a list object in Vuejs
我尝试了很多方法来使用 vuejs 中的计算、监视和方法 属性 来设置部分数据对象的样式。我仍然不知道如何才能使 'It is healthy!' 字符串中的 "healthy" 单词变成不同的样式。
<template>
<div='container'>
<div v-for="item in food">
{{ item }}
</div>
</div>
</template>
<script>
export default{
data(){
return{
food: [
{ name: 'fish', message: 'It is great!'},
{ name: 'carrot', message: 'It is healthy!'},
],
}
}
}
</script>
这是一个使用方法拆分每条消息并确定是否应突出显示的工作示例:
<template>
<div class="container">
<div v-for="(value, name) in food" :key="name">
<span v-for="(word, index) in words(value)" :key="index">
<span v-if="isHealthy(word)" class="healthy">{{ word }} </span>
<span v-else>{{ word }} </span>
</span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
food: { fish: 'It is great!', carrot: 'It is healthy!' },
};
},
methods: {
words(string) {
return string.split(/\s+/);
},
isHealthy(string) {
return /healthy/i.test(string);
},
},
};
</script>
<style scoped>
.healthy {
color: red;
}
</style>
以上演示了实现此目的的简单方法 - 您可能会发现它失败的极端情况。您可以想象一个更复杂的 words
版本,它提取包含和不包含单词 "healthy" 的 sub-strings 列表。这将产生更浅的 HTML 结构。
我创建了 CodePen 示例:
HTML:
<div id="app">
<div>
<div v-for="(value, name) in food" v-key="name">
{{ name }}: <span v-html="isHealthy(value)"></span>
</div>
</div>
</div>
CSS:
.healthy {
color: green;
font-weight: 700;
}
JS:
new Vue({
el: "#app",
data: () => ({
food: { fish: 'It is great!', carrot: 'It is healthy!' }
}),
methods: {
isHealthy(str) {
if(str.includes("healthy")) {
return str.replace("healthy", "<span class='healthy'>healthy</span>");
}
return str;
}
}
});
本质上,您需要在单词 "healthy" 上添加某种标识 class。
这就需要修改原来的food
数据。您可以使用 computed
生成新的 highlightedFood
数据,用 <span class="highlight">healthy</span>
替换 "healthy"。您可以简单地在样式标签中设置样式。
<template>
<div id="app">
<div v-for="(item, index) in highlightedFood" :key="index">
<div v-html="item"></div>
</div>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
food: [
{ name: "fish", message: "It is great!" },
{ name: "carrot", message: "It is healthy!" }
]
};
},
computed: {
highlightedFood() {
return this.food.map(item => {
return {
name: item.name,
message: item.message.replace(
"healthy",
"<span class='highlight'>healthy</span>"
)
};
});
}
}
};
</script>
<style>
.highlight {
color: green;
}
</style>
请注意,如果您使用作用域 CSS,则必须使用深度组合器:
<style scoped>
#app >>> .highlight {
color: green;
}
</style>
有关深度选择器的更多信息:https://vue-loader.vuejs.org/guide/scoped-css.html#deep-selectors
我尝试了很多方法来使用 vuejs 中的计算、监视和方法 属性 来设置部分数据对象的样式。我仍然不知道如何才能使 'It is healthy!' 字符串中的 "healthy" 单词变成不同的样式。
<template>
<div='container'>
<div v-for="item in food">
{{ item }}
</div>
</div>
</template>
<script>
export default{
data(){
return{
food: [
{ name: 'fish', message: 'It is great!'},
{ name: 'carrot', message: 'It is healthy!'},
],
}
}
}
</script>
这是一个使用方法拆分每条消息并确定是否应突出显示的工作示例:
<template>
<div class="container">
<div v-for="(value, name) in food" :key="name">
<span v-for="(word, index) in words(value)" :key="index">
<span v-if="isHealthy(word)" class="healthy">{{ word }} </span>
<span v-else>{{ word }} </span>
</span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
food: { fish: 'It is great!', carrot: 'It is healthy!' },
};
},
methods: {
words(string) {
return string.split(/\s+/);
},
isHealthy(string) {
return /healthy/i.test(string);
},
},
};
</script>
<style scoped>
.healthy {
color: red;
}
</style>
以上演示了实现此目的的简单方法 - 您可能会发现它失败的极端情况。您可以想象一个更复杂的 words
版本,它提取包含和不包含单词 "healthy" 的 sub-strings 列表。这将产生更浅的 HTML 结构。
我创建了 CodePen 示例:
HTML:
<div id="app">
<div>
<div v-for="(value, name) in food" v-key="name">
{{ name }}: <span v-html="isHealthy(value)"></span>
</div>
</div>
</div>
CSS:
.healthy {
color: green;
font-weight: 700;
}
JS:
new Vue({
el: "#app",
data: () => ({
food: { fish: 'It is great!', carrot: 'It is healthy!' }
}),
methods: {
isHealthy(str) {
if(str.includes("healthy")) {
return str.replace("healthy", "<span class='healthy'>healthy</span>");
}
return str;
}
}
});
本质上,您需要在单词 "healthy" 上添加某种标识 class。
这就需要修改原来的food
数据。您可以使用 computed
生成新的 highlightedFood
数据,用 <span class="highlight">healthy</span>
替换 "healthy"。您可以简单地在样式标签中设置样式。
<template>
<div id="app">
<div v-for="(item, index) in highlightedFood" :key="index">
<div v-html="item"></div>
</div>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
food: [
{ name: "fish", message: "It is great!" },
{ name: "carrot", message: "It is healthy!" }
]
};
},
computed: {
highlightedFood() {
return this.food.map(item => {
return {
name: item.name,
message: item.message.replace(
"healthy",
"<span class='highlight'>healthy</span>"
)
};
});
}
}
};
</script>
<style>
.highlight {
color: green;
}
</style>
请注意,如果您使用作用域 CSS,则必须使用深度组合器:
<style scoped>
#app >>> .highlight {
color: green;
}
</style>
有关深度选择器的更多信息:https://vue-loader.vuejs.org/guide/scoped-css.html#deep-selectors