在介绍这些选项之前,我们先要了解这几个属性参数
1 2 3 4 5
| el: 指定Vue实例的挂载点,也就是DOM元素,是Vue的特有属性 data: 用于声明需要响应式绑定的数据对象(实例的数据) components:Vue实例配置局部注册组件 template:用于挂载元素的字符串模板 render:渲染函数,创建虚拟DOM,是字符串模板的替代方案
|
首先,先创建出一个 Vue 实例:
1 2 3 4
| let vm = new Vue({ el: "#app", data: {}, });
|
methods 方法
methods 选项是个对象,在其内部可以定义方法
比如说 click 事件、请求方法
1 2 3 4 5 6 7 8 9 10 11 12 13
| let vm = new Vue({ el: "#app", data: { num: 1, },
methods: { numAdd(e) { console.log(e, event); return this.num++; }, }, });
|
1 2 3 4
| <div id="app"> <span>{{ num }}</span> <button v-on:click="numAdd">+1</button> </div>
|
通过 v-on 指令绑定 click 点击事件,调用 methods 中定义的 numAdd()方法;从而实现 data 中 num 值加 1,并更新视图。
- 方法的参数(方法中可以获得绑定事件的 event)
- 当 numAdd 时,默认的参数值为 event 事件对象
- 当 numAdd(5)时,参数 e 就是传过来的参数 5
watch 侦听属性(观察)
侦听属性 watch 的作用可以监控 Vue 实例上的数据变动,并调用其回调函数。
在 watch 中侦听数据变化,一旦变化就执行回调,其回调函数有两个参数,新值和旧值,如果侦听的数据是数组或对象,新值和旧值打印的结果是一样的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| let vm = new Vue({ el: "#app", data: { num: 1, list: [ { name: "a", id: 1, num: 12.45 }, { name: "b", id: 2, num: 23.6789 }, { name: "c", id: 3, num: 43.512 }, { name: "d", id: 4, num: 55.4 }, { name: "e", id: 5, num: 40 }, ], },
methods: { numAdd(e) { return this.num + e; }, changeList(val) { this.list.push(val); }, },
watch: { num(oldVal, newVal) { console.log(`监听到num的变化,${oldVal}--->${newVal}`); },
list(oldVal, newVal) { console.log(`监听到list的变化,${oldVal}--->${newVal}`); }, }, });
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <div id="app"> <span>{{ num }}</span> <button v-on:click="numAdd(5)"></button> <table border="1"> <tr> <th>Name</th> <th>ID</th> <th>Num</th> </tr> <tr v-for="item in list" :key="item.id"> <td>{{ item.name }}</td> <td>{{ item.id }}</td> <td>{{ item.num }}</td> </tr> </table> <button v-on:click="changList({name:'f',id:6, num: 10})">PUSH</button> </div>
|
watch 中的方法在最初绑定的时候是不会执行的,只有当数据发生改变时才会去监听数据,当我们想要让它一开始就执行的话,就要用到 handler 和 immediate。
1 2 3 4 5 6 7 8
| watch:{ num:{ handler(oldVal,newVal){ console.log(`监听到num的变化,${oldVal}--->${newVal}`) }, immediate: true } }
|
deep(深度监听属性)
watch 中有一个深度监听属性 deep,默认为 false;当数据为引用类型时,重新赋值时未监听到,可以通过设置 deep 属性来进行深度监听。
1 2 3 4 5 6 7 8
| watch: { list: { handler(oldVal,newVal){ console.log(`监听到list的变化,${oldVal}--->${newVal}`) }, deep: true } }
|
filters 过滤器
在 Vue 中允许自定义过滤器,来用于文本的格式化。
1 2 3 4 5 6 7 8 9
| 过滤器一般用于双花括号“{{}}”插值和v-bind表达式中,也可以用于methods方法中。
过滤器应该被添加在JS表达式的尾部,由“管道”符号连接。
过滤器函数始终以表达式的值作为第一个参数;带引号的参数视为字符串,而不带引号的参数按表达式计算。
模板中调用过滤器函数时如果使用了参数,顺序称为过滤器函数的第二、三…个函数。
可以添加多个过滤器。
|
现将 list 中的 num 值做一下格式化,只保留到整数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const nameOptions = [ { key: "a", value: "张三" }, { key: "b", value: "小明" }, { key: "c", value: "李四" }, { key: "d", value: "王五" }, { key: "e", value: "小华" }, ]; const nameValue = nameOptions.reduce((a, b) => { a[b.key] = b.value; return a; }, {});
filters:{ numFilter(val){ return val.toFixed(0) },
nameFilter(value){ return nameValue[value] } }
|
1 2
| <div>{{ num | numFilter }}</div> <div>{{ name | nameFilter }}</div>
|
也可以定义全局的过滤器,放在 Vue 实例之前:
1 2 3
| Vue.filter("numFilter", function (val) { return val.toFixed(0); });
|
如何在 js 中使用过滤器?
1 2 3
| this.list.forEach((item) => { item.num = this.$options.filters["numFilter"](item.num); });
|
props 用于接收来自父组件的数据(组件通信)
组件实例的作用域是孤立的。在子组件的模板内不能直接引用父组件的数据。父组件的数据需要通过 Prop 才能下发到子组件中,使用选项 props 申明该组件可接受的 prop 列表。
Prop 可以理解为在组件上注册的一些自定义属性,这些属性的值可以通过组件的 props 选项接收到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<template> <Child name="userName" /> </template>
<script> import Child from "./Child" export default { name: 'parent', components: { Child } data(){ return { userName: '李四' } }, } </script>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <template> <!-- 李四 --> {{ name }} </template>
<script> export default { name:'Child',
props: { name: { type: String, default: '张三' } } } </script>
|
单向数据流:父级 prop 的更新会向下流动到子组件中,但是反过来则不行;每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。
computed 计算属性
有时候,我们拿到一些数据,需要经过处理计算后得到的结果,才是我们要展示的内容;对于复杂的计算应当使用实例的计算属性 computed。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <template> 平均年龄:<span>{{ meanAge }}</span> </template>
<script> export default { data(){ return { dataList: [ {name: '张三', age: 20}, {name: '李四', age: 18}, {name: '王五', age: 22} ] } },
computed: { meanAge(){ let sum = this.dataList.reduce((sum, data) => { return sum + parseInt(data.age); }, 0); return sum / this.dataList.length; } } } </script>
|
计算属性对于从现有源组合新数据非常方便,与方法相比,它们的一大优点是缓存了输出。
即:如果独立于计算属性的某些内容在页面上发生更改,并且重新呈现 UI。
computed 中的方法会返回缓存的结果,不会重新计算;
methods 中方法中会重新执行。
vue 组件—常用选项(methods、watch、filters、props、computed)