首页 > 其他分享 >Vue 中 watch 监听器与 computed 计算属性的使用

Vue 中 watch 监听器与 computed 计算属性的使用

时间:2022-11-17 14:34:08浏览次数:51  
标签:musicData Vue computed author songSrc 监听器 id name

一、watch:监视单个属性,可做简单监视和深度监视。根据数据的具体结构,决定是否采用深度监视。配置deep:true可以监测对象内部值的改变,做深度监视时使用。

1、简单监视:监视单个属性值的改变。

    <div id="app">
        <input type="text" name="" v-model='msg'>
        <h3>{{msg}}</h3>
    </div>
    <script type="text/javascript" src="vue/vue.js"></script>
    <script type="text/javascript">
        new Vue({
            el:'#app',
            data(){
                return{
                    msg:'',
                }
            },
            watch:{
                msg:function(newV, oldV){
                    console.log(newV,oldV);
                    if(newV === 'xxx'){
                        console.log('xxx出来了')
                    }
                },
            }
        });
    </script>

 

 2、深度监视:监听复杂数据类型 object、array,可监听到对象或者数组内部值的改变。

开启深度监视: deep: true

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <button @click='stus[0].name = "rose"'>改变</button>
        <h3>{{stus[0].name}}</h3>
    </div>
    <script type="text/javascript" src="vue/vue.js"></script>
    <script type="text/javascript">
        new Vue({
            el:'#app',
            data(){
                return{
                    msg:'',
                    stus:[{name:'jack'}]
                }
            },
            watch:{
                // 监听复杂数据类型 object array 深度监视
                stus:{
                    deep:true, //深度监视
                    handler:function(newV, oldV){
                        console.log(newV[0].name);
                    }
                }
            }
        });
    </script>
</body>
</html>

 

二、computed 计算属性:可监视多个数据的改动。computed 用于动态的根据某个值或某些值的变化,来产生对应的变化。computed具有缓存性,具有缓存功能,只要里面的数据不发生改变,就不会重新计算。

1、computed 默认只有 get 方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        ul{
            list-style: none;
        }
        ul li{
            margin: 20px 20px;
            padding: 10px 5px;
            border-radius: 3px;
        }
        ul li.active{
            background-color: #66FFFF;
        }
    </style>
</head>
<body>
    <div id="app">
        <audio :src='getCurrentSongSrc' autoplay controls></audio>
        <ul>
            <li v-for = '(item,index) in musicData' :class='{active:currentIndex==index}' @click='clickHandler(index)'>
                <h2>{{item.id}}-歌名-{{item.name}}</h2>
                <p>歌手:{{item.author}}</p>
            </li>
        </ul>
    </div>
    <script type="text/javascript" src="vue/vue.js"></script>
    <script type="text/javascript">
        var musicData = [
            {id:1,name:'于荣光 - 少林英雄',author:'于荣光',songSrc:'./static/于荣光 - 少林英雄.mp3'},
            {id:2,name:'Joel Adams - Please Dont Go',author:'Joel Adams',songSrc:'./static/Joel Adams - Please Dont Go.mp3'},
            {id:3,name:'MKJ - Time',author:'MKJ',songSrc:'./static/MKJ - Time.mp3'},
            {id:4,name:'Russ - Psycho (Pt. 2)',author:'Russ',songSrc:'./static/Russ - Psycho (Pt. 2).mp3'}
        ];
        new Vue({
            el:"#app",
            data(){
                return{
                    musicData:musicData,
                    currentIndex:0
                }
            },
            computed:{
                getCurrentSongSrc:function() {
                    // 默认只有getter
                    return this.musicData[this.currentIndex].songSrc
                }
            },
            methods:{
                clickHandler(index){
                    this.currentIndex = index;
                }
            }
        });
    </script>
</body>
</html>

2、computed 的set方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        ul{
            list-style: none;
        }
        ul li{
            margin: 20px 20px;
            padding: 10px 5px;
            border-radius: 3px;
        }
        ul li.active{
            background-color: #66FFFF;
        }
    </style>
</head>
<body>
    <div id="app">
        <audio :src='getCurrentSongSrc' autoplay controls></audio>
        <ul>
            <li v-for = '(item,index) in musicData' :class='{active:currentIndex==index}' @click='clickHandler(index)'>
                <h2>{{item.id}}-歌名-{{item.name}}</h2>
                <p>歌手:{{item.author}}</p>
            </li>
        </ul>
    </div>
    <script type="text/javascript" src="vue/vue.js"></script>
    <script type="text/javascript">
        var musicData = [
            {id:1,name:'于荣光 - 少林英雄',author:'于荣光',songSrc:'./static/于荣光 - 少林英雄.mp3'},
            {id:2,name:'Joel Adams - Please Dont Go',author:'Joel Adams',songSrc:'./static/Joel Adams - Please Dont Go.mp3'},
            {id:3,name:'MKJ - Time',author:'MKJ',songSrc:'./static/MKJ - Time.mp3'},
            {id:4,name:'Russ - Psycho (Pt. 2)',author:'Russ',songSrc:'./static/Russ - Psycho (Pt. 2).mp3'}
        ];
        new Vue({
            el:"#app",
            data(){
                return{
                    musicData:musicData,
                    currentIndex:0
                }
            },    
            computed:{
                /*getCurrentSongSrc:function() {
                    // 默认只有getter
                    return this.musicData[this.currentIndex].songSrc
                }*/
                getCurrentSongSrc:{
                    set:function(newV){
                        this.currentIndex = newV;
                    },
                    get:function(oldV){
                        return this.musicData[this.currentIndex].songSrc
                    }
                }
            },
            methods:{
                clickHandler(index){
                    // 相当于设置值,只走set方法
                    this.getCurrentSongSrc = index;
                }
            }
        });
    </script>
</body>
</html>

 

标签:musicData,Vue,computed,author,songSrc,监听器,id,name
From: https://www.cnblogs.com/sfwu/p/16899368.html

相关文章

  • Vue mixin(混入)
    1、mixin配置mixin中文叫混入或者混合,作用是可以把多个组件共用的配置提取成一个混入对象,就是提取成共用一个配置2、定义mixin混入(mixin)的定义需是一个对象,然后Vue里的......
  • vue router keepalive 未生效的原因
    组件文件名称和组件名称不一致。如图,文件名称为index.vue,但是name为Review,两者不一致,导致缓存页面不成功。 解决方案:第一种:在index.vue中手动设置component的名称为......
  • 尚硅谷vue课程之vue中的mvvm
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content......
  • Vue新老系统切换(By 权)
    Vue新老系统切换1-    卸载node.js2-   https://github.com/coreybutler/nvm-windows/releases 下载nvm 3..安装后cmd  nvm-v 4.cmd里输入 nvmi......
  • vue 解决el-table 表体数据发生变化时,未重新渲染问题|页面不更新问题
    一、所遇到的问题在使用el-table组件时,数据已经发生了变化,但是页面显示的数据却没变化;二、解决办法在el-table中添加一个key,可以设置成boolean类型的,在数据更新后更新......
  • vue3点击其他元素隐藏固定DIV
    vue3点击其他元素隐藏固定DIV显示的内容<divv-if="hSearch"ref="iscity"><div><inputclass="h-9w-full"placeholder="内容搜索..."/></div></div>元......
  • vue项目中utils常用的js方法
    constbaseURL=process.env.VUE_APP_BASE_API//日期格式化exportfunctionparseTime(time,pattern){if(arguments.length===0||!time){returnnul......
  • vue网页滚动到一定程度出现动画效果
    script代码 data(){    return{      toShow3:false,    };  }mounted(){window.addEventListener('scroll',th......
  • Vue props配置
    1、props配置项props的作用是让组件接收外部传过来的数据(接收参数)2、组件传参向组件Student传入参数:name,sex,age<!--第一种方式:直接写参数名=xxx,传入的是字符串形式-......
  • vue纯前端导入excel,获取excel的表格数据渲染el-table并纯前端分页实现方法
    因为项目开发的过程中不是所有的表格数据由后台处理返回,因为有些数据不需要在数据库落地,只做前端页面展示并且获取表格的数据上传即可,所以需要前端纯处理excel的数据。第......