博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快应用教程-实现自定义组件
阅读量:7200 次
发布时间:2019-06-29

本文共 3067 字,大约阅读时间需要 10 分钟。

以下用到的代码例子都在这里:

git clone https://github.com/yale8848/quickapp-wechatcd quickapp-wechatgit checkout v0.1.1复制代码

为什么用自定义组件

自定义组件首先是一个组件,至少包含一个.ux文件,文件里把组件要实现的UI,逻辑封装起来共外界调用,这样可以让组件之间解耦,组件功能更加单一、灵活;举个微信Demo中的一个例子,我要实现微信的titlebar功能,

在这里输入图片标题

当然我可以用系统的titlebar,但是为了功能更丰富,我把它作为一个组件来实现,下面来看看实现自定义组件的过程。

创建ux文件

如微信Demo里的Title/index.ux,创建好<template>,<style>,<script>,根据需求titlebar有3个按钮,一个标题:

复制代码

好了,上面ux文件已经把titlebar的UI创建好了,还有一个返回事件也添加了;

如何调用组件

使用improt标签,name是自定义名称,详细看Demo里的Main/index.ux

复制代码

这样就可以把title调用起来了

npm run watchnpm run server复制代码

看看效果:

在这里输入图片标题

等等,怎么不见标题了?嗯,咱还没有设置呢,可能不同页面对标题、返回按钮是否显示的要求不一样,那么我们就要能动态控制;

给子组件传值

  • 子组件用props属性暴露变量给父组件调用,如下暴露['showBack', 'showText', 'showPlus', 'showSearch', 'text']变量,它们分别是控制返回按钮、标题、加按钮、搜索按钮是否显示以及标题内容,然后把这些变量绑定到UI控件上
复制代码
  • 父组件调用

通过给子组件标签设置属性值来调用子组件变量,子组件变量用驼峰命名方式,父组件调用子组件属性命名用-来分隔驼峰

复制代码

调用结果如下:

在这里输入图片标题

父子组件通信

除过上面父组件给子组件以变量的形式传值外,父子之间可以以消息的形式传值:复制代码

父给子发消息

以下代码见src/Demo/comm 子组件订阅fatherSay消息:```    data: {        say: ""    },    sayMsg(evt) {        this.say = evt.detail.msg //收到消息    },    onInit() {        this.$on("fatherSay", this.sayMsg) //订阅消息    },```父组件给fatherSay发消息:```this.$broadcast('fatherSay', {                msg: "son"})```复制代码

子组件给父组件发消息

父组件有2种方式订阅子组件消息:

  • 父组件以js代码形式订阅,子组件以$dispath发送事件
onInit() {        this.$on("sonSay", this.sayMsg)    }复制代码
this.$dispath('sonSay', {        msg: t    })复制代码
  • 父组件以子组件标签属性形式订阅,子组件以$emit发送事件
```    
``````this.$emit('sonSay', { msg: t })```复制代码

大家可以把manifest.json 中的entry改为"entry": "Demo/comm",看看效果:

在这里输入图片标题

当点击子组件say hi时父组件会收到子组件消息;

在这里输入图片标题

当点击子组件say father时父组件会收到子组件消息并反馈给子组件"son"的消息

兄弟组件之间发消息

以下代码在src/Demo/comm2中

兄弟组件之间发消息之前要先通过父组件互相绑定VM对象:

onReady() { //注意要放在onReady调用            const vm1 = this.$vm('son1')            const vm2 = this.$vm('son2')            vm1.parentVm = this            vm1.nextVm = vm2            vm2.parentVm = this            vm2.previousVm = vm1        }复制代码

然后兄弟组件之间发消息有两种形式:

  • 通过VM对象调用对方函数:
//son2.ux    brotherSay(msg) {        this.say = msg    },复制代码
//son1.ux    if (this.nextVm) {        this.nextVm.brotherSay(msg)    }复制代码
  • 通过event事件:
//son1 绑定消息    events: {            eventSay(evt) {                this.say = evt.detail            }    }复制代码
//son2 通过$emit发送消息  if (this.previousVm) {                        this.previousVm.$emit('eventSay', msg)    }复制代码

大家可以把manifest.json 中的entry改为"entry": "Demo/comm2",看看效果:

在这里输入图片标题

以上用到的代码例子都在这里:

git clone https://github.com/yale8848/quickapp-wechatcd quickapp-wechatgit checkout v0.1.1复制代码

欢迎大家关注快应用栈公众号

在这里输入图片标题

转载地址:http://pocum.baihongyu.com/

你可能感兴趣的文章
由React Router引起的组件重复渲染谈Route的使用姿势
查看>>
iOS性能优化之页面加载速率
查看>>
Google JavaScript 代码风格指南
查看>>
Netty(三) 什么是 TCP 拆、粘包?如何解决?
查看>>
从0开始写一个基于Flutter的开源中国客户端(6)——各个静态页面的实现
查看>>
shiro教程(1):基于url权限管理
查看>>
从JDK角度认识枚举enum
查看>>
理解virtual dom的实现细节-snabbdom
查看>>
Vue二次封装axios为插件使用
查看>>
Electron-vue开发实战2——引入基于Lodash的JSON数据库lowdb
查看>>
事务隔离(一):ANSI SQL事务隔离级别,限制及扩展
查看>>
Fiddler的灵活使用
查看>>
苹果爆出新漏洞可被恶意APP利用记录用户键盘输入
查看>>
多线程面试题
查看>>
相信未来
查看>>
四道笔试题详解
查看>>
iOS10 语音播报填坑详解(解决串行播报中断问题)
查看>>
EditText禁止软件盘弹出,且不影响其它功能
查看>>
React Native 并没有死!
查看>>
Android:DataBinding的一二事
查看>>