我在A组件中设置了文本框的样式,跳转到B组件中,B组件中的文本框为什么也变成了新样式,但是刷新一下B组件,则B组件中的文本框则重新变成了原本的样式,请问如何解决两个组件中的文本框的样式互相干扰的问题?
这是因为 Vue 组件共享了同一个样式表,而你在 A 组件中设置的样式会影响到整个应用中的所有文本框,包括 B 组件中的文本框。
为了解决这个问题,你可以在 A 组件中将文本框的样式限定在该组件的作用域内,方法是使用 scoped 属性来限定样式的作用范围,示例如下:
<template>
<div class="a-component">
<input type="text" class="text-input">
</div>
</template>
<style scoped>
.a-component .text-input {
/* A 组件中文本框的样式 */
}
</style>
这样设置之后,A 组件中的文本框样式只会影响到 A 组件本身,而不会影响到其他组件,包括 B 组件。
如果你需要在多个组件中共享相同的样式,你可以将样式提取到一个单独的样式表文件中,然后在需要使用该样式的组件中引入,例如:
/* 在一个单独的样式表文件中定义文本框的样式 */
.text-input {
/* 共享的文本框样式 */
}
<template>
<div class="a-component">
<input type="text" class="text-input">
</div>
</template>
<style>
@import "path/to/shared-styles.css";
/* A 组件中使用共享样式 */
</style>
<template>
<div class="b-component">
<input type="text" class="text-input">
</div>
</template>
<style>
@import "path/to/shared-styles.css";
/* B 组件中使用共享样式 */
</style>
这样设置之后,多个组件可以共享同一个样式表文件中定义的样式,但是样式仍然会被限定在各自组件的作用域内,不会相互干扰。
可是这个文本框是element的文本框组件,如果我在A组件中加了scoped,那就无法影响到文本框的样式了
@天亦玄: element 的文本框组件样式你想要影响,又在你自己组件里面写的就不能用 scoped来限制样式作用域。又想要达到不影响其他组件,那么最好通过后代选择器来限制作用域的范围。
A组件样式加上这个 scoped
<style scoped></style>
加了之后,文本框的样式就无效了
A、B组件里的style标签都加上 scoped标记,可以防止组件间的样式干扰。
如果加上scoped后样式失效,可能是样式的优先级不够,class不行就id,或者样式后面加上 !important 设置为顶级。