在介绍这些选项之前,我们先要了解这几个属性参数
| 12
 3
 4
 5
 
 | el: 指定Vue实例的挂载点,也就是DOM元素,是Vue的特有属性data: 用于声明需要响应式绑定的数据对象(实例的数据)
 components:Vue实例配置局部注册组件
 template:用于挂载元素的字符串模板
 render:渲染函数,创建虚拟DOM,是字符串模板的替代方案
 
 | 
首先,先创建出一个 Vue 实例:
| 12
 3
 4
 
 | let vm = new Vue({el: "#app",
 data: {},
 });
 
 | 
methods 方法
methods 选项是个对象,在其内部可以定义方法
比如说 click 事件、请求方法
| 12
 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++;
 },
 },
 });
 
 | 
| 12
 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 中侦听数据变化,一旦变化就执行回调,其回调函数有两个参数,新值和旧值,如果侦听的数据是数组或对象,新值和旧值打印的结果是一样的。
| 12
 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}`);
 },
 },
 });
 
 | 
| 12
 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。
| 12
 3
 4
 5
 6
 7
 8
 
 | watch:{num:{
 handler(oldVal,newVal){
 console.log(`监听到num的变化,${oldVal}--->${newVal}`)
 },
 immediate: true
 }
 }
 
 | 
deep(深度监听属性)
watch 中有一个深度监听属性 deep,默认为 false;当数据为引用类型时,重新赋值时未监听到,可以通过设置 deep 属性来进行深度监听。
| 12
 3
 4
 5
 6
 7
 8
 
 | watch: {list: {
 handler(oldVal,newVal){
 console.log(`监听到list的变化,${oldVal}--->${newVal}`)
 },
 deep: true
 }
 }
 
 | 
filters 过滤器
在 Vue 中允许自定义过滤器,来用于文本的格式化。
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | 过滤器一般用于双花括号“{{}}”插值和v-bind表达式中,也可以用于methods方法中。
 过滤器应该被添加在JS表达式的尾部,由“管道”符号连接。
 
 过滤器函数始终以表达式的值作为第一个参数;带引号的参数视为字符串,而不带引号的参数按表达式计算。
 
 模板中调用过滤器函数时如果使用了参数,顺序称为过滤器函数的第二、三…个函数。
 
 可以添加多个过滤器。
 
 | 
现将 list 中的 num 值做一下格式化,只保留到整数。
| 12
 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]
 }
 }
 
 | 
| 12
 
 | <div>{{ num | numFilter }}</div><div>{{ name | nameFilter }}</div>
 
 | 
也可以定义全局的过滤器,放在 Vue 实例之前:
| 12
 3
 
 | Vue.filter("numFilter", function (val) {return val.toFixed(0);
 });
 
 | 
如何在 js 中使用过滤器?
| 12
 3
 
 | this.list.forEach((item) => {item.num = this.$options.filters["numFilter"](item.num);
 });
 
 | 
props 用于接收来自父组件的数据(组件通信)
组件实例的作用域是孤立的。在子组件的模板内不能直接引用父组件的数据。父组件的数据需要通过 Prop 才能下发到子组件中,使用选项 props 申明该组件可接受的 prop 列表。
Prop 可以理解为在组件上注册的一些自定义属性,这些属性的值可以通过组件的 props 选项接收到。
| 12
 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>
 
 | 
| 12
 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。
| 12
 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)