• 原生小程序小话题——自定义组件2


    一、组件的生命周期

    1.组件本身的生命周期,写在Component大对象中的lifetimes对象下,如下

    1. lifetimes:{
    2. created(){
    3. console.log("我是create,我里面可以请求数据,但是整个Component对象还没有构建好");
    4. },
    5. attached(){
    6. console.log("我是attached,相当于mounted,此时可以使用this.setData");
    7. },
    8. detached(){
    9. console.log("我是detached,组件离开时触发");
    10. }
    11. },

    2.和页面相关的生命周期

    这个和组件没多大联系,主要是组件所在页面的生命周期,反映到组件上,写在Component字段的pageLifetimes

    1. pageLifetimes:{
    2. hide(){
    3. console.log("我是hide,我会在组件所在页面hide的时候触发");
    4. },
    5. show(){
    6. console.log("我是show,我会在组件所在页面显示的时候触发");
    7. },
    8. resize(){
    9. console.log("我是resize,我会在页面尺寸发生变化时触发");
    10. }
    11. }

    3.behavior当中的生命周期

    我们的behavior当中肯定也会有生命周期,按照设计的逻辑想一想,生命周期肯定是不会同名属性替换的,而是都会执行,现在我们在组件之中添加一个behavior,其中包含这样的一些生命周期函数

    1. lifetimes:{
    2. created(){
    3. console.log("我是behavior当中的created");
    4. },
    5. attached(){
    6. console.log("我是behavior当中的created");
    7. },
    8. detached(){
    9. console.log("我是behavior当中的detached");
    10. }
    11. },

    看一下测试结果

     成立,而且我们明显的可以看到behavior当中的生命周期是先于组件生命周期执行的

    二、数据监听

    这个是组件Component当中的observers字段,可以当成vue当中的watch,每当我们使用this.setdata来对data中的数据进行监听的时候,我们就可以进行某些操作

    下面是一些关于如何监听的例子,分别是对单个数据的监听、多个数据的监听、对数组对象的监听、使用通配符的监听,此外在methods当中写的则是改变状态的函数

    1. Component({
    2. properties: {
    3. },
    4. data: {
    5. a: 1,
    6. b: 3,
    7. sum: 0,
    8. obj: {
    9. name: "huangfeng",
    10. hobby:{}
    11. },
    12. arr: []
    13. },
    14. observers: {
    15. // 单个数据的监听
    16. 'a': function (newa) {
    17. if (newa == 2) {
    18. console.log("搞什么鬼,一定要写个2吗");
    19. }
    20. },
    21. // 多个数据的结合监听
    22. "a,b": function (newa, newb) {
    23. this.setData({
    24. sum: this.data.a + this.data.b
    25. })
    26. },
    27. // 对对象的key或者数组的监听
    28. // 对对象key的监听
    29. "obj.name": function (newname) {
    30. if (newname == "huangfeng") {
    31. console.log("comeon,你根本没有修改名字");
    32. }
    33. },
    34. "arr[0]": function (newval) {
    35. console.log("arr数组终于有值了,这个值是", newval);
    36. },
    37. // 通配符的监听
    38. // 注意通配符不能监听数组
    39. "obj.hobby.**":function(){
    40. console.log("我正在设置hobby值");
    41. }
    42. },
    43. methods: {
    44. changeA() {
    45. this.setData({
    46. a: 2
    47. })
    48. console.log("改变a");
    49. },
    50. changeB() {
    51. this.setData({
    52. b: 10
    53. })
    54. console.log(this.data.sum);
    55. },
    56. changeObj() {
    57. this.setData({
    58. obj: {
    59. name: "huangfeng"
    60. }
    61. })
    62. },
    63. changeArr() {
    64. this.setData({
    65. arr: [0]
    66. })
    67. },
    68. changeObjHobby(){
    69. this.setData({
    70. obj:{
    71. hobby:{first:"study"}
    72. }
    73. })
    74. }
    75. }
    76. })

    因为我们的组件的props最终是会放到data之中的,所以我们也可以使用这个observer监听传入的数据,我们这边组件中定义了一个name参数

    1. properties: {
    2. name:String
    3. },

     并加上对参数的监听

    1. observers:{
    2. "name":function(newname){
    3. console.log("你小子怎么传入新参数了");
    4. }
    5. }

    在页面上挂载参数

    1. "{{name}}">
    2. //data中的内容
    3. data: {
    4. name:"huangfeng"
    5. },
    6. //在js部分,我们还定义了一个改变name的函数
    7. changeNameProp(){
    8. this.setData({name:"维达尔"})
    9. },

    看一下调用改变参数之后的结果

     成了。

    三、组件样式

    这边我们来看一下,组件的样式部分的问题,这里面有几个注意点需要说一下,因为有一些样式问题,样式能用class写就用class写。

    首先,组件中可以在wxss部分,使用:host的写法去规定基本样式

    1. :host {
    2. color: yellow;
    3. }

    其次,我们可以通过Component对象中的options对象的styleIsolation来控制组件内外的样式交互

    一般默认的样式交互是如下的

    1. options:{
    2. styleIsolation:"isolated"
    3. },

    这种选项下,内外不影响,此外还有以下的选项,这样的话页面能影响组件,组件内部样式不能影响页面,当然相关的样式之类的限制还有很多,可以去官网上看看,我是觉得有点长

    1. options:{
    2. styleIsolation:"apply-shared"
    3. },

    当然我要提醒一下,这种配置可以在json部分进行定义了

    当然我们的组件也可以接受一下特定的外部定义的类,使用externalClasses数组就可以接受特定的外部的类

    1. Component({
    2. externalClasses: ['my-class']
    3. })

    此外,为了方便书写,即使是在内外样式isolated的情况下,可以使用如下的写法

    class="~blue-text"> 这段文本是蓝色的 

    这段代码可以让你使用组件所在page的blue-text样式,要使用父组件的样式,可以采用以下的写法

    class="^red-text"> 这段文本是红色的 

    此外关于样式还有一些内容,都在官网上,我实在写不下去了。

    另外,组件还有一部分知识没有写出来,下次再更新吧。

  • 相关阅读:
    软考机考细则揭秘,只需一分钟
    Java OA系统日程管理模块
    目标检测YOLO实战应用案例100讲-基于YOLOv5自适应损失权重的生活垃圾目标检测模型
    Python+opencv绘制测试标版(棋盘格、纯色、十字叉心)
    vim-操作
    安装pygame报错
    哪一款运动蓝牙耳机比较好、2022最值得入手的运动耳机
    小程序使用uni.createAnimation只执行一次的问题
    Android processgroup机制
    k8s详细安装过程
  • 原文地址:https://blog.csdn.net/huangfengnt/article/details/126982348