当前位置:   article > 正文

微信小程序自定义组件学习笔记_styleisolation: 'shared

styleisolation: 'shared

目录

一、创建自定义组件

第一步:先创建一个文件夹

 第二步:右击该文件夹新建一个component

 二、自定义组件的使用(局部使用和全局使用)

1.局部使用

2.全局使用

三、组件和页面的区别

 四、组件样式隔离特性

1.样式隔离特性

2.修改组件样式隔离特性

第一种:在.js文件中加上:‘styleIsolation’,这三个参数对应的是不同的影响

第二种:在.json文件中加上:‘styleIsolation’,参数也是类似于上面的配置方法

五、组件的data和methods

 六:自定义组件的properties属性

第一种:简化方法,值+数据类似

第二种:可以带默认值

七、data和properties的区别

 八、数据监听器(类似于vue的watch)

1.语法格式

2.小案例:监听新值计算出新的和

3.监听对象身上的属性值

4.observers监听案例

九、纯数据字段 

 纯数据字段使用规则:

 利用纯数据字段改造observers监听案例,提高性能

十、 自定义组件的生命周期函数

1.主要的周期函数

1.1.created,在组件实例刚刚被创建时执行

1.2.attached, 在组件实例进入页面节点树时执行

1.3.detached, 在组件实例被从页面节点树移除时执行

2.定义周期函数

3.组件所在页面的生命周期

 十一、插槽

1.使用单个插槽

 2.使用多个插槽

 十二、组件间的通信

1.父向子传递数据(属性绑定)

2.子向父传递数据(事件绑定)

3.获取子组件示例(父组件直接访问子组件数据)

十三、组件中的behaviors 

 1.创建behaviors 

 2.导入使用behaviors

 3.behaviors可用的节点


一、创建自定义组件

首先在项目目录中新建一个components的文件夹

 然后在该文件夹中创建自定义的组件,为了项目结构更加清晰,每个自定义组件单独一个文件夹存放

第一步:先创建一个文件夹

 第二步:右击该文件夹新建一个component

 自定义组件就创建好了

 二、自定义组件的使用(局部使用和全局使用)

1.局部使用

首先我们要在需要引用的页面的json文件中加入组件的配置项:usingComponents

  1. "usingComponents": {
  2. "my_test1":"/components/test1/test1"
  3. }

 这里的my_test1是组件的名字(就是我们要在页面中使用的标签名字)后面是自定义组件的路径

在home页面中使用:

 可以看到组件引用成功了

2.全局使用

首先要在项目的总配置文件app.json中创建对应的配置,其和局部使用一样的

 这样配置后我们在任何页面中都可以使用该组件了

三、组件和页面的区别

其实乍一看组件和页面好像长的非常的像,一样的结构,都有json、js、wxml、wxss这些文件,但其实组件和页面还是有一些区别的,可以从下面三个方面体现出来

1. 组件的.json文件中必须声明:  "component": true,而页面的文件中是不需要声明的

 2.组件的.js文件调用的是Compent函数

 而页面使用的是Page函数

 3.组件的事件处理函数需要写到methods列表中,而页面只需要跟其他的生命周期函数同级即可

 四、组件样式隔离特性

1.样式隔离特性

我们在全局样式中定义的样式,在组件中是无法生效的,这就是组件样式的隔离

 但是存在一些个例会造成影响,像这种标签形式的会造成影响

 所以在开发过程中尽量使用class选择器和id选择器,少使用标签选择器

2.修改组件样式隔离特性

这里有二种方法,一种是在组件的.js文件中进行修改,一种是在.json文件中进行修改

第一种:在.js文件中加上:‘styleIsolation’,这三个参数对应的是不同的影响

 

  1. options:{
  2. styleIsolation:'shared'
  3. //开启隔离(默认):isolated
  4. //apply-shared :单向影响 页面样式影响组件,但是组件不影响页面
  5. //shared :双向奔赴,互相影响
  6. },

第二种:在.json文件中加上:‘styleIsolation’,参数也是类似于上面的配置方法

 详情配置可以参考官方文档:组件模板和样式 | 微信开放文档 (qq.com)

五、组件的data和methods

data顾名思义是用来存放数据的,methods是用来写事件处理函数或方法的

 在methods中编写一个事件处理函数,实现点击按钮数据增加的效果

wxml:

  1. <view>Count的值为:{{count}}</view>
  2. <button bindtap="addCount">+1</button>

js:

  1. data: {
  2. count:1
  3. },
  4. /**
  5. * 组件的方法列表
  6. */
  7. methods: {
  8. addCount(){
  9. this.setData({ count:this.data.count+1})
  10. this._showCount()
  11. },
  12. _showCount(){
  13. wx.showToast({
  14. title: 'count的值为'+this.data.count,
  15. icon:'none'
  16. })
  17. }
  18. }

实现的效果如下:可以点击增加数据并显示提示框

 六:自定义组件的properties属性

properties是组件的对外属性,用来接收外界传递给组件的数据,类似于vue的props,其定义方法也与vue类似。

第一种:简化方法,值+数据类似

  1. //第一种简化方式
  2. max:Number

第二种:可以带默认值

  1. //第二种方式 可以指定默认值
  2. max:{
  3. type:Number,
  4. value:10
  5. }

使用:

七、data和properties的区别

在vue中,我们一般规定props里面的值是只读的,不建议去修改它,那么在小程序中他们又有什么区别呢?一起来看看吧

 

 

 

 可以看到上面的打印结果显示完全是一样的,甚至用‘===’符也是true,可以看到他们俩的本质是一样的,他们存放的数据是对方共有的数据,在访问时也可以直接互相访问,而且当data中也存在和properties一样的数据时,properties中的优先级要比data高

 所以对于properties我们也是可以进行可读可写操作的,读也是类似与data,使用{{properties}}即可,对于修改也就是类似于data的setData

  1. this.setData({count:this.properties.count+1})
  2. this.setData({max:this.data.max+1})

注意看我的代码片段,count原本是在data中的,但是properties也可以访问,并且能做到修改的效果 

 八、数据监听器(类似于vue的watch)

数据监听器类似于vue中的watch监听器,它可以监听数据的变化,从而进行一些必要的操作

1.语法格式

在组件的js文件与data同级,新建一个observers

  1. //数据监听器
  2. observers:{
  3. '字段A,字段B':function(字段A的新值,字段B的新值){
  4. //do something
  5. }
  6. }

这里要注意的是它只有最新值,没有旧值

2.小案例:监听新值计算出新的和

wxml:

  1. <view>{{n1}} + {{n2}} = {{sum}}</view>
  2. <button bindtap="addN1">n1+1</button>
  3. <button bindtap="addN2">n2+1</button>

js:

  1. data: {
  2. n1:0,
  3. n2:0,
  4. sum:0
  5. },
  6. methods: {
  7. addN1(){
  8. this.setData({n1:this.data.n1+1})
  9. },
  10. addN2(){
  11. this.setData({n2:this.data.n2+1})
  12. }
  13. },
  14. //数据监听器
  15. observers:{
  16. 'n1, n2':function(n1,n2){
  17. //do something
  18. this.setData({sum:n1+n2})
  19. }
  20. }

实现效果:

 3.监听对象身上的属性值

语法格式:像这样即可

该方法的监听触发条件:

  • name属性发生变化
  • age属性发生变化
  • user对象发生变化
  1. observers:{
  2. 'user.name, user.age':function(name,age){
  3. //do something
  4. console.log(name);
  5. console.log(age);
  6. }
  7. }

修改的函数:

  1. this.setData({user:{
  2. ...this.data.user,
  3. name:'ls'
  4. }})

 可以看到已经监听到了新变化

4.observers监听案例

案例效果:点击按钮改变盒子的rgb的值,从而改变盒子的颜色

wxml:

 

  1. <view style="background-color: rgb({{fullColor}});" class="colorBox">颜色值:{{fullColor}}</view>
  2. <button size="mini" type="default" bindtap="changeR">R</button>
  3. <button size="mini" type="primary" bindtap="changeG">G</button>
  4. <button size="mini" type="warn" bindtap="changeB">B</button>

wxss:

  1. .colorBox{
  2. line-height: 200rpx;
  3. font-size: 24rpx;
  4. color: white;
  5. text-shadow: 0rpx 0rpx 2rpx black;
  6. text-align: center;
  7. }

js:

  1. data: {
  2. rgb:{
  3. r:0,
  4. g:0,
  5. b:0
  6. },
  7. fullColor:'0, 0, 0'
  8. },
  9. /**
  10. * 组件的方法列表
  11. */
  12. methods: {
  13. changeR(){
  14. this.setData({'rgb.r':this.data.rgb.r + 5 > 255 ? 255 : this.data.rgb.r + 5})
  15. },
  16. changeG(){
  17. this.setData({'rgb.g':this.data.rgb.g + 5 > 255 ? 255 : this.data.rgb.g + 5})
  18. },
  19. changeB(){
  20. this.setData({'rgb.b':this.data.rgb.b + 5 > 255 ? 255 : this.data.rgb.b + 5})
  21. }
  22. },
  23. observers:{
  24. // 'rgb.r, rgb.g, rgb.b':function(r, g, b){
  25. // this.setData({fullColor:`${r},${g},${b}`})
  26. // },
  27. //使用通配符 ** 监听对象的所有属性变化
  28. 'rgb.**':function(obj){
  29. this.setData({fullColor:`${obj.r},${obj.g},${obj.b}`})
  30. }
  31. }

该案例利用了点击事件改变rgb的属性值,然后通过监听事件来让盒子的颜色及时发生变化

九、纯数据字段 

纯数据字段就是指不用于页面渲染的data数据,也不会传递给其他组件,仅仅在当前组件内部使用。就像上面的observers案例中的:“rgb”那样没有用到页面渲染中,只是参与了逻辑运算,纯数据字段的优点就是有利于提升页面刷新的性能rgb

 纯数据字段使用规则:

在js中options下定义pureDatePrttern

  1. options:{
  2. // 指定所有以 _开头的字段为纯数据
  3. pureDataPattern:/^_/
  4. },

这样做了之后,凡是以"_"开头的数据都不会被用于渲染页面中

  1. //data:
  2. a:1,
  3. _b:2
  4. //wxml
  5. <text>{{a}}</text>
  6. <text>{{b}}</text>

页面中只渲染了a的数据值,而b并没有被渲染出来 

 利用纯数据字段改造observers监听案例,提高性能

首先是定义好使用规则,然后将所有的rgb全部替换成_rgb即可,这样一来就可以提高页面的渲染性能了,具体可参考官方文档:纯数据字段 | 微信开放文档 (qq.com)

十、 自定义组件的生命周期函数

组件所在页面的生命周期

生命周期参数描述最低版本
created在组件实例刚刚被创建时执行1.6.3
attached在组件实例进入页面节点树时执行1.6.3
ready在组件在视图层布局完成后执行1.6.3
moved在组件实例被移动到节点树另一个位置时执行1.6.3
detached在组件实例被从页面节点树移除时执行1.6.3
errorObject Error每当组件方法抛出错误时执行2.4.1

1.主要的周期函数

1.1.created,在组件实例刚刚被创建时执行

  • 此时还不能调用setData
  • 通常在这个生命周期函数中,只应该用于给组件的this挂载一些自定义的属性字段

1.2.attached, 在组件实例进入页面节点树时执行

  • 此时, this.data已被初始化完毕
  • 这个生命周期很有用,绝大多数初始化的工作可以在这个时机进行(例如发请求获取初始数据) 

1.3.detached, 在组件实例被从页面节点树移除时执行

  • 退出一个页面时,会触发页面内每个自定义组件的detached生命周期函数
  • 此时适合做一些清理性质的工作
     

2.定义周期函数

旧版的方法现在官方已经不推荐了,下面可以看到已经差不多被移除了

所以我们直接采用最新的方式:所有的周期函数都放在lifetimes

 3.组件所在页面的生命周期

还有一些特殊的生命周期,它们并非与组件有很强的关联,但有时组件需要获知,以便组件内部处理。这样的生命周期称为“组件所在页面的生命周期”,在 pageLifetimes 定义段中定义。

生命周期参数描述最低版本
show组件所在的页面被展示时执行2.2.3
hide组件所在的页面被隐藏时执行2.2.3
resizeObject Size组件所在的页面尺寸变化时执行2.4.0
routeDone组件所在页面路由动画完成时执行2.31.2

代码示例:

  1. Component({
  2. pageLifetimes: {
  3. show: function() {
  4. // 页面被展示
  5. console.log('show');
  6. },
  7. hide: function() {
  8. // 页面被隐藏
  9. console.log('hide');
  10. },
  11. resize: function(size) {
  12. // 页面尺寸变化
  13. }
  14. }
  15. })

 当页面展示时:

 切换页面后:

 十一、插槽

插槽的作用其实就是充当一个占位符的作用,当我们复用组件时但是有一部分的内容是不一样的,这时候就可以使用插槽来实现

 

1.使用单个插槽

 组件的wxml:

  1. <view>
  2. <text>组件内部结构</text>
  3. <slot></slot>
  4. </view>

页面的wxml:

  1. <my_test4>
  2. <view>这是通过插槽填充的内容</view>
  3. </my_test4>

 2.使用多个插槽

首先需要在js中进行配置

  1. Component({
  2. options:{
  3. multipleSlots:true // 开启多个插槽的使用
  4. }
  5. }

因为有多个插槽我们在使用过程中肯定不能混淆,需要进行一定的区分

可以在slot中设置name

  1. <view>
  2. <text>组件内部结构</text>
  3. <slot name="before"></slot>
  4. <slot name="after"></slot>
  5. </view>

使用时进行必要的区分

  1. <my_test4>
  2. <view slot="before">这是before插槽填充的内容</view>
  3. <view slot="after">这是after插槽填充的内容</view>
  4. </my_test4>

这样就能对其进行区分了

 十二、组件间的通信

在开发过程中,组件之间互相传递参数是必不可少的,也是非常重要的部分

1.父向子传递数据(属性绑定)

!!!父组件向子组件的指定属性设置数据,仅能设置 JSON 兼容数据

使用案例:父组件将数据传递给子组件

  1. <view>父组件中的count的值:{{count}}</view>
  2. <my_test5 count="{{count}}"></my_test5>

 子组件在js中定义properties接收

  1. properties: {
  2. count:Number
  3. },

子组件中使用count

<view>父组件传递过来的count值:{{count}}</view>

 效果:

 

2.子向父传递数据(事件绑定)

先在父组件中定义一个事件

  1. syncCount(e){
  2. console.log('syncCount');
  3. console.log(e);
  4. },

将该方法传递给子组件

  1. <view>父组件中的count的值:{{count}}</view>
  2. <my_test5 count="{{count}}" bind:sync="syncCount"></my_test5>

 子组件写一个名为:sync的事件触发函数

  1. methods: {
  2. addCount(){
  3. //触发自定义事件
  4. this.triggerEvent('sync',{val:"son"})
  5. }
  6. }

 当触发事件时,父组件就可以接受到传输过去的数据val

 打印出来可以看到我们需要的数据在detail中,所以只要e.detail即可拿到数据

3.获取子组件示例(父组件直接访问子组件数据)

 首先给组件一个类名class

 然后可以定义一个方法获取到子组件实例对象

  1. getChild(){
  2. const child = this.selectComponent('.child')
  3. console.log(child);
  4. child.setData({
  5. count:child.properties.count + 1 // 修改子组件数据
  6. })
  7. },

打印结果可以看到子组件的数据及方法都获取到了

 所以我们可以直接获取到子组件的数据,甚至是使用它其中的方法进行修改

十三、组件中的behaviors 

behaviors 是用于组件间代码共享的特性,类vue似于一些编程语言中的 “mixins(vue)” 或 “traits”。每个 behavior 可以包含一组属性、数据、生命周期函数和方法。组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。 每个组件可以引用多个 behavior ,behavior 也可以引用其它 behavior 。

 1.创建behaviors 

项目目录中创建behaviors 文件夹及js文件

 代码示例:(共享代码)

  1. module.exports = Behavior({
  2. data:{
  3. username:'zs'
  4. },
  5. properties:{},
  6. methods:{}
  7. })

2.导入使用behaviors

在需要使用的组件的js中最上层导入behaviors

const myBehavior= require('../../behaviors/my-behavior')

在Component中接收数据

behaviors:[myBehavior],

在组件中使用

<text>myBehavior中的用户名:{{username}}</text>

 3.behaviors可用的节点

定义段类型是否必填描述最低版本
propertiesObject Map组件的对外属性,是属性名到属性设置的映射表
dataObject组件的内部数据,和 properties 一同用于组件的模板渲染
observersObject组件数据字段监听器,用于监听 properties 和 data 的变化,参见 数据监听器2.6.1
methodsObject组件的方法,包括事件响应函数和任意的自定义方法,关于事件响应函数的使用,参见 组件间通信与事件
behaviorsString Array类似于mixins和traits的组件间代码复用机制,参见 behaviors
createdFunction组件生命周期函数-在组件实例刚刚被创建时执行,注意此时不能调用 setData )
attachedFunction组件生命周期函数-在组件实例进入页面节点树时执行)
readyFunction组件生命周期函数-在组件布局完成后执行)
movedFunction组件生命周期函数-在组件实例被移动到节点树另一个位置时执行)
detachedFunction组件生命周期函数-在组件实例被从页面节点树移除时执行)
relationsObject组件间关系定义,参见 组件间关系
lifetimesObject组件生命周期声明对象,参见 组件生命周期2.2.3
pageLifetimesObject组件所在页面的生命周期声明对象,参见 组件生命周期2.2.3
definitionFilterFunction定义段过滤器,用于自定义组件扩展,参见 自定义组件扩展2.2.3

参考文档:Behavior(Object object) | 微信开放文档 (qq.com) 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/88353
推荐阅读
相关标签
  

闽ICP备14008679号