小程序开发之自定义组件

因为需求的原因,小程序中有比较多需要复用的结构样式和方法,于是便考虑使用自定义组件的方式,将这些部分封装为一个组件,并在需要的页面引入。

百度了下,发生搜索的结果基本都是同一篇文章的内容。而这篇文章,仅仅贴出了代码罢了。于是老夫,觉得开发自定义组件必须进行更深入的了解。

1、为什么需要开发自定义组件

小程序开发之自定义组件  mvvm 小程序 第1张

这两个页面,其顶部都有一个搜索条,这个搜索条需要实现3个方法,点击搜索条切换到搜索页面,点击扫描二维码图标的时候,调用扫描二维码的方法,滚动页面到固定高度的时候显示白色背景。倘若在每个页面都复制粘贴该部分的内容,那么日后需要更新该部分的样式的时候,每个页面都必须修改,这是很尴尬的事情。所以就需要将这部分的东西整合为一个组件。

2、自定义组件在小程序中的引用和表现方式

根据文档,在需要引入的自定义组件的页面,需要在其json文件中,声明使用组件的文件路径和组件的标签名称。

小程序开发之自定义组件  mvvm 小程序 第2张

在页面对应需要插入组件的位置,使用如果html标签的形式,写入该标签。如同常规的html标签一样,组件标签均可以对其增加属性和值,便于组件接受该值。

小程序开发之自定义组件  mvvm 小程序 第3张

小程序会把该组件对应的页面结构,既wxml的内容插入到标签内部。

小程序开发之自定义组件  mvvm 小程序 第4张

3、自定义组件的开发入门

小程序提供了一个专门用于放入自定义组件的文件夹component,开发者可以在其下建立插件的文件夹如headSearch,并右键新建component。

小程序开发之自定义组件  mvvm 小程序 第5张

建立后会出现4个文件,并且和页面一样的,均有js,json,wxml和wxss

小程序开发之自定义组件  mvvm 小程序 第6张

wxml和wxss跟页面是一样的都是该插件的结构和样式,值得一题的是,组件的wxss只能运用于该组件,反之组件的样式只能从该组件对应的wxss生效。也就是说公共样式app.wxss中就算包含了与组件内相同名字是类,其样式对组件内依旧无效的。

json文件,声明这是一个组件,并声明需要引入的其它组件,如果仍然需要进入其他组件的话。

js文件,与页面的js文件内容有很大的不同,除了不再是page对象而是Component对象外,均有较大修改,这里直接使用文档的内容。

定义段类型是否必填描述
propertiesObject Map组件的对外属性,是属性名到属性设置的映射表,属性设置中可包含三个字段, type 表示属性类型、 value 表示属性初始值、 observer 表示属性值被更改时的响应函数
dataObject组件的内部数据,和 properties 一同用于组件的模版渲染
methodsObject组件的方法,包括事件响应函数和任意的自定义方法,关于事件响应函数的使用
behaviorsString Array类似于mixins和traits的组件间代码复用机制
createdFunction组件生命周期函数,在组件实例进入页面节点树时执行,注意此时不能调用 setData
attachedFunction组件生命周期函数,在组件实例进入页面节点树时执行
readyFunction组件生命周期函数,在组件布局完成后执行,此时可以获取节点信息
movedFunction组件生命周期函数,在组件实例被移动到节点树另一个位置时执行
detachedFunction组件生命周期函数,在组件实例被从页面节点树移除时执行
relationsObject组件间关系定义
externalClassesString Array组件接受的外部样式类
optionsObject Map一些组件选项,请参见文档其他部分的说明
const app = getApp();
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    searchBackgroundShow: {
      type: Boolean,
      value: false,
    },
    searchBackgroundColor: {
      type: String,
      value: '#fff'
    },
    searchType: {
      type: String,
      value: '',
    }
  },
  /**
   * 组件的初始数据
   */
  data: {
  },
  /**
   * 组件的方法列表
   */
  methods: {
    toSearchHome: function () {
      wx.navigateTo({
        url: '/pages/search/searchHome'
      })
    },
    useScanCode: function () {
      app.scanCode();
    },
    showShopCategory: function () {
      const _this = this;
      const data = {};
      const option = {};
      _this.triggerEvent('openCategoryView', data, option);
    }
  }
})

对照提供的表格和我的js,可以很容易理解。

最后说明一点,triggerEvent的使用可以把data传到引用页面的中的对应事件中

原文链接:,转发请注明来源!
「小程序开发之自定义组件」评论列表

发表评论