关于$watch的疑问

来源:5-9 数据校验插件开发实例

小菜鸡冲冲冲

2021-04-11

<script>
    //插件对数据校验


    const app = Vue.createApp({
       data(){
           return{ name:'dell',
           age:25}
       },
       //自定义一个规则
       rules:{
        age:{
            validate:(age)=>{return age>25},
            message:'too young'
        },
        name:{
            validate:(name)=>{return name.length>4},
            message:'name too short'
        }
       },

       template:`
        <div>name:{{name}},age:{{age}}</div>
       `
    });
    
    const validatePlugin=(app,options)=>{
        app.mixin({
            created(){
            
            //.$optionsy用来获取定义在data外的数据和方法
       
            for(let key in this.$options.rules){
                const item=this.$options.rules[key]
                console.log(item)
                
                this.$watch(key,(value)=>{
                    const result=item.validate(value);
                    if(!result) console.log(item.message)
                } )
            }
        }
    })
   }
       
   app.use(validatePlugin)
    
    const vm = app.mount('#root');
</script>

为什么倒数第五行代码$watch的第二个参数可以自动获取改变后的data里的属性值呢;
watch监听器的两个参数不应该分别是现在的属性和改变前的属性吗,这里不太理解

写回答

2回答

有没有没被占用的昵称

2021-04-12

这个是全局api的写法,你传入第一个参数是需要侦听的对象,第二个参数是一个函数,函数的第一个参数是newValue,第二个是oldValue。

你所说的应该是在vue组件对象里面使用的watch

可能一般你会这样写

watch: {

    name (new, old) {}

}

实际上也可以这样

watch: {

    name: {

        handler (new, old) {}

    }

}

全局api调用可以看这里

https://v3.cn.vuejs.org/api/instance-methods.html#watch

1
3
小菜鸡冲冲冲
非常感谢!
2021-04-12
共3条回复

小菜鸡冲冲冲

提问者

2021-04-11

而且第一个参数为什么是索引key而不是元素item呢

0
1
Dell
这是 vue 语法设计的时候设计的
2021-04-12
共1条回复

Vue3入门与项目实战 掌握完整知识体系

明星讲师DELL亲授,全方位知识点+高匹配度项目,入门到深度掌握

3382 学习 · 1454 问题

查看课程