vue中watch监听器

watch作用

        vue中,主要使用watch来监听和响应数据的变化,然后调用数据变化需要执行的方法.也可以通过watch动态的改变关联的状态.

基本格式

{

         watch:{

                        被监听的变量(新值,老值){}

                    }

}

代码演示:

<body>

    <!-- 使用vue开发前端页面,必须在页面给出vue所控制(管理)的区域 -->
    <div id="app">
        <p><input type="text" placeholder="请输入关键字" v-model="keyword"></p>
        <ul>
            <li v-for="item in resultArr.length == 0 ? arr : resultArr">{{item}}</li>
        </ul>
    </div>

    <script src="./js/vue3.js"></script>

    <script>
        // 1. 创建vue实例
        const app = Vue.createApp({
            data() {
                return {
                    arr: ["张三", "李四", "王五", "张三丰", "李小四", "王麻子", "王小五", "赵六", "赵四", "田七", "田八"],
                    keyword: "",
                    resultArr: []
                }
            },
            // watch配置项,它的作用是用来监听vue中的变量变化情况
            // 只要监听的数据发生改变,watch中对应的监听的代码就自动执行
            watch: {
                // 有两个参数
                // 第一个参数为新值
                // 第二个参数为旧值
                keyword(newVal, oldVal) {
                    // 监听到keyword的变化,需要将resultArr原来的数据清空
                    this.resultArr.splice(0);
                    this.arr.forEach(item => {
                        if (item.includes(newVal)) {
                            this.resultArr.push(item);
                        }
                    });
                    if (this.resultArr.length == 0) {
                        this.resultArr.push("搜索的数据不存在")
                    }
                }
            }
        });
        // 2、将vue与页面绑定
        app.mount("#app");
    </script>
</body>

深度监听和立即执行

深度监听:

                watch默认是浅层的:被侦听的属性,仅在被赋新值时,才会触发回调函数----而嵌套属性的变化不花触发.如果向侦听所有嵌套的变更,需要使用深层侦听器.

 立即执行:

                watch默认是懒执行的;  仅当数据源变化的时候,才会执行毁掉.但在某些场景中,我们希望监听器立即执行一遍回调.注:开启立即执行,导致监听到之后,只有新值,没有老值.所有在处理逻辑时,如果需要老值进行应用要对值进行判断非NULL的情况.

<!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">
        <p>搜索关键字:<input type="text" v-model.lazy="keyword"></p>
        <p>关键数据:</p>
        <p v-for=" name in (selectName.length>0?selectName:names)">{{name}}</p>
    </div>
    <script src="./js/vue3.js"></script>

    <script>
       //创建Vue实例
        const app=Vue.createApp({
            
            data () {
                return {
                    keyword:'',
                    names:["张三","李四","李烈","张三丰"],
                    selectName:[]
                  
                }
            },       
            methods: {
             
            },
            watch: {
                // keyword(newValue,oldValue){
                //     this.selectName=[];
                //     if(nameValue!=""){
                //         this.names.forEach(name => {
                //             if(name.startsWith(newValue)){
                //                 this.selectName.push(name);
                //             }
                       
                //     });

                //   }
                
                // },
            keyword:{
                handler(newValue,oldValue){
                    this.selectName=[];
                    if(newValue!=''){
                        this.names.forEach(element => {
                            if(element.startsWith(newValue)){
                                this.selectName.push(element);
                            }
                            
                        });
                    }
                    if(this.selectName.length==0){
                        this.selectName.push(...this.names);
                    }
                },
                

                deep:true
                //立即加载,  监听器默认是不会执行的,只有被监听的数据发生变化的时候才执                                    
                //行.
                immediate:true

            }          
            }
        })

        //将Vue与页面绑定
        app.mount('#app')

    </script>
</body>
</html>

        注:在深度监听时newVal和oldVal的值会显示相等,因为器底层使用的是proxy代理,相当于两者只是同一个对象,不同的引用.

        解决方案:在computed配置项中将JSON转换为字符串,再将字符串转换成JSON类型,这一过程就相当于新建了一个对象.

            computed:{
                return{

                 JSON.parse(JSON.stringify(this.user));
            }

        如果需要监听对象中的某个指定的属性变量,可以采用字符串的方式 书写监听器函数名

watch:{

        //监听的user中的age属性

        "user.age"(){

        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值