使用mpvue开发小程序教程(四)
在上一章节中,我们将vue-cli
命令行工具生成的代码骨架中的src目录清理了一遍,然后从头开始配置和编写了一个可以运行的小程序页面,算是正真走上了使用mpvue开发小程序的第一步。今天我们将进一步来了解和学习mpvue / Vue
的其他重要功能。
既然mpvue
是基于Vue的,那么就没有理由不进一步学习一下Vue最核心的东西:组件。组件系统是Vue应用开发中最具价值的特性之一,在前文中其实我们就已经有在使用组件了,比如App.vue
和首页index.vue
就是两个Vue组件。
组件是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树,若干的小组件可以聚合成一个完整的界面:
一个好的组件系统一定会有这些特点:封装性、复用性、扩展性。对于Vue的组件来说,这几点都算是实现的比较的优秀的。
组件的封装性
Vue组件的写法可以避免将属于一个独立逻辑单位的代码散落在各处,可以将界面(DOM)、样式(CSS)、行为(JS)三部分的代码很好的组织在一起(推荐的实践是使用.vue
文件)。在设计编写一个组件时,我们要记住的原则就是:
避免向外部暴露过多的东西,只暴露必要的外部交互接口(组件属性、事件、方法等)。
下面我们来在原先的代码基础上,创建一个简单的按钮点击计数器组件,它将实现的功能是:点击按钮并展示已点击按钮次数、点击清零按钮实现点击次数的归零。在src/components
目录下,新建一个click-counter.vue
组件文件,并编写如下代码:
<template>
<div class="click-counter">
<div class="counter-num">次数:{{num}}</div>
<button class="counter-btn" @click="handleClick">点我呀!</button>
<button class="counter-reset-btn" @click="handleResetClick">清零</button>
</div>
</template> <script>
export default {
data() {
return {
num:
};
}, methods: {
handleClick() {
this.num += ;
},
handleResetClick() {
this.num = ;
}
}
};
</script> <style>
.click-counter {
display: flex;
align-items: center;
justify-content: center;
border: 1px solid red;
background-color: #ffffff;
padding: 10px;
} .counter-num,
.counter-btn,
.counter-reset-btn {
flex: ;
margin: 3px;
}
</style>
编写完这个组件后,我们来尝试在首页组件src/pages/index/index.vue
文件中使用它:
<template>
<div class="container" @click="clickHandle">
<div class="message">{{msg}}</div>
<!-- 使用 click-counter 组件 -->
<click-counter />
</div>
</template> <script>
// 导入 click-counter 组件
import ClickCounter from "@/components/click-counter"; export default {
// 声明在当前组件下使用 counter-click 组件
components: { ClickCounter }, data() {
return {
msg: "Hello"
};
}, methods: {
clickHandle() {
this.msg = "Clicked!!!!!!";
}
}
};
</script> <style scoped>
.message {
color: red;
padding: 10px;
text-align: center;
}
</style>
完成上面两个步骤后,记得重新运行一下命令行npm run dev
(注意点:新增文件必须重新运行该命令,编译器不会自动检测新加入的文件)。成功后通过微信开发者工具的模拟器查看,结果界面将会是这样的:
点击“点我呀!”按钮,计数器就会累加点击次数并更新界面上的数字;而点击“清零”按钮,则会将统计数字归零。
回到代码上来看,对于click-counter.vue
的使用者index.vue
来说,它并不关心太多click-counter.vue
的实现细节,引入该组件文件并进行声明,就可以通过标签的形式来使用它了,非常简单明了。而且,这样一个click-counter.vue
组件也可以被拿到其他的Vue/mpvue代码中使用,其他使用者也并不需要关注它的实现细节,而只需要关心它能实现什么功能就行了。这就是组件封装带来的好处。
不过,目前的这个click-counter组件还没有跟它的父组件之间有什么交互或通信,没有体现出“暴露接口”的特性,那让我们来增加点代码,了解下这一特性。首先解释一下我们要实现的功能:组件可以接收一个外部设置的初始点击次数值,在点击“点我呀!”按钮的时候,从这个初始值开始进行累加;并且点击按钮后,可以通知组件的使用者(即父组件)当前的点击统计值。
修改click-counter.vue
的代码:
<template>
<div class="click-counter">
<div class="counter-num">次数:{{num}}</div>
<button class="counter-btn" @click="handleClick">点我呀!</button>
<button class="counter-reset-btn" @click="handleResetClick">清零</button>
</div>
</template> <script>
export default {
// 增加一个可从外部传入的属性initNum
props: {
initNum: {
type: Number,
default:
}
}, data() {
return {
num: this.initNum //使用传入的initNum值作为初始的点击数
};
}, methods: {
handleClick() {
this.num += ;
this.notifyNum();
},
handleResetClick() {
this.num = ;
this.notifyNum();
},
notifyNum() {
//触发自定义事件 clicknum
this.$emit("clicknum", {
num: this.num
});
}
}
};
</script> <style scoped>
.click-counter {
display: flex;
align-items: center;
justify-content: center;
border: 1px solid red;
background-color: #ffffff;
padding: 10px;
} .counter-num,
.counter-btn,
.counter-reset-btn {
flex: ;
margin: 3px;
}
</style>
修改index.vue
的代码:
<template>
<div class="container" @click="clickHandle">
<div class="message">{{msg}}</div>
<!-- 使用 click-counter 组件 -->
<click-counter :init-num="" @clicknum="handleClickNum" />
</div>
</template> <script>
// 导入 click-counter 组件
import ClickCounter from "@/components/click-counter"; export default {
// 声明在当前组件下使用 counter-click 组件
components: { ClickCounter }, data() {
return {
msg: "Hello"
};
}, methods: {
clickHandle() {
this.msg = "Clicked!!!!!!";
},
handleClickNum(data) {
console.log(">>>>>>", data.num);
}
}
};
</script> <style scoped>
.message {
color: red;
padding: 10px;
text-align: center;
}
</style>
观察以上修改后的代码可以发现,在click-couter.vue
中的主要变化是:
使用
props
定义了一个名为initNum
的数字型组件属性(且初始值为0)。它可用于接收使用组件外部传入的值。然后,这个initNum
值被赋值到data
中的属性num
上作为它的初始值。在两个按钮的click事件处理方法中,额外调用了一个
notifyNum()
方法,它向组件触发了一个自定义事件clicknum
并携带了当前点击次数值。
而在index.vue
中的主要变化是实例化click-counter
组件的这行代码:
<click-counter :init-num="" @clicknum="handleClickNum" />
实例化组件的时候,为组件传入了initNum
属性值10
;并且添加了一个对自定义事件clicknum
的监听方法。
这样一个结构实现了数据进入组件/数据传出组件的机制,父子组件之间就能实现数据通信。通过有限的通信点进行数据互换,而不是直接进行函数调用,可以使得代码结构更优雅、更易维护。
组件的复用性
组件的复用性就好理解的多了,创建组件的目的,大多数时候就是希望这个组件可以被多个地方、多次使用,避免编写重复的代码。比如我们前面的计数器组件,有可能一个项目中的多个页面会用到,也可能一个页面就会使用多次。
Vue组件的复用也是很容易的,比如我们要在前面例子中的index.vue
中复用计数器组件,创建3个计数器,那么直接在模板部分编写3个标签就行了:
<template>
<div class="container" @click="clickHandle">
<div class="message">{{msg}}</div>
<!-- 创建 3个 click-counter 组件 -->
<click-counter :init-num="" @clicknum="handleClickNum" />
<click-counter :init-num="" @clicknum="handleClickNum" />
<click-counter :init-num="" @clicknum="handleClickNum" />
</div>
</template>
运行后的效果如下图所示,这三个计数器都能独立统计各自的点击数量:
组件的扩展性
谈到扩展性,有面向对象编程经验的开发者就会想到“继承(extends)”。继承是一种比较有效的扩展机制,不过随着继承的层次变深,代码也会变得难以理解。在Vue组件中,没有采用继承的机制,而是推荐使用“组合”的方式。
在组合理念下,我们尽量将想复用性高的组件设计到最小可拆分单位,比如按钮、输入框、单选框等等,然后再将这些低层组件放入更高层组件中,一层一层,慢慢拼装出满足需求的业务界面。
除了组合,Vue组件还提供了插槽(Slot)功能,相当于在一个组件中挖出了一个或多个坑,在具体使用这些具有插槽的组件时,可以选择往坑里面填什么内容(其他组件)。
举个例子,在计数器组件中,我们在清零按钮后面用<slot></slot>
挖了一个坑:
<template>
<div class="click-counter">
<div class="counter-num">次数:{{num}}</div>
<button class="counter-btn" @click="handleClick">点我呀!</button>
<button class="counter-reset-btn" @click="handleResetClick">清零</button>
<slot></slot>
</div>
</template>
而后,在index.vue
中使用计数器组件时,在<click-counter>
标签体中放入了额外的内容,会被传入该组件中去用于填坑:
<template>
<div class="container" @click="clickHandle">
<div class="message">{{msg}}</div>
<!-- 使用 click-counter 组件 -->
<click-counter :init-num="" @clicknum="handleClickNum">
<!-- 填坑用... -->
<input type="checkbox" /> 禁用
</click-counter>
</div>
</template>
从运行结果可以看到,清零按钮后面已经多出了我们传入的复选框和文字内容:
插槽其实可以理解为是另一种形式的组件属性:普通组件属性传入的是比较简单类型的数据;而插槽传入的可以是更复杂的界面组件而已。
小结
本文我们初步学习了一下Vue组件的相关理念和特性,希望大家花点时间去熟悉和掌握这些比较核心的知识点,相信不管在之后使用Vue进行Web应用开发,还是mpvue小程序开发,都会更加得心应手、事半功倍的!
使用mpvue开发小程序教程(四)的更多相关文章
- 使用mpvue开发小程序教程(三)
在上一篇文章中,我们熟悉了一下通过vue-cli生成的mpvue工程代码骨架的基本结构,大致了解了每一个部分的代码到底要放到何处.从本文起我们就开始涉及真正的编码部分,学习使用Vue的语法去编写小程序 ...
- 使用mpvue开发小程序教程(一)
前段时间,美团开源了mpvue这个项目,使得我们又多了一种用来开发小程序的框架选项.由于mpvue框架是完全基于Vue框架的(重写了其runtime和compiler),因此在用法上面是高度和Vue一 ...
- 使用mpvue开发小程序教程(二)
在上篇文章中,我们介绍了使用mpvue开发小程序所需要的一些开发环境的搭建,并创建了第一个mpvue小程序代码骨架并将其运行起来.在本文中,我们来研究熟悉一下mpvue项目的主要目录和文件结构. 在V ...
- 使用mpvue开发小程序教程(五)
在上一章节中,我们了解了组件的三个基本特性以及组件的基本使用方法.在实际的小程序开发中,我们应该以组件的思维去设计每个小程序的功能页面,对其进行合理的组件拆分,让每个部分都保持功能简洁.条理清楚.各司 ...
- 使用mpvue开发小程序教程(六)
在上一章节中,我们列举了在Vue中能用但在mpvue中不能用或需要特别注意的特性,在实际开发前了解一下还是很有必要的,可以避免浪费找错误的时间. 如果你使用过原生的小程序框架,你一定经历过或思考过怎么 ...
- 使用mpvue开发小程序教程
从vue到mpvue再到微信小程序,这么几天下来感觉被搞晕了.三者之间的很多功能存在差异,项目也快接近尾声了,坑也踩了很多了,现在给后来的你们一点总结性经验: 1. 在模板中,动态插入HTML的v-h ...
- 使用mpvue开发小程序
前言: 最近接到小程序的开发需求,由于之前也没开发过小程序,心情还是有点激动.先花15分钟看一遍小程序官方文档,再花10分钟看一遍mpvue官方文档,然后拿着原型图和UI图就开干.踩了不少坑,写篇博客 ...
- 学习笔记:mpvue开发小程序——入门
接下来可能要开发一个小程序,同事推荐使用mpvue,那么我提前熟悉下. 官网地址:http://mpvue.com/ 1.快速上手 http://mpvue.com/mpvue/quickstart/ ...
- mpvue 开发小程序接口数据统一管理
mpvue项目里做API与数据分离统一管理 小程序里请求数据接口使用wx:request,因为考虑项目比较大,最好把wx:request封装起来,统一使用管理 utils.js 配置开发环境和线上环境 ...
随机推荐
- APP产品设计及运营时常见的问题
目录 一.APP设计之初必须预埋的功能 二.H5活动页入口设计 三.全套icon /menu icon / logo图,统一后台设置便于活动推广 四.webview与原生页面的路由应统一改善用户体验 ...
- BZOJ2143: 飞飞侠
2143: 飞飞侠 题意: 给出两个 n ∗ m 的矩阵 A,B,以及 3 个人的坐标 在 (i, j) 支付 Ai,j 的费用可以弹射到曼哈顿距离不超过 Bi,j 的位置 问三个人汇合所需要的最小总 ...
- hadoop ha zkfc 异常自动切换机制和hdfs 没有空间问题解决
在我搭建hadoop ha 后,我启动了各个功能,但是发现hadoop hdfs 没法使用,在web 页面也显示hdfs 可用空间为零,并且自动备份机制无法使用,本人也不理解,然后就是指定hdfs t ...
- Spark环境搭建(五)-----------Spark生态圈概述与Hadoop对比
Spark:快速的通用的分布式计算框架 概述和特点: 1) Speed,(开发和执行)速度快.基于内存的计算:DAG(有向无环图)的计算引擎:基于线程模型: 2)Easy of use,易用 . 多语 ...
- 1. Linux系统介绍
1. 什么是操作系统? 定义:操作系统是计算机系统中必不可少的基础系统软件,它的作用是负责管理和控制计算机系统中的硬件和软件资源,合理地组织计算机系统的工作流程,以便有效地利用资源为使用者提供一个功能 ...
- iview修改tabbar实现小程序自定义中间圆形导航栏及多页面登录功能
emmm,用iview改了个自定义中间圆形的tabbar. 如下图所示, 重点,什么鬼是“多页面登录”? 例如:我现在要做一个功能,要说自己长得帅才能进去页面. 一个两个页面还好,但是我现在要每个页面 ...
- HTML入门14
HTML表单 这块部分开始强调表单也是用的比较多的部分,好好补漏啊啊啊啊 表单用来做交互,处理所有方面结构到样式,到自定义小部件. form元素,严禁嵌套表单,表单嵌套会使得表单得行为不可预知,引入f ...
- nginx 静态目录配置规则
1.子目录匹配 如下配置 location / { root /data/www; } 访问http://127.0.0.1/时,配匹配/data/www 访问http://127.0.0.1/ima ...
- 手动安装composer详细教学
1.下载compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件,写入“@php "%~dp0compose ...
- easyui-combotree选中指定的值
选中根节点: //station_id为combotree控件id var station = $('#station_id').combotree('tree').tree('getRoots'); ...