赞
踩
这篇文章图片不清晰?请移步 segmentfault 点击查看相同文章
Ant Design Vue地址:https://www.antdv.com/docs/vue/introduce-cn/
刚接触Ant Design Vue的童鞋们可能会有这样的问题,不就是修改默认的组件样式吗,为什么一会生效,一会又不生效。希望看完这个文章,会给你一些收获~
渲染在当前页面内部
,还是脱离vue根节点
单独渲染?(根节点默认id=“app”)这个问题的答案很容易得到,打开文章顶部的antdv官方文档,任意选中组件,F12打开调试,观察Elements,例如:
1、不难看出,button是渲染在当前页面内部的,包裹在"#app"的容器里
。这样的组件还有很多,比如input、radio等等。再看下面这张图:
2、dropdown组件则是一部分渲染在#app内,一部分渲染在"#app"的外面
且与"#app"同级。这样的组件也有很多,比如select、drawer等等
3、dropdown等,我们发现它们的共同点:这些组件都是“触发型”组件,都是由用户hover、click等手动激活后,进行了动态渲染的
第二类组件,class类名设置的仅仅是#app内部元素,而渲染在#app之外的那部分节点,需要单独设置类名
,比如 tooltip,我们设置overlayClassName="overlay-class"来测试:
我们发现类名已经设置好了。这一条解决了 没有对应到自己的父级类会造成的样式不生效
的问题
不同组件设置的属性名称不完全相同,使用时去查阅文档就可以了
开发时,我们会根据需要设置每个页面、组件css 的 scoped属性
,众所周知,这个属性是为了限制css只被当前vue文件所使用
,那它是如何实现这个限制的呢?
我们任意打开一个scoped的页面,打开调试
我们在elements中打开对应scoped的css文件,看下实际书写和渲染出来
的对应关系:
.override {
padding: 100px 100px 200px 100px;
}
/* 按钮 */
.test-button {
background: pink;
border: 0;
}
.ant-btn-primary {
background: #ccc;
border: 0;
}
/* 面包屑 */
.container >>> .ant-breadcrumb-separator {
margin: 10px;
}
.container /deep/ .ant-breadcrumb-separator {
margin: 30px;
}
发现了这一点之后,我们不需要去管是什么页面,用的什么组件,只需要打开Elements面板,观察你要写的节点class,有没有这个“标识”
。
.parentClass >>> .sonClass
.parentClass /deep/ .sonClass
那实际使用时,如果parentClass所在的节点本身是不带 “标识” 的怎么办?
例如,antd vue的组件,渲染在#app外部,已经按照第一条给了自定义的类名wrapClassName,但是这个wrapClassName我们仍然无法使用,因为它所在的div并没有这个“标识”(极少数情况会出现)
这时我们拿出了终极武器,
<div ref="wrap">
<a-modal
v-model="visible"
title="Basic Modal"
@ok="handleOk"
class="test"
:getContainer="() => this.$refs.wrap"
>
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</a-modal>
</div>
通过设置组件的 getContainer
属性(有的组件是 getPopupContainer
),我们将原本渲染在#app外部的节点,手动挂载到了#app内部,之后再通过第二条的规则去设置就可以啦~
也可以不指定ref,直接设置 :getContainer="triggerNode => triggerNode.parentNode"
默认找到#app内部的父节点
没有父级类
的问题(单独通过属性设置)scoped造成的没有对应到父级类
的问题(根据节点“标识”情况使用 >>> 或 /deep/)没有父级类可以设置
的问题(手动更改渲染规则)前两条操作的是类名样式,第三条操作的是节点,小编觉得能通过前两条解决的,尽量就不用第三条了(盲猜会影响性能吧,欢迎一起交流探讨)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。