【小程序】实现复用及造轮子入门

?小程序实现可以通过 template 和 component 两种方式实现代码的复用,以减少不必要的工作量。template 被官方称为模块,在 xmlcss 中定义代码片段,然后可以在其他页面使用,事实上,template 像是复制粘贴的另一种形式,只是把复制粘贴的操作使用<template> 标签来代替,减少了页面的简洁程度,方便维护(有点像 android 中的 <include> )。比起template, component 实现的自定义组件,可以进行自己的逻辑处理,并像官方提供的组件一样去使用。

template 和 component 的不同

  • component 和普通的 page 一样有 xml、css、json 和 js 文件,template 只有 xml 和 css 文件
  • component 可以处理点击事件,tempalte 需要在使用者的 js 中定义
  • template 的动态数据均来自使用者的传递,component 不是
  • 对于 template,在使用者的 css 文件中定义的样式会覆盖模块中定义的样式,而对于 component,app 的样式和使用者的样式均不会影响到组件内部(除非使用externalClasses
  • component 只能使用类选择器 ,template 没有限制

    ……

template 复用弹窗

?template 通常在复用的部分逻辑处理比较少的情况下使用,如在应用中有一些 UI 一样、但文字内容不一样的提示弹框,这时可以使用 template 来达到复用的目的。

1. 定义

建立一个目录,在目录下建立 xml 和 css 文件,编辑弹框的 xml 和 css 文件和编辑普通的 page 基本没有什么差别,唯一不同的是在 xml 的最外层需要套上一个 <template> 标签,在该标签中定义 template 的 name 属性,这个 name 属性将成为该弹框的标识。另外 template 中动态数据通过引用者传入。

<!--tip-dialog.wxml-->
<template name="tip-dialog">
    <view class='container'>
        <view class='tip-content'>
            <image class='content-icon' src="{{icon}}"></image>
            <text class='content-text'>{{text}}</text>
        </view>
        <view class='tip-btn' bindtap='clickedBtn'>哦~</view>
    </view>
</template>
2. 使用
  • xml 文件中使用 <import> 标签引入模板

    <import src="/pages/tip-dialog/tip-dialog"/>
    
  • 使用 <template> 标签指明模板,并传入动态数据,data 属性中的 是展开符号,将 js 中的对象属性展开传递到模板,使模板中可以直接通过属性名称使用,而不是对象.属性

    <template is="tip-dialog" data="{{...tipData}}" wx:if="{{showTip}}"/>
    
  • css 文件中使用 @import 引入模板的 css 文件,完成

    @import "/pages/tip-dialog/tip-dialog";
    

component 造简单的轮子

?微信从 1.6.3开始支持自定义组件,自定义组件拥有拥有和 page 一样的四个文件,其中 js 文件的结构有一些差异,不过写法基本没什么变化。创建自定义组件的步骤如下:

  • 新建目录,右键建立 component
  • component.json
{
  "component": true
}
  • 和编辑普通的页面一样编辑组件,注意是 js 文件的一些差异

    • properties:是组件对外开放的属性,当在使用者 xml 文件中使用该组件时,可以为这些属性传值达到改变组件的目的
    • data:内部数据,和 page 的 data 一样,和 properties 不同的是它是对内的
    • mthods:组件的自定义方法都定义在其内部,亲测定义在外部无法识别
    • externalClasses:组件外部样式,组件内部的样式是不受 app 和 使用者的 css 影响的,如果有组件内部有一些样式希望在使用者使用时才决定,那么久可以通过 externalClasses 去实现
    • behaviors:用于组件间的引用(详情:文档-组件间的关系)
    • 生命周期 :created()、attached()、ready()、moved()、dettach()
    Component({
      //选项
      options: {
        multipleSlots: true // 启用多slot(插槽)支持
      },
      properties: {
        //外部属性
        text: {
          type: String, //类型
          value: 'default value', //默认值
          observer: '方法名' //当数据发生变化时调用
        }
      },
      //外部样式
      externalClasses: ['text-class'],
      data: {
        // 内部数据
        someData: {}
      },
      //生命周期
      attached: function(){},
      moved: function(){},
      detached: function(){},
      methods: {
        // 自定义方法
        customMethod: function(){}
      }
    })
    
  • 使用者 json
    {
        "usingComponents": {
            //组件名-路径
            "component-name": "component-path",
        }
    }
    
  • 使用者 xml

    <component-name property="" />
    

官方文档:文档-自定义组件

大专栏  【小程序】实现复用及造轮子入门

自定义导航栏

?小程序官方提供的导航栏可以控制的部分太少,很多时候并不能满足项目的需求,从 1.9.1 开始,微信开始支持自定义导航栏,这里使用 component 实现一个导航栏。功能如下:

  • 导航栏有标题,返回键,分割线
  • 导航栏高度自适应,标题和返回键始终垂直居中
  • 导航栏可由使用者指定背景颜色或图片
  • 标题的内容和样式对使用者开放
  • 返回键可显示和不显示,按钮的 icon 可由使用者提供,且提供默认 icon,点击可返回上一个界面,提供返回按钮的监听事件
  • 分割线可显示和不显示,使用者可决定颜色
<!--nav-bar.wxml-->
<view class='nav-container' style='height:{{customeHeight? navHeight:height}}px;background:{{bgColor}};'>
    <image class="nav-background-img" src='{{imageBg}}' style='height:{{height}}px;' mode='top' wx:if="{{useImageBg}}"></image>
    <image class='nav-back' src='{{backIcon}}' wx:if='{{showBack}}' bindtap='clickedNavBarBack'/>
    <view class='nav-title-view' style='margin-bottom: {{marginB}}rpx;'>
        <view class='nav-title-class'>{{title}}</view>
    </view>
    <view class='nav-line' style='background-color:{{lineColor}};' wx:if="{{showLine}}"></view>
</view>

tips:

  • 不使用 externalClasses 的情况下,组件使用者 css 不能覆盖组件中的 css
  • 在使用 externalClasses 的情况下,组件内部 xss 中对于该 class 样式失效,但是 wxml 中 style 属性指定的样式仍有效
//nav-bar.js
Component({
    externalClasses: ['nav-title-class'],
    properties: {
        //指定导航栏高度,不指定将使用默认的计算方式
        navHeight: {
            type: Number,
            value: -1,
            observer: 'navHeightChange'
        },
        //导航栏标题
        title: {
            type: String,
            value: "VUI"
        },
        //是否显示返回键
        showBack: {
            type: Boolean,
            value: true
        },
        //背景颜色,默认 #fff
        bgColor: {
            type: String,
            value: ''
        },
        //背景图片,默认不使用,使用后将覆盖掉背景颜色
        imageBg: {
            type: String,
            value: '',
            observer: 'imageBgChange'
        },
        //指定返回按钮的 Icon
        backIcon: {
            type: String,
            value: DEFAULT_BACKICON
        },
        //导航栏底部分割线颜色
        lineColor: {
            type: String,
            value: "#ccc"
        },
        //是否显示底部分割线
        showLine: {
            type: Boolean,
            value: true
        }
    },
    data: {
        height: 64,
        useImageBg: false,
        customHeight: false,
        marginB: 10
    },
    created: function() {
        _this = this
    },
    /**
     * ready 开始可以获得控件信息
     */
    ready: function() {
        let height = _this.getNavBarHeight()
        _this.calculatePosiontion(height)
    },
    methods: {
        clickedNavBarBack: function() {
            console.log("navBar.clikedBack()")
            wx.navigateBack({})
            this.triggerEvent("tapBack") //使用者可以绑定这个方法来监听返回键点击事件(bindtapBack)
        },
        calculatePosiontion: function (height) {
            let sys = wx.getSystemInfoSync()
            let query = wx.createSelectorQuery().in(this)
            query.select(".nav-title-view").boundingClientRect()
            query.exec(function (rects) {
                let titleH = rects[0].height
                let realH = height - sys.statusBarHeight
                let marginB = (realH - titleH) / 2
                _this.setData({
                    height: height,
                    marginB: marginB
                })
            })
        },
        getNavBarHeight: function () {
            let height = 64
            let res = wx.getSystemInfoSync();
            let system = res.system
            if(system.search('android') != -1) {
                height = 68
            } else {
                let model = res.model
                if (model.search('iPhone X') != -1) {
                    height = 88
                } else if (model.search('iPad') != -1) {
                    height = 100
                }
            }
            return height
        },
        navHeightChange: function (newVal, oldVal) {
            _this.setData({
                customeHeight: true
            })
        },
        imageBgChange: function(newVal, oldVal) {
            if(newVal != '') {
                _this.setData({
                    useImageBg: true
                })
            }
        }

    }
})

对于标题栏高度,使用 px 作为单位,android 统一为 68,iPhone X 为 88,iPhone 其他为 64。对于居中,首先将标题和返回按钮固定在导航栏底部,然后计算 margin-bottom 的值(导航栏高度包括了状态栏的高度)。

<!-- index.wxml -->
<nav-bar show-back="{{true}}" title="VUI" nav-title-class="nav-title-class" line-color="#aaa" showLine="{{showNavLine}}" bindtapBack="tapBack"></nav-bar>

效果

++:

原文地址:https://www.cnblogs.com/liuzhongrong/p/12288931.html

时间: 2024-10-08 13:02:01

【小程序】实现复用及造轮子入门的相关文章

程序员为什么热衷造轮子

搜索一下"造轮子"或者"程序员为什么喜欢造轮子",会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年.不过还是有再谈的必要. "造轮子"的含义: 明知道你做的不可能比前辈做得更好,却仍然坚持要做. 就软件开发而言,"造轮子"是指,"业界已经有公认的软件或者库了,却还坚持要自己做". 在软件开发过程中,有时你想造轮子老板却极力反对,有时你不想造轮子老板却坚持要造一个出来,为什么会有这种两极状

程序员为什么热衷造轮子?

搜索一下“造轮子”或者“程序员为什么喜欢造轮子”,会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年.不过还是有再谈的必要. “造轮子”的含义: 明知道你做的不可能比前辈做得更好,却仍然坚持要做. 就软件开发而言,“造轮子”是指,“业界已经有公认的软件或者库了,却还坚持要自己做”. 在软件开发过程中,有时你想造轮子老板却极力反对,有时你不想造轮子老板却坚持要造一个出来,为什么会有这种两极状况? 这篇文章就来讨论“造轮子”这件事,包括下列主题: 程序员为什么会重复造轮子 为什么有

Vue+koa2开发一款全栈小程序(1.课程介绍+2.ES6入门)

1.课程介绍 1.课程概述 1.做什么? Vue+koa2开发一款全栈小程序 2.哪些功能? 个人中心.图书列表.图书详情.图书评论.个人评论列表 3.技术栈 小程序.Vue.js.koa2.koa-router.mysql 2.课程亮点 1.项目前后端分离开发 Vue+koa2开发一款全栈小程序 2.完整流程,一步不少 注册小程序账号,前后端开发,打包,正式上线 2.小程序环境搭建 1.后台地址: https://mp.weixin.qq.com/ 2.文档地址: https://develo

神技!微信小程序(应用号)抢先入门体验(附最新案例-豆瓣电影)持续更新

微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/dev/ Demo 预览 演示视频(流量预警 2.64MB) GitHub Repo 地址 仓库地址:https://github.com/zce/weapp-demo 使用步骤 将仓库克隆到本地: bash $ git clone https://github.com/zce/weapp-demo.g

H5和小程序直播开发 零距离快速入门

第1章 课程介绍 对于课程整体以及直播行业的现状进行介绍 第2章 直播工作原理 所谓知其然也要知其所以然,只会用别人总结好的东西很难有质的进步,只有深谙背后的工作原理才能进一步吃透到进阶.本章从直播协议入手到工作原理详解,步步为营,化繁为简,极易吸收. 第3章 Video详解 video是视频播放的基石,无论是点播还是直播,都要掌握其应用,本章详细讲述了大家平时不知道还特别重要的方法.属性.事件,结合实例演示祝你更上一层楼. 第4章 直播流的制作 对于直播技术而言,非常重要的一个技能就是制作直播

小程序入门学习Demo

技术:小程序 概述 适合学习小程序的初级开发人员,入门教程 详细 代码下载:http://www.demodashi.com/demo/14956.html 小程序周边美甲美发预约Demo 代码主要写了轮播+导航切换+返回顶部+滑动切换+下拉菜单选择+用户信息获取.页面布局运用flex布局. 看代码时建议打开小程序文档,更好的了解组件或者Api.附上小程序文档链接:https://developers.weixin.qq.com/miniprogram/dev/component/swiper.

微信小程序开源项目库汇总

微信小程序开源项目库汇总,里面集合了OpenDigg 上的优质的微信小程序开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. UI组件 weui-wxss ★852 - 同微信原生视觉体验一致的基础样式库 Wa-UI ★122 - 针对微信小程序整合的一套UI库 wx-charts ★105 - 微信小程序图表工具 wemark ★85 - 微信小程序Markdown渲染库 WeZRender ★36 - 微信小程序Canvas增强组件 wet

微信小程序UI组件、开发框架、实用库

UI组件 weui-wxss ★852 - 同微信原生视觉体验一致的基础样式库 Wa-UI ★122 - 针对微信小程序整合的一套UI库 wx-charts ★105 - 微信小程序图表工具 wemark ★85 - 微信小程序Markdown渲染库 WeZRender ★36 - 微信小程序Canvas增强组件 wetoast ★21 - 仿照微信小程序提供的showToast功能 wxapp-charts ★20 - 微信小程序图表charts组件 WeiXinProject ★18 - 列

【微信小程序开发?系列文章六】生命周期和路由

这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程序开发•系列文章四]模块化 [微信小程序开发•系列文章五]主界面 [微信小程序开发•系列文章六]生命周期和路由 整个微信小程序从打开到关闭,整个过程可以分为很多阶段或者说状态,这一整段的过程,我们称之为小程序的生命周期.而周期中的每种不同的状态,到另一个状态的过度和转化,是需要一个触发机制的,这种机