unocss vue中如何根据props提供的icon名来设置icon,注意使用:i="props.icon"的方式unocss不会生成对应的css,如何解决?
时间: 2024-03-04 15:48:07 浏览: 201
要使用`:class`来绑定动态icon类名,然后使用`computed`属性来根据`props.icon`的值生成对应的类名。示例代码如下:
```vue
<template>
<i :class="iconClass"></i>
</template>
<script>
export default {
props: {
icon: {
type: String,
required: true
}
},
computed: {
iconClass() {
return `icon-${this.icon}`;
}
}
}
</script>
```
这里假设`props.icon`的值为`search`,则`iconClass`的值为`icon-search`,从而生成对应的icon样式。注意,这里需要在样式表中定义`.icon-search`的样式。
相关问题
vue中将svg转为字体图标并在css中通过icon-wrapper这种形式使用
在Vue.js中,将SVG转换为字体图标并应用于CSS通常涉及以下几个步骤:
1. **SVG到Font**:
首先,你需要将SVG文件转换为字体文件。可以使用在线工具如IcoMoon、Fontello或者`gulp-svg-iconfont-generator`这样的前端构建工具。将SVG导入工具,生成包含图标字形的CSS样式表和字体文件。
2. **创建字体图标组件**:
创建一个名为`IconWrapper.vue`的组件,作为容器来显示图标。这个组件通常会有一个属性接受字体名称和图标类别,例如:
```html
<template>
<div :class="{'icon-wrapper': true, [iconClass]: true}" :style="{ fontSize: iconSize + 'px' }">
<span class="svg-icon">{{ iconName }}</span>
</div>
</template>
<script>
export default {
props: {
iconClass: { type: String, required: true },
iconSize: { type: Number, default: 24 }, // 可自定义图标大小
},
};
</script>
<style scoped>
.svg-icon {
font-family: 'your-font-name', sans-serif; /* 使用你生成的字体名 */
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
}
</style>
```
3. **在模板中使用**:
在需要显示图标的地方,你可以像下面这样传入图标类别:
```html
<IconWrapper :iconClass="'your-icon-class'" :iconSize="16" />
```
这里`'your-icon-class'`对应你在生成的CSS文件中定义的每个SVG类别的名称。
<template> <homeHeader :class='isclicked1' vuale="朋哟"></homeHeader> <homeHeader :class='isclicked2' vuale="哼哼"></homeHeader><!-- 实习兼职 --> <van-nav-bar> <template #right> <van-icon name="search" size="18" /> </template> </van-nav-bar> <!-- 搜索图标 --> <div> <!-- <router-view> <tabHome :tabCard="tabHome"></tabHome> </router-view> --> <!-- 综合、web --> <van-tabs v-model:active="active"> <van-tab title="综合"> <tab></tab> <SZ_Boss_home></SZ_Boss_home> </van-tab> <van-tab title="web"> <tab></tab> <SZ_Boss_home></SZ_Boss_home></van-tab> </van-tabs> </div> </template> <script> /* import tabHome from '../components/tab.vue' */ import SZ_Boss_home from './SZ_Boss_home.vue' import homeHeader from '../components/homeHeader.vue' import tab from '../components/tab.vue' export default { components: { homeHeader, /* tabHome */ SZ_Boss_home, tab }, data() { return { } }, methods: { } } </script> <style scoped> .top_nav { display: flex; position: absolute; top: 0; left: 0; z-index: 999; } .van-nav-bar { background-image: linear-gradient(to right, rgba(86, 238, 233, 0.24), rgba(230, 144, 168, 0.33)); color: rgb(255, 255, 255); border-bottom: 1px rgba(255, 255, 255, 0.45); } .van-tabs__nav .van-tabs__nav--line { top: 300px; height: 0; } .van-tab { float: right; background-color: rgb(80, 160, 171); } </style>该文件调用了上述子组件,但是为什么vue值不能改变
从您提供的代码来看,我并未发现Vue值不能改变的问题。但是需要注意的是,在您的父组件中,您使用了:class绑定到props属性上,但是props属性是用于从父组件向子组件传递数据的,:class是用于绑定动态的CSS类的,这两者是不同的。如果您想改变子组件的样式,可以在子组件中定义一个data属性,然后使用:class指令将子组件的class属性绑定到该data属性上,然后在父组件中通过props属性传递数据,从而改变子组件的样式。另外,需要确保父组件中传递的props属性名与子组件中定义的props属性名一致,否则子组件无法接收到传递过来的数据。
阅读全文