🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # view 与 block 两者的区别是,`<view>` 是一个组件,会在页面上做渲染;`<block>`不是一个组件,它仅仅是一个包装元素,只接受控制属性,不会在页面中做任何渲染。下面是两个`<block>` 使用的例子: `wx:if` ``` <block wx:if="{{true}}"> <view> text </view> <view> text </view> </block> ``` `wx:for` ``` <block wx:for="{{[1, 2, 3]}}"> <view> {{index}}: </view> <view> {{item}} </view> </block> ``` `wx:elif` 和 `wx:else` ``` <block wx:if="{{boolean==true}}"> <view class="bg_black"></view> </block> <block wx:elif="{{boolean==false}}"> <view class="bg_red"></view> </block> <block wx:else> <view class="bg_red"></view> </block> ``` # 小程序-[创建组件](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/) 小程序创建组件,一个组件由4个文件组成,和创建页面类似。包含:`json、wxml、wxss、js`文件。 卡槽 均用 `<slot></slot>` `properties` 相当于是 vue 的 `props`,通过该属性,外界向组件内传入数据。组件的对外属性,是属性名到属性设置的映射表,属性设置中可包含三个字段, `type` 表示属性类型、 `value` 表示属性初始值、 `observer` 表示属性值被更改时的响应函数 `data` 组件的内部数据,和`properties`一同用于组件的模版渲染。也就是说,通过 `this.data` 可以同时获得 `data` 和 `properties` `behaviors` 类似于mixins和traits的组件间代码复用机制,参见[`behaviors`](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/behaviors.html) `relations` 否组件间关系定义,参见[`组件间关系`](https://cloud.tencent.com/developer/article/1029113) [微信小程序 发现之旅(三)—— 组件之间的参数传递](https://www.cnblogs.com/wisewrong/p/9110687.html) # 子组件 ## 页面编译的子组件代码渲染截图: ![页面编译的子组件代码渲染截图:](https://box.kancloud.cn/ebb368174b8b5fe3c57767079ab77089_1278x466.png) 上图红框部分就是小程序子组件编译后的页面,子组件引入的标签不会被拆解,里面还会自动生成一个叫做“`#shadow-root`”的层,用于隔绝父组件的元素 `class类` 和子组件的元素 `class类`,所以同一个类样式在子组件的使用,都需要重新在子组件中定义样式,这时候缺点就暴露了,很多我们定义的共用样式类在这种渲染模式下是无法使用的,遗憾有之~。如果复杂组件又引用超级多共用样式的,就会造成很多css的代码冗余。但是……,塞翁失马焉知非福!用着用着就发现了一大好处,这种隔离,对于弹框等就算组件复杂,父子组件业务偶尔比较低的情况,开发子组件非常有利,比如:多个弹框,弹框嵌弹框也可以直接写在子组件,因为`#shadow-root` 会自行做隔离。另:子组件内的标签(`a`,`button`,`li`等)样式是可以复用公共定义,无需重写 # 影子节点ShadowDOM https://juejin.im/post/59f2ef2d6fb9a045076ee831 # 参考 [微信小程序組件封裝](https://hk.saowen.com/a/aaa7c8df80e5d76e8fb77a153c9ed29e1e07cfefb907748de4b0cacea1cc3634)