美文网首页微信小程序
微信小程序组件化开发

微信小程序组件化开发

作者: 椰果粒 | 来源:发表于2019-10-10 19:33 被阅读0次

什么是组件化开发

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

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

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

组件的组成:

  • json
  • js
  • wxml
  • wxss

使用组件:

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

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

创建组件:

f-test.wxml
<view class="content">这里是内容</view>
<f-son />

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: 使用组件
<f-test />

注意: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"],
})

<!--components/f-prop/f-prop.wxml-->
<view class="title">{{ title }}</view>
<view class="content contentclass">这是内容</view>


使用:
<!--pages/comp/comp.wxml-->
<f-prop title="title1" contentclass="red" />
<f-prop title="title2" contentclass="green" />
<f-prop title="title3" contentclass="blue" />

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

slot插槽

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

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

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

单个插槽的使用

单个插槽的使用很简单:

<!--components/f-slot-single/f-slot-single.wxml-->
<view>这是单个插槽的头部</view>
<slot />
<view>这是单个插槽的尾部</view>


<!--pages/comp/comp.wxml-->
<f-slot-single>
  <button>这是单个插槽的button</button>
</f-slot-single>

<f-slot-single>
  <text>这是单个插槽的文本内容</text>
</f-slot-single>
多个插槽的使用

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

<!--components/f-slot-multiple/f-slot-multiple.wxml-->
<view>这是多插槽的头部</view>
<slot name="left" />
<slot name="center" />
<slot name="right" />
<view>这是多插槽的尾部</view>

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


<!--pages/comp/comp.wxml-->
<f-slot-multiple>
  <button slot="left">这是多插槽的左边</button>
  <button slot="center">这是多插槽的中间</button>
  <button slot="right">这是多插槽的右边</button>
</f-slot-multiple>

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("组件被移除掉");
    }
  }
})

相关文章

  • 微信小程序日历组件开发

    # 微信小程序日历组件开发 微信小程序基础知识 微信小程序 框架介绍 组件文档 上述是开发小程序的基本知识。 今天...

  • 小程序好文集合

    组件篇 微信小程序:组件实践 整体梳理 微信小程序开发深入解读

  • 微信小程序组件开发框架wepy的使用

    wepy是类似vue风格开发微信小程序的微信小程序框架,相比原生的最大就是组件化的方式快捷开发模式,还有引入pro...

  • 微信小程序基础

    微信小程序介绍微信小程序开发工具的使用微信小程序框架文件微信小程序逻辑层微信小程序视图层微信小程序组件介绍微信小程...

  • 微信小程序组件探究和应用

    把玩微信小程序组件 微信小程序把玩《二》:页面生命周期,模块化,数据绑定,view组件 微信小程序把玩《三》:sc...

  • 微信小程序组件化开发

    什么是组件化开发 微信小程序的组件和Vue的组件非常相似。 在微信小程序中有很多内置组件,比如button vie...

  • uniapp小程序图片加载失败

    之前的微信小程序项目都是使用原生组件开发,最近尝试用uniapp开发微信小程序,写了个小程序的demo。然而在浏览...

  • wx小程序(3) - 自定义组件及参数传输

    组件化的项目开发中,组件应当划分为三个层次:组件、模块、页面微信小程序已经为开发者封装好了基础组件,页面文件(pa...

  • 微信小程序开发框架,组件等收藏

    开发框架 Labrador ★391 - 微信小程序模块化开发框架 wepy ★383 - 小程序组件化开发框架 ...

  • 微信小程序开发框架、实用库...

    开发框架 Labrador ★391 - 微信小程序模块化开发框架 wepy ★383 - 小程序组件化开发框架 ...

网友评论

    本文标题:微信小程序组件化开发

    本文链接:https://www.haomeiwen.com/subject/fniapctx.html