Vue基础语法(三)

2023-05-09 08:34:45 浏览数 (1)

Vue监听的介绍

1、虽然Vue的计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器

2、vue通过watch选项提供了一个更通用的方法,来响应数据的变化

3、当需要在数据变化时执行异步开销较大的操作时,这个方式是最有用的


一、监听

1、简单的监听

代码语言:javascript复制
<body>
    <div id="app">
        <h1>{{a}}</h1>
        <button @click="add"> </button>
    </div>
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                a:0,
            },
            watch:{
                a(newVal,oldVal){
                    console.log('新',newVal,'旧',oldVal);
                    console.log('变了变了');
                }
            },
            methods:{
                add(){
                    this.a  
                }
            },
        })
    </script>
</body>

2、对象的监听

(1)写法:在watch中需要handler和deep结合(注意单词不要拼写错,不然会报错)

(2)区别简单监听

①错误:用简单监听来监听对象,会出现新旧值始终指向同一个空间,无法监听到旧值的问题

代码语言:javascript复制
<body>
    <div id="app">
        <input type="text" v-model="userInfo.name">
    </div>
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                userInfo:{
                    name:'申小兮',
                },
            },
            watch:{
                userInfo:{
                    handler(newInfo,oldInfo){
                        console.log(newInfo,oldInfo);
                    },
                    deep:true,
                },
            },
        })
    </script>
</body>

②正确:用ES6学习的方法深拷贝,使得新旧值指向各自的空间

代码语言:javascript复制
<body>
    <div id="app">
        <input type="text" v-model="userInfo.name">
    </div>
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                userInfo:{
                    name:'申小兮',
                },
            },
            watch:{
                newUserInfo:{
                    handler(newInfo,oldInfo){
                        console.log(newInfo,oldInfo);
                    },
                    deep:true,
                },
            },
            computed:{
                newUserInfo(){
                    return JSON.parse(JSON.stringify(this.userInfo))
                }
            }
        })
    </script>
</body>

3、immediate立即触发

页面一进入就会触发

代码语言:javascript复制
<body>
    <div id="app">
        <h1>{{a}}</h1>
        <button @click="add"> </button>
    </div>
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                a:0,
            },
            watch:{
                a:{
                    handler(newVal,oldVal){
                        console.log(newVal,oldVal);
                    },
                    immediate:true
                }
            },
            methods:{
                add(){
                    this.a  
                }
            },
        })
    </script>
</body>

二、创建组件

Vue2组件参考文档:组件基础 — Vue.js

1、具体步骤

(1)创建组件构造器:Vue.extend({})

(2)参数template,代表模板,类似于html,通过模板字符串设置标签块

注意:模板字符串有多个标签时,一定要用div标签嵌套包裹,否则会报错

(3)注册Vue.component("组件名称",组件内容)

(4)使用:把组件名称当作标签直接用

代码语言:javascript复制
<body>
    <div id="app">
        <!-- 4、使用 -->
        <my-advertising></my-advertising>
    </div>
    <script>
        // 1、创建构造器
        const cpn = Vue.extend({
            // 2、参数
            template:`
            <div>
                <h1>广告标题</h1>
                <p>广告内容</p>
                <p>广告结尾</p>
            </div>
            `,
        })
        // 3、注册
        Vue.component('my-advertising',cpn)
        const app = new Vue({
            el:'#app',
        })
    </script>
</body>

2、创建组件语法糖

省略创建构造器Vue.extend({})步骤,直接进行注册Vue.component(),在注册步骤里面设置参数template,使编写更快捷

代码语言:javascript复制
<body>
    <div id="app">
        <my-advertising></my-advertising>
    </div>
    <script>
        Vue.component('my-advertising',{
            template:`
            <div>
                <h1>广告标题</h1>
                <p>广告内容</p>
                <p>广告结尾</p>
            </div>
            `,
        })
        const app = new Vue({
            el:'#app',
        })
    </script>
</body>

三、全局组件和局部组件

注意:一个html文件里面,不应该出现两个vue实例,但是下面需要演示全局和局部的效果,小编会建两个vue实例

0 人点赞