s

watch监听/computed计算属性

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7     <title>Document</title>
 8     <script src='../js/vue.js'></script>
 9 </head>
10 
11 <body>
12     <div id="app">
13         <input type="text" v-model='firstname'> +
14         <input type="text" v-model='lastname'> =
15         <input type="text" v-model=fullname>
16     </div>
17 </body>
18 <script>
19     let vm = new Vue({
20         el: '#app',
21         data: {
22             firstname: '',
23             lastname: '',
24             fullname: '',
25         },
26         methods: {},
27         watch: { //这个方法可以监听vue实例中所有属性的变化,从而触发这个watch中的处理函数  watch对象里面采用键值对方式,key:监听的数据,val:监听的回调
            //但是watch监听只适用于单个数据的监听,多个数据就要写多个键值对。业务逻辑一样也无法复用代码。显得代码冗余
28 'firstname': function(newval, oldval) { //表示监听data中firstname的变化,变化就执行后面的函数,newval为改变后的值,oldval为改变前的值 29 console.log(oldval + '---' + newval) // 30 this.fullname = newval + '-' + this.lastname; 31 }, 32 'lastname': function(newval, oldval) { //表示监听data中lastname的变化,变化就执行后面的函数,newval为改变后的值,oldval为改变前的值 33 console.log(oldval + '---' + newval) // 34 this.fullname = this.firstname + '-' + newval; 35 },
          '$route.path':function(newval){ //监听路由的变化, 引入vue-router.js后,vue实例就会有这个$route属性,$route上的path属性就表示hash路由# 后的内容,
          //加入有这样的业务,登录页面显示欢迎来到登录界面,注册页面就显示欢迎注册我们的产品,就可以监听路由
         },
36 37 } //watch 除了能监听data中数据的变化、dom变化,还可以监听非dom元素的变化 38 //例如 路由的变化, 39 //引入 路由包 vue-router.js 后,vue实例就自动绑定了一个$router对象, 40 //使用 '$router.path[或者任务$router中的属性值]:function(){}'就可以监听到这些值的改变从而做出相应的动作!!! 41    42 }) 43 </script> 44 45 </html>

 computed计算属性:

  

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src='../js/vue.js'></script>
</head>

<body>
    <div id="app">
        <input type="text" v-model='firstname'> +
        <input type="text" v-model='lastname'> =
        <input type="text" v-model='fullname'>
        <!-- 这里的full那么  是computed属性中的 fullname 这个key -->
    </div>
</body>
<script>
    let vm = new Vue({
        el: '#app',
        data: {
            firstname: '',
            lastname: '',

        },
        methods: {
            //methods/watch/computed 区别;
            // computed必须有return 值、结果会被缓存,watch不一定需要,methods也不一定需要
            // methods 适合写复杂的业务逻辑,watch可以写某些具体的业务逻辑 而computed主要负责简单的数据操作
            //watch可以看做methods和computed的结合
        },
        watch: { //这个方法可以监听data中指定数据的变化,从而触发这个watch中的处理函数
            'firstname': (newval, oldval) => { //表示监听data中firstname的变化,变化就执行后面的函数,newval为改变后的值,oldval为改变前的值
                console.log(oldval + '---' + newval) //
            },
            'lastname': (newval, oldval) => { //表示监听data中lastname的变化,变化就执行后面的函数,newval为改变后的值,oldval为改变前的值
                console.log(oldval + '---' + newval) //
            }

        },
        computed: { //计算属性 本质是function,但是调用的时候不需要加上(),直接当做属性即可使用,v-model 直接绑定计算属性 fullname
            'fullname': function() {
                //把原本定义在data中的fullname放到computed属性中,进行计算
                //这里引用了 data中的两个数据,只要被引用的数据任何一个改变
                //都会触发计算属性去重新求值并返回计算后的结果,并且缓存起来
                //如果数据不变,下次任何地方用到这个值就直接去缓存里拿数据,从而提高效率
                //  
                return this.firstname + '-' + this.lastname
          //到这里  computed计算属性都是根据依赖数据的改变而得到
          //其实还可以双向计算,如果计算属性结果是form表单中的input可以修改,或者通过代码改变结果,那么依赖也可以随着改变!!!
          
    
             /* 'fullname':{//完整的计算属性写法,键值对 ,值是一个对象,包含get set两个钩子
                    get(){}, //默认就会触发,当依赖改变也会触发这个get钩子
                    set(){}, //当计算属性结果改变不是通过依赖计算得到,而是直接修改这个结果,会触发这个set钩子函数
                  } */

},
        func(){ //computed 中 写法二, 直接定义一个函数, 这个函数名可以当做变量名使用。
          switch(this.firstname){
            ···
          }

        } //在vue实例控制的#app 这个div中, 如果func()中的firstname 改变 就会触发 func()这个函数, 【
计算属性 本质是function,但是调用的时候不需要加上(),直接当做属性即可使用 } })
         可以在#app 这个div 中 使用 v-for=“(item,index) in
func”【其实就是在循环func的返回值】,如果func()中的firstname 改变,就可以触发func里的逻辑循环渲染不同的数据!!!

</script>

</html>

  

 

posted @ 2021-05-07 09:47  努力不搬砖的iori  阅读(473)  评论(0编辑  收藏  举报