三、vue常用特性

vue常用特性

一、computed

计算属性:计算属性是基于它们的响应式依赖进行缓存的,计算属性比较适合对多个变量或者对象进行处理后返回一个结果值,也就是当多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化。

计算属性定义在Vue对象中,通过关键词computed属性对象中定义一个个函数,并返回一个值,使用计算属性时和data中的数据使用方式一致

 1 <div id="app">
 2   <!-- 当多次调用 cfn计算属性时只要里面的 num值不改变,它会把第一次计算的结果直接返回直到data中的num值改变 计算属性才会重新发生计算 -->
 3   <div>{{ cfn }}</div>
 4   <div>{{ cfn }}</div>
 5   <!-- 调用methods中的方法的时候  他每次会重新调用 -->
 6   <div>{{ fn() }}</div>
 7   <div>{{ fn() }}</div>
 8 </div>
 9 <script src="./js/vue.js"></script>
10 <script type="text/javascript">
11   const vm = new Vue({
12     el: "#app",
13     data: {
14       num: 10,
15     },
16     // 方法
17     methods: {
18       fn() {
19         console.log("methods");
20         return this.num;
21       },
22     },
23     // 计算属性(作为属性使用)
24     computed: {
25       cfn() {
26         console.log("computed");
27         return this.num;
28       },
29     },
30   });
31 </script>

注:只要依赖的数据源不发生改变,计算属性里的对应方法就只被调用1次,其它时候被调用时则使用缓存。

二、watch

监听器:使用watch监听data中数据的变化,watch中的属性一定是data中存在的数据

1、声明监听器关键词是watch

2、每个监听器的方法可以接收2个参数,第一个参数是新的值,第二个值是之前的值

 1 <div id="app">
 2   <p><input type="text" v-model='userinfo.firstName' placeholder="姓" /></p>
 3   <p><input type="text" v-model='userinfo.lastName' placeholder="名" /></p>
 4   <p><input type="text" v-model='userinfo.fullName' placeholder="全名" /></p>
 5 </div>
 6 
 7 <script src="./js/vue.js"></script>
 8 <script type="text/javascript">
 9   const vm = new Vue({
10     el: '#app',
11     data: {
12       userinfo: {
13         firstName: '',
14         lastName: '',
15         fullName: ''
16       }
17     },
18     watch: {
19       userinfo: {
20         // handler是固定的写法
21         handler(val) {
22           this.userinfo.fullName = val.firstName + ' ' + val.lastName
23           // 对象支持引用传值
24           val.fullName = val.firstName + ' ' + val.lastName
25         },
26         // immediate表示在watch中首次绑定的时候,是否执行handler
27         immediate: true,
28         deep: true
29       }
30     }
31   })
32 </script>

当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听

三、filters

过滤器:用于一些常见的文本格式化,可以在一个组件的选项中定义,也可以在全局定义,可以用在两个地方:双花括号插值和 v-bind 表达式

1 <!-- 在双花括号中 -->
2 {{ message | capitalize }}
3 
4 <!-- 在 `v-bind` 中 -->
5 <div v-bind:id="rawId | formatId"></div>
 1 <div id="app">
 2   <div>
 3     {{message | filterName}}
 4   </div>
 5 </div>
 6 
 7 <script src="./js/vue.js"></script>
 8 <script>
 9   new Vue({
10     el: '#app',
11     data: {
12       message: '123',
13       phone: ''
14     },
15     // 过滤器
16     filters: {
17       filterName(num){
18         // 对num做一些处理
19       }
20     }
21   })
22 </script>

四、mixins

混入mixins 选项接收一个混入对象的数组

  这些混入对象可以像正常的实例对象一样包含实例选项,这些选项将会被合并到最终的选项中,使用的是和 Vue.extend() 一样的选项合并逻辑。也就是说,如果你的混入包含一个 created 钩子,而创建组件本身也有一个,那么两个函数都会被调用。

当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”,合并策略:

1、data数据对象发生冲突时以组件数据优先

2、同名钩子函数将合并为一个数组,都将被调用,并且混入对象的钩子将在组件自身钩子之前调用

3、值为对象的选项,例如 methodscomponentsdirectives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对

1 var mixin = {
2   created: function () { console.log(1) }
3 }
4 var vm = new Vue({
5   created: function () { console.log(2) },
6   mixins: [mixin]
7 })
8 // 输出顺序 1 2

局部混入(按需混入)

 1 <script src="./js/vue.js"></script>
 2 <script type="text/javascript">
 3     // 定义一个混入对象(局部混入)
 4     var myMixin = {
 5         created: function () {
 6             this.hello();
 7         },
 8         methods: {
 9             hello: function () {
10                 console.log("hello from mixin!");
11             },
12         },
13     };
14     // Vue实例
15     const vm = new Vue({
16         mixins: [myMixin],
17     });
18 </script>

全局混入(强制混入)

 1 <script src="./js/vue.js"></script>
 2 <script type="text/javascript">
 3     // 全局混入
 4     Vue.mixin({
 5         created: function () {
 6             var myOption = this.myOption;
 7             if (myOption) {
 8                 console.log(myOption);
 9             }
10         },
11     });
12     // vue实例
13     new Vue({
14         data: {
15             myOption: "hello!",
16         }
17     });
18 </script>

 

posted @ 2021-07-07 01:37  大米饭盖饭  阅读(66)  评论(0)    收藏  举报