Vue2 过滤器、侦听器、计算属性、axios & vue-cli
目标:
在实际开发中合理运用过滤器、侦听器、计算属性解决问题
使用axios发起Ajax请求
使用vue-cli工具生成工程化的Vue项目
[toc]
过滤器(Filters)
2020年9月 vue3发布。增加了很多新功能,但是也删掉了一些功能。 比如删掉了vue2中的过滤器filter功能。
与此同时,官方建议: 用方法调用或计算属性替换过滤器。
filter过滤器能加工数据,computed计算属性和methods方法也都可以加工数据,这样的话,就功能重复了…(于是filter被开除了XDD)
vue3已经把过滤器删掉了,只能在vue2中使用,会基础语法就行了。
- 过滤器要点
- 必须被定义到
filters节点
之下,本质是一个函数 - 强调:过滤器中一定要有一个返回值
- 过滤器函数中的 形参
val
(随意命名),永远都是管道符前面的那个值。(多个形参,则第一个外都是undefined) - 过滤器函数 由 管道符
|
调用 - 过滤器只能在
差值表达式
或属性绑定指令v-bind
中调用 - 最终得到的结果是过滤器的返回值
- 必须被定义到
过滤器常用于文本的格式化,应该被添加在JavaScript表达式的尾部,由“管道符”进行调用。示例:
1 | <!-- 在花括号中通过管道符调用capitalize过滤器,对message的值进行格式化 --> |
私有过滤器 和 全局过滤器
在 filters节点
下定义的过滤器,称为“私有过滤器”,因为它只能在当前vm实例所控制的el区域内使用。如果希望在多个vue实例之间共享过滤器,则可以按照如下的格式定义全局过滤器:
1 | // 全局过滤器–独立于每个vm实例之外 |
注意:如果私有过滤器和全局过滤器名字一致,此时按就近原则
其他用法 – 连续调用、传参
连续调用多个过滤器 – 串联地调用
如:{{message | filterA | filterB}}
过滤器传参
1
<p>{{message | filterA(arg1,arg2)}}<p>
1
Vue.filter('filterA',(msg,arg1,arg2)=>{...})
过滤器的兼容性
仅在vue 2.x 和 1.x中受支持
3.x建议使用 计算属性 或 方法 代替
具体的迁移指南参考官方文档给出的说明
Watch侦听器
Watch侦听器 监视数据的变化,做出特定操作,变量名与监听的值对应。语法格式:
1 | const vm = new Vue({ |
应用场景如:侦听用户输入的用户名,每次变化就去查找是否被占用
侦听器的格式
- 方法格式的侦听器
- 缺点1: 无法在刚进入页面的时候,自动触发!!
- 缺点2: 如果侦听的是一个对象,对象中的属性发生了变化,不会触发侦听器!!
- 对象格式的侦听器
- 好处1: 可以通过immediate选项,让侦听器自动触发!!
- 好处2:可以通过deep选项,让侦听器深度监听对象中每个属性的变化!!
- 推荐:为了写起来方便,建议定义成方法格式,如果确实需要,再改成对象格式。
immediate选项
1 | const vm = new Vue({ |
深度侦听 – deep选项
1 | const vm = new Vue({ |
如果要侦听的是对象的子属性的变化,则必须包裹一层单引号
1 | watch:{ |
computed计算属性
- 什么是计算属性
计算属性指的是通过一系列运算之后,最终得到一个属性值。
这个动态计算出来的属性值可以被模板结构或 methods 方法使用。 - 应用场景:实现代码复用
- 计算属性的使用
- 计算属性要定义到computed节点下,定义成方法格式
- 虽然声明的方法格式,但是要当做普通的属性来用
打印出vue实例,可以发现定义的计算属性是被挂到属性上面的,和data节点上的属性一样
示例代码如下︰
1 | var vm = new Vue({ |
axios的基本用法
axios是一个专注于网络请求的库!它只负责发请求和拿数据
中文官网地址:http://www.axios-js.com/
基本语法:
1
2
3
4
5
6
7
8
9
10
11
12axios({
method: '请求的类型',
url: '请求的 URL 地址',
// 如果要携带请求体:
// url中的查询参数,get请求体传参,可选
params:{},
// 请求体参数,post请求体传参,可选
data:{}
}).then((result)=>{
// .then 用来指定请求成功之后的回调函数
// 形参中的 result 是请求成功之后的结果
})调用axios得到的返回值是一个 Promise 对象
axios在请求到数据之后,在真正的数据之外,套了一层壳,result得到的就是套完壳之后的结果。1
2
3
4
5
6
7
8{
config: {},
data: { 真实的数据 },
headers: {},
request: {},
status: xxx,
statusText: ''
}结合async和await调用axios
这个.then
用起来有点麻烦,我们可以使用await来进行简化
如果调用某个方法的返回值是 Promise 实例,则前面可以添加await!(这样得到的就直接是result)
await 只能用在被 async 修饰 的方法中1
2
3
4
5
6
7ele.addEventLister('click', async function(){
const result = await axios({
method: '请求的类型',
url: '请求的 URL 地址',
})
console.log(result.data);
})使用解构赋值来获取data
1
2
3
4
5
6
7ele.addEventLister('click', async function(){
const { data } = await axios({
method: '请求的类型',
url: '请求的 URL 地址',
})
console.log(data);
})
基于axios.get和axios.post发起请求
- axois.get
1
2
3
4
5const {data} = await axios.get('url地址',{
//GET参数
params: {}
})
console.log(data) - axios.post
1
2
3
4
5
6
7
8
9
10
11//注意await要在async修饰的函数中使用
const { data } = await axios.post('http://127.0.0.1:8080/form',{
unit: "00",
contact: "朱宇楼",
phone: '15639038667',
numVisitors: 25,
guide: 'yes',
date: '2025-05-15',
time: '14:30'
})
console.log(data);
vue-cli的安装和使用
中文官网:https://cli.vuejs.org/zh/
什么是单页面应用程序?
单页面应用程序(英文名: Single Page Application)简称SPA,顾名思义,指的是一个Web 网站中只有唯一的一个HTML页面,所有的功能与交互都在这唯一的一个页面内完成。什么是vue-cli
vue-cli是Vue.js开发的标准工具。它简化了程序员基于webpack创建工程化的Vue项目的过程。安装
vue-cli是npm上的一个全局包,使用npm i
命令,即可方便的把它安装到自己电脑上:npm i -g @vue/cli
vue -V
查看安装的版本号
使用
基于vue-cli快速生成工程化的Vue项目:vue create 项目名称
(建议名称用不带空格的英文)
在想要创建项目的文件夹执行此命令,即会生成项目文件夹,命名即为 项目名称- 选择预设(用方向键)
初学者建议选择最后一项 – 手动选择要安装哪些功能
按空格选中要安装的预设
一开始建议选择:
Choose Vue version(新版没有这个)、Babel、CSS Pre-processors,其他的不要选
下面接着选择vue版本为2.x,css预处理器为less
- 选择预设(用方向键)
vue项目中src目录的构成:
- assets 文件夹:存放项目中用到的静态资源文件,例如:css样式表、图片资源
- components 文件夹:程序员封装的、可复用的组件,都要放到components目录下。
里面有一个默认组件HelloWorld.vue,给它删除 - main.js 是项目的入口文件。整个项目的运行,要先执行main.js
- app.Vue 是项目的根组件。我们创建项目之后,看到的页面就是app.Vue,如果想重新换一个页面出来,只需要把它给清空掉。里面的template是一个模版结构。
vue项目的运行流程
在工程化的项目中,vue要做的事情很单纯: 通过main.js把 App.vue渲染到index.html的指定区域中。
其中:- App.vue用来编写待渲染的模板结构
- index.html中需要预留一个el区域
- main.js 把 App.vue渲染到了index.html所预留的区域中
1
2
3
4
5
6
7
8
9
10
11
12
13
14// 导入 vue 这个包,得到Vue构造函数
import Vue from 'vue'
// 导入App.vue根组件,将来要把App.vue中的模板结构,渲染到HTML页面中
import App from './App.vue'
Vue.config.productionTip = false
// 创建Vue的实例对象
new Vue({
// 把 render 函数指定的组件渲染到HTML页面中,这里指定了App
// 我们最终的结果是,把这个指定的组件,放到id为app的所在的这个位置,把它给替换掉了
render: h => h(App),
}).$mount('#app')
// vue实例的$mount()方法,作用和el属性完全一样
扩展知识
字符串函数charAt()
接收索引值,从字符串中获取对应字符,如:'hello'.charAt(4) //'o'
将字符串第一个字符变为大写
1 | let str = 'hello' |
ajax原生写法
1 | function xxx(){ |