微信小程序组件化开发

什么是组件化开发

微信小程序的组件和Vue的组件非常相似。

在微信小程序中有很多内置组件,比如button view input image等,有时候我们要自定义组件。和Vue的组件似的。

如何创建自定义组件:
新建一个components目录,在里边创建自定义组件

组件的组成:

  • json
  • js
  • wxml
  • wxss

使用组件:

  • 在页面的.json中,usingComponents里写入该组件,声明一下。
  • 在页面.wxml中使用,和内置组件一样。和Vue很相似

一个简单的示例:
创建comp,代表页面;创建components/xxxx,代表组件。

创建组件:

f-test.wxml
这里是内容


f-test.json
{
  "component": true,    // 必须写了这句话,才代表这是一个组件
  "usingComponents": {  // 自定义组件中也可以引入其他组件
    "f-son": "/components/f-son/f-son"
  }
}

使用组件:

comp.json: 引入组件
{
  "usingComponents": {
    "f-test": "/components/f-test/f-test"
  }
}

comp.wxml: 使用组件

注意:json文件中不能写注释啥的。这里的注释是为了解释清楚,在开发中不能写注释。

注意事项

组件的注意事项:

  • wxml中,标签名只支持小写字母,中划线和下划线(一般只用中划线,和官方保持一致)。可以用数字。
  • 自定义组件内部也可以去引用其他的自定义组件。
  • 给自定义组件起名字的时候,不要以wx-开头,会报错。
  • json文件中不可以有注释。
  • 当很多页面都想要引入一个自定义组件的时候,就把它注册在全局的app.json中,这样所有的页面和自定义组件中都可以用这个组件了。但是不推荐这种做法。

组件的样式细节:

  • 自定义组件的样式不会影响页面,页面的样式也不会对自定义组件造成影响。他们之间不会相互影响。前提是:使用class,会有隔离。
  • 组件中不允许使用id或者标签或者属性选择器。会包一个警告。

如何控制页面和组件的样式相互影响:

  • 在组件的js文件中有个options属性,设置即可。
test.js:
options: {
    styleIsolation: "shared",     
}
取值:shared(相互作用),apply-shared(页面作用到组件,组件不作用到页面), isolate(相互隔离,默认)

组件和页面相互通信

组件和页面相互通信

  • 页面-》组件,数据,properties
  • 页面-》组件,样式,externalClasses
  • 页面-》组件,标签,slot
  • 组件-》页面,自定义事件,比如组件被点击了一下。this.triggerEvent

this.triggerEvent(事件名,参数对象,{}),最后是options,额外的一些选项

页面向组件传递数据和样式

// components/f-prop/f-prop.js
Component({
  // 传递数据
  properties: {
    title: {
      type: String,     // 类型
      value: "默认标题",  // 默认值
      observer: function(newVal, oldVal){ // 观察者
        console.log(newVal, oldVal);
      }
    }
  },
  // 传递样式
  externalClasses: ["contentclass"],
})


{{ title }}
这是内容


使用:





/* pages/comp/comp.wxss */
.red{
  color: red;
}
.green{
  color: green;
}
.blue{
  color: blue;
}

slot插槽

预留一个设备,以有利于对以后进行扩展。
好处:

  • 组件的插槽让我们封装的组件更加具备扩展性
  • 让使用者决定组件内部的一些内容到底展示什么

例子:
在移动端,导航栏,nav-bar,分为左中右三部分。不把这三部分的内容写死。就用插槽,为了封装性更好。

单个插槽的使用

单个插槽的使用很简单:


这是单个插槽的头部

这是单个插槽的尾部




  



  这是单个插槽的文本内容

多个插槽的使用

多个插槽的使用稍微复杂,要设置几个东西:


这是多插槽的头部



这是多插槽的尾部

// components/f-slot-multiple/f-slot-multiple.js
Component({
  options: {
    multipleSlots: true,   // 多个插槽要开启这个
  },
});




  
  
  


component构造器

传递哪些东西 作用 示例
options 定义组件的配置选项 multipleSlots: true / styleIsolation: shared
data 定义组件内部的初始化数据
methods 定义组件的内部函数
properties 让组件使用者可以给组件传递数据
externalClasses 外界给组件传递额外的样式 数组
observers 可以监听属性的改变

component构造器中可以写哪些东西,如下

// components/f-slot-multiple/f-slot-multiple.js
Component({
  // 1. 额外的配置
  options: {
    multipleSlots: true,   // 多个插槽要开启这个
    styleIsolation: "shared", // 页面和组件的样式共享方式
  },
  // 2. 页面给组件传递数据
  properties: {
    title: {
      type: String,
      value: "",
      oberver: function(newVal, oldVal){}
    }
  },
  // 3. 组件内部的数据
  data: {
    message: ""
  },
  // 4. 组件内部方法
  methods: {

  },
  // 5. 页面向组件传递样式
  externalClasses: ["contentclass"],
  // 6. 监听properties和data的变化
  observers: {
    title: function(newVal){  // 没有oldVal
    },
    message: function (newVal) { }
  },
  // 7. 组件的生命周期
  // 7.1 监听所在页面的生命周期
  pageLifetimes: {
    show(){
      console.log("监听组件所在的页面显示时");
    },
    hide(){
      console.log("监听组件所在页面隐藏时");
    },
    resize(){
      console.log("监听组件所在页面的页面尺寸发生变化时");
    }
  },
  // 7.2 监听组件本身的生命周期
  lifetimes: {
    created(){
      console.log("组件被创建出来");
    },
    attached(){
      console.log("组件被添加到页面/其他组件");
    },
    ready(){
      console.log("组件被渲染出来时");
    },
    move(){
      console.log("组件从一个地方移到另一个地方");
    },
    detached(){ // 可以wx:if来验证。
      console.log("组件被移除掉");
    }
  }
})

你可能感兴趣的:(微信小程序组件化开发)