uni-app在微信小程序端自定义组件中样式穿透失效
前情
uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app。
坑位
最近因UI有别的事忙,导致手上暂时没什么活了,我于是抽时间优化项目代码,第一件事就是抽取复用组件。正好项目中有多处用到uView的上传组件,上传要处理的逻辑不少,值得封装一下多处复用,在抽组件的过程中我想修改uView的上传组件的样式,对于这种跨组件的样式修改的,当然是用样式穿透了,但另人崩溃的是怎么都不起作用。
Why?
一开始以为是我样式穿透的方式不对,查了文挡,对于uniapp的样式穿有如下几条规则:
- 如果你使用的是css,没有使用css预处理器,则可以使用>>>,/deep/,::v-deep。
- 如果你使用的是less或者node-sass,那么可以使用/deep/,::v-deep都可以生效。
- 如果你使用的是dart-sass,那么就不能使用/deep/,而是使用::v-deep才会生效。
我项目中使用的scss,而且用的是node-scss,我选用是::v-deep,按理说应该是正常的,而且我全局搜了下,我在没有抽组件的另一个页面是成功样式穿透成功的,就排除了是样式穿透的方式不对问题。
经过多翻了解后,是因为我当前开发的是微信小程序端,uniapp最终会把代码转换成微信的wxml/wxss文件跑在微信端,而微信小程序有一个限制,自定义组件的样式只受到自定义组件wxss的影响。

解决方案
在想做样式穿透的组件里增加一个options配置,解除子组件中样式隔离,这样就能样式穿透了。
官方介绍文挡:自定义组件 / 组件模板和样式 (qq.com)
示例代码:
<template>
<view class="upload-item">
<u-upload
:fileList="fileList"
@afterRead="afterRead"
@delete="deletePic"
uploadIcon="plus"
multiple
:maxCount="maxCount"
width="128rpx"
height="128rpx"
/>
</view>
</template>
<script>
export default {
// 解除子组件样式隔离
options: {
styleIsolation: 'shared'
},
name:"uploadItem",
props: {
maxCount: {
type: Number,
default: 5
}
},
data() {
return {
fileList: []
};
},
watch: {
fileList(newVal, oldVal){
console.log('---- newVal ----: ', newVal);
const filterList = newVal.filter((upload) => upload.status === 'success');
this.$emit('change', filterList);
}
},
methods: {
async afterRead(event) {
console.log('---- afterRead ----: ', event);
// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
let lists = [].concat(event.file)
let fileListLen = this.fileList.length
lists.map((item) => {
this.fileList.push({
...item,
status: 'uploading',
message: '上传中'
})
})
// 上传图片
for (let i = 0; i < lists.length; i++) {
const result = await this.uploadFilePromise(lists[i].url)
let item = this.fileList[fileListLen]
this.fileList.splice(fileListLen, 1, Object.assign(item, {
status: 'success',
message: '',
url: result
}))
fileListLen++
}
},
/**
* 图片上传
* @param { string } url
*/
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
// let a = uni.uploadFile({
// url: 'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址
// filePath: url,
// name: 'file',
// formData: {
// user: 'test'
// },
// success: (res) => {
// setTimeout(() => {
// resolve(res.data.data)
// }, 1000)
// }
// });
})
},
deletePic(event) {
console.log('---- deletePic ----: ', e);
this.fileList.splice(event.index, 1);
},
}
}
</script>
<style lang="scss" scoped>
.upload-item{
::v-deep{
.u-upload__wrap__preview {
margin:0 8rpx 8rpx 0!important;
}
.u-upload__button {
margin:0!important;
}
}
}
</style>
uni-app在微信小程序端自定义组件中样式穿透失效的更多相关文章
- uniapp保存图片到本地(APP和微信小程序端)
uniapp实现app端和微信小程序端图片保存到本地,其它平台未测过,原理类似. 微信小程序端主要是权限需要使用button的开放能力来反复调起,代码如下: 首先是条件编译两个平台的按钮组件: < ...
- 微信小程序之自定义组件
在微信小程序项目中 肯定会存在很多功能和样式上相似的部分 面对这种情况 只是单单的ctrl+c ctrl+v 就显得很low了,而且也不便于后期维护那么这时候 使用微信小程序中的自定义组件功能就很合适 ...
- 微信小程序之自定义组件的应用
小程序支持自定义组件,下面是一个简单的购物车组件,实现的效果如图: 效果图 创建组件 在根目录创建components目录,然后创建计数组件 count 如图: 组件内容 <!--compone ...
- 微信小程序:自定义组件
为什么要学习自定义组件? 1.用上我自己的单词abc,我希望在页面中展示椭圆形的图片, 2.打开手机淘宝,假如现在要做一个企业级项目,里面有很多页面,首页存在导航模块,点击天猫,进入第二个页面,而第二 ...
- 微信小程序覆盖自定义组件样式
小程序官方文档明确指出,引入的第三方自定义组件,是不可以对其进行CSS样式覆盖的,但是我们还想要修改怎么办呢?自定义组件时会之定义个外部类,通过这个外部类来修改样式. 修改https://weapp. ...
- 微信小程序:自定义组件的数据传递
一.前言 如果小程序中有可复用的UI且具有一定的功能性,就可以使用自定义组件将其封装起来.下面介绍一个简单的组件和一个复杂的组件. 二.简单的组件(计数器) 1. 组件功能介绍 这个组件常见于外卖软件 ...
- 微信小程序开发---自定义组件
开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用:也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护.自定义组件在使用时与基础组件非常相似. 创建自定义组件 类似于页面, ...
- 微信小程序之自定义组件与使用
一般我们在定义了一个组件之后,为了复用,需要将它导出以提供给其他页面使用. 组件导出的关键字是 exprot default 没有加default时,例如: export class Template ...
- 微信小程序里自定义组件,canvas组件没有效果
methods: { /** * el:画圆的元素 * r:圆的半径 * w:圆的宽度 * 功能:画背景 */ drawCircleBg: function (el, r, w) { const ct ...
- 12.通过微信小程序端访问企查查(采集工商信息)
需要注意的问题: 一.1.微信端访问企查查小程序需要登录.2.访问抓包获取的url是有时效性的过一段时间就不能用了. http://xcx.qichacha.com/wxa/v1/base/getEn ...
随机推荐
- 深入理解JNDI注入—RMI/LDAP攻击
目录 前言 JNDI 注入简单理解 透过Weblogic漏洞深入理解 RMI与LDAP的区别 JNDI+RMI 漏洞代码触发链 lookup触发链 JNDI+LDAP 前言 本篇文章初衷是在研究log ...
- .NET 开源工业级移动端仓库管理系统
前言 在工业生产中,定制化的软件对于每个环节都至关重要.对于仓库管理,推荐一款开源的仓库管理系统(WMS)解决方案. 这款基于.NET 框架开发的移动应用,提供了全面的仓库操作.订单处理.主数据管理. ...
- DML—对表中的数据进行增删改
一.添加数据 1.给指定列添加数据 insert into 表名(列名1,列名2,...) values(值1,值2...); 执行给指定列添加数据前: -- 给指定列添加数据 insert into ...
- Centos LNMP 安装日记
环境介绍 [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) mysql8.0.12_b ...
- uprobe的使用浅析
uprobe是linux内核提供的一种trace用户态函数的机制 可以在不对二进制重新编译的情况下进行trace特定函数 本文描述了uprobe的基本使用方法 使用方法 官方的指引是这样的, 详细的可 ...
- Microsoft 发布 .NET 9 RC 2
距离最终版本还有一个月的时间,Microsoft 已经交付了 .NET 9 的第二个也是最后一个候选版本..NET 团队在公告帖子中写道[1],"当我们为 11 月的 .NET 9 正式发布 ...
- 大模型存储选型 & JuiceFS 在关键环节性能详解
从去年开始,LLM大语言模型领域发展迅速.如 LLaMA.ChatGLM.Baichuan.Qwen 和 yi-model 等基础模型(Foundation Models)的数量显著增加.众多企业也开 ...
- 神经网络之卷积篇:详解残差网络(ResNets)(Residual Networks (ResNets))
详解残差网络 ResNets是由残差块(Residual block)构建的,首先解释一下什么是残差块. 这是一个两层神经网络,在\(L\)层进行激活,得到\(a^{\left\lbrack l + ...
- MP4 转 TXT 项目与 M3U8 下载脚本
项目背景 在当今信息社会,视频学习已成为一种重要的知识获取方式.然而,许多用户在观看视频的过程中,效率往往低于预期.为了提升学习效率,我们决定开发一个将 MP4 视频转换为 TXT 文稿的项目.此外, ...
- KubeKey 升级 Kubernetes 次要版本实战指南
作者:运维有术 前言 知识点 定级:入门级 KubeKey 如何升级 Kubernetes 次要版本 Kubernetes 升级准备及验证 KubeKey 升级 Kubernetes 的常见问题 实战 ...