Vue基础

目录

一、初识Vue

二、Vue模板语法

三、数据绑定

四、el与data的两种写法

五、Vue中的MVVM

五、数据代理

1. 回顾Object.defineproperty方法

2.何为数据代理

3.Vue中的数据代理

六、事件处理

1.事件处理的基本使用

2.事件修饰符 


 

一、初识Vue

初识Vue:

        1. 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象;

        2. root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法;

        3. root容器里的代码被称为【Vue模板】;

        4. Vue实例和容器一一对应的:

        5. 真实开发中只有一个Vue实例,并且会配合着组件一起使用:

        6. {{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性

        7. 一旦data中的数据发送改变,那么页面中用到该数据的地方也会自动更新;

        注意区分: js表达式 和 js代码(语句)

            1. 表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方:

                (1). a

                (2). a+b

                (3). demo(1)

                (4). x === y ? 'a' : 'b'

            2. js代码(语句)

                (1). if() {}

                (2). for() {} 

<body>
    <!-- 
        初识Vue:
        1. 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象;
        2. root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法;
        3. root容器里的代码被称为【Vue模板】;
        4. Vue实例和容器一一对应的:
        5. 真实开发中只有一个Vue实例,并且会配合着组件一起使用:
        6. {{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性
        7. 一旦data中的数据发送改变,那么页面中用到该数据的地方也会自动更新;

        注意区分: js表达式 和 js代码(语句)
            1. 表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方:
                (1). a
                (2). a+b 
                (3). demo(1)
                (4). x === y ? 'a' : 'b'

            2. js代码(语句)
                (1). if() {}
                (2). for() {}
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h1>Hello,{{name}}</h1>
    </div>
    <script type="text/javascript">
        Vue.config.production = true; // 阻止 vue 在启动时生成生产提示
        
        // 创建Vue实例
        new Vue({
            el: '#root', // el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串。
            data: { // data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
                name: '尚硅谷',

            }
        }) 
    </script>
</body>
</html></html>

二、Vue模板语法

 Vue模板语法有2大类:

          1.插值语法:

              功能:用于解析标签体内容。

              写法:{{xxx}},xxx是js表达式,且可以直接读取data中的所有属性。

          2.指令语法:

              功能:用于解析标签(包括:标签属性、标签体内容、绑定事件...)

              举例:v-bind:href="xxx" 或 简写为 :href="xxx", xxx同样要写js表达式

                    且可以直接读取到data中的所有属性。

              备注:Vue中有很多的指令,且形式都是:v-????,此处我们只是拿v-bind举个例 子。

​
<body>
    <!-- 
        Vue模板语法有2大类:
          1.插值语法:
              功能:用于解析标签体内容。
              写法:{{xxx}},xxx是js表达式,且可以直接读取data中的所有属性。
          2.指令语法:
              功能:用于解析标签(包括:标签属性、标签体内容、绑定事件...)
              举例:v-bind:href="xxx" 或 简写为 :href="xxx", xxx同样要写js表达式
                    且可以直接读取到data中的所有属性。
              备注:Vue中有很多的指令,且形式都是:v-????,此处我们只是拿v-bind举个例子。
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h1>插值语法</h1>
        <h3>你好,{{name}}</h3>
        <hr/>

        <h1>指令语法</h1>
        <a :href="url">点我去尚硅谷学习1</a>
    </div>
    <script type="text/javascript">
        Vue.config.production = true; // 阻止 vue 在启动时生成生产提示。

        new Vue({
            el: '#root',
            data: {
                name: 'jack',
                url:'http://www.atguigu.com'
            }
        })
    </script>
</body>
</html></html>

​

三、数据绑定

Vue中有2种数据绑定的方式:

            1.单向绑定(v-bind):数据只能从data流向页面。

            2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。

              备注:

                  1.双向绑定一般应用在表单类元素上(如:input、select等)

                  2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。

​
<body>
    <!-- 
        Vue中有2种数据绑定的方式:
            1.单向绑定(v-bind):数据只能从data流向页面。
            2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。
              备注:
                  1.双向绑定一般应用在表单类元素上(如:input、select等)
                  2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <!-- 普通写法 -->
        单向数据绑定: <input type="text" v-bind:value="name"></body>
        双向数据绑定: <input type="text" v-model:value="name"></br>

        <!-- 简写 -->
        单向数据绑定: <input type="text" :value="name"></br>
        双向数据绑定: <input type="text" v-model="name"></br>

        <!-- 如下代码是错误的,因为v-model只能应用在表单类元素(输入类元素)上 -->
        <h2 v-model:x="name">你好啊</h2>
    </div>
    <script type="text/javascript">
        Vue.config.production = true; // 阻止 vue 在启动时生成生产提示。
        new Vue({
            el:"#root",
            data: {
                name:'尚硅谷'
            }
        })
    </script>
</body>
</html></html>

​

四、el与data的两种写法

data与el的两种写法

            1.el有2种写法

                    (1).new Vue时候配置el属性。

                    (2). 先创建Vue实例,随后再通过vm.$mount('#root')指定el的值。

            2.data有2种写法

                    (1).对象式

                    (2).函数式

                    如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错。

            3.一个重要的原则:

                    由Vue管理的函数,一定不用写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。

​
<body>
    <!--
        data与el的两种写法
            1.el有2种写法
                    (1).new Vue时候配置el属性。
                    (2). 先创建Vue实例,随后再通过vm.$mount('#root')指定el的值。
            2.data有2种写法
                    (1).对象式
                    (2).函数式
                    如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错。
            3.一个重要的原则:
                    由Vue管理的函数,一定不用写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h1>你好,{{name}}</h1>
    </div>
    <script type="text/javascript">
        Vue.config.production = true; //阻止 vue 在启动时生成生产提示。

        // el的两种写法
         const v = new Vue({
             // el:"#root", //第一种写法
             data: {
                 name:'尚硅谷'
             }
         })
         console.log(v);
         v.$mount('#root') //第二种写法

        // setTimeout(() => {
        //     v.$mount('#root')
        // },1000)

        // data的两种写法
        new Vue({
            el:"#root",
            //data第一种写法:对象式
            data: {
                name:'尚硅谷'
            } 

            //data第二种写法:函数式
            data(){
                console.log('@@@',this); // 此处的this是Vue实例对象
                return{
                    name:'尚硅谷'
                }
            }
        })
    </script>
</body>
</html></html>

​

五、Vue中的MVVM

 MVVM模型

            1. M:模型(model):data中的数据

            2. V: 视图(View):模板代码

            3. VM: 视图模型(ViewModel):Vue实例

        观察发现:

            1.data中所有的属性,最后都出现在了vm身上。

            2.vm身上所有的属性 及 Vue原型上所有的属性,在Vue模板中都可以直接使用。

<body>
    <!-- 
       MVVM模型
            1. M:模型(model):data中的数据
            2. V: 视图(View):模板代码
            3. VM: 视图模型(ViewModel):Vue实例
        观察发现:
            1.data中所有的属性,最后都出现在了vm身上。
            2.vm身上所有的属性 及 Vue原型上所有的属性,在Vue模板中都可以直接使用。
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
       <h1>学校名称:{{name}}</h1>
       <h1>学校地址:{{address}}</h1>
       <h1>测试一下1:{{1+1}}</h1>
       <h1>测试一下2:{{$options}}</h1>
       <h1>测试一下3:{{$emit}}</h1>
       <h1>测试一下3:{{_c}}</h1>
    </div>
    <script type="text/javascript">
        Vue.config.production = true; // 阻止 vue 在启动时生成生产提示。
        new Vue({
            el:"#root",
            data: {
                name:'尚硅谷',
                address:'北京'
            }
        })
    </script>
</body>
</html></html>

五、数据代理

1. 回顾Object.defineproperty方法

<body>
    <script type="text/javascript">
        let number = 18
        let person = {
            name:'张三',
            sex: '男',
            // age: 18
        }

        Object.defineProperty(person,'age',{
            // value:18,
            // enumerable:true, //控制属性是否可以枚举,默认值是false
            // writable:true, //控制属性是否可以被修改,默认值是false
            // configurable:true, //控制属性是否可以被删除,默认值是false
        
            //当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
            get(){
                // return 'hello'
                console.log('有人读取age属性了');
                return number
            },

            //当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
            set(value){
                console.log('有人修改了age属性,且值是',value);
                number = value
            }
        }) 

        // 遍历Object.keys 对象属性
        // console.log(Object.keys(person));

        console.log(person);
    </script>
    
</body>
</html><html>

2.何为数据代理

<body>
    <!-- 数据代理:通过一个对象代理另一个对象中属性的操作(读/写) -->
    <script type="text/javascript">
        let obj = {x:100}
        let obj2 = {y:200}

        Object.defineProperty(obj2,'x',{
            //有人通过obj2访问x的时候,返回的值是obj.x
            get(){
                return obj.x;
            },
            set(value){
                obj.x = value
            }
        })
    </script>
</body>
</html>

​

3.Vue中的数据代理

 

       1.Vue中的数据代理:

             通过vm对象来代理data对象中属性的操作(读/写)

        2.Vue中数据代理的好处:

             更加方便的操作data中的数据

        3.基本原理:

             通过Object.defineProperty()把data对象中所有属性添加到vm上。

             为每一个添加到vm上的属性,都指定一个getter/setter。

             在getter/setter内部去操作(读/写)data中对应的属性

 

 代码:

​
<body>
    <!-- 
        1.Vue中的数据代理:
             通过vm对象来代理data对象中属性的操作(读/写)
        2.Vue中数据代理的好处:
             更加方便的操作data中的数据
        3.基本原理:
             通过Object.defineProperty()把data对象中所有属性添加到vm上。
             为每一个添加到vm上的属性,都指定一个getter/setter。
             在getter/setter内部去操作(读/写)data中对应的属性
       
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
       <h2>学校名称:{{name}}</h2>
       <h2>学校地址:{{address}}</h2>
    </div>
    <script type="text/javascript">
        Vue.config.production = true; // 阻止 vue 在启动时生成生产提示。
        let data = {
            name:'尚硅谷',
            address:'宏福科技园'
        }
        const vm = new Vue({
            el:"#root",
            data: {
                name:'尚硅谷',
                address:'宏福科技园'
            }
        })
    </script>
</body>
</html>

​

六、事件处理

1.事件处理的基本使用

事件的基本使用:

            1.使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名;

            2.事件的回调需要配置在methods对象中,最终会在vm上;

            3.methods中配置的函数,不要用箭头函数!否则this就不是vm了;

            4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象;

            5.@click="demo" 和 @click="demo($event)" 效果一致,但后者可以传参

​
<body>
    <!-- 
       事件的基本使用:
            1.使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名;
            2.事件的回调需要配置在methods对象中,最终会在vm上;
            3.methods中配置的函数,不要用箭头函数!否则this就不是vm了;
            4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象;
            5.@click="demo" 和 @click="demo($event)" 效果一致,但后者可以传参
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
       <h2>欢迎来到{{name}}学习</h2>
       <BUtton v-on:click="showInfo">点我提示信息</BUtton>
       <BUtton @click="showInfo1">点我提示信1(不传参)</BUtton>
       <BUtton @click="showInfo2(66,$event)">点我提示信2(传参)</BUtton>
    </div>
    <script type="text/javascript">
        Vue.config.production = true; // 阻止 vue 在启动时生成生产提示。
        const vm = new Vue({
            el:"#root",
            data: {
                name:'尚硅谷'
            },
            methods: {
                showInfo(event){
                    //event.target拿到发生事件的事件目标
                    // console.log(event.target.innerText);

                    // console.log(this); //此处的this是vm

                    alert('同学你好')
                },
                showInfo1(event){
                    //event.target拿到发生事件的事件目标
                    // console.log(event.target.innerText);

                    // console.log(this); //此处的this是vm

                    alert('同学你好!')
                },
                showInfo2(number,a){
                    console.log(number,a);
                    //event.target拿到发生事件的事件目标
                    // console.log(event.target.innerText);

                    // console.log(this); //此处的this是vm

                    alert('同学你好!!')
                },
            }
        })
    </script>
</body>
</html></html>

​

2.事件修饰符 

 Vue中的事件修饰符:

            1.prevent:阻止默认事件(常用);

            2.stop:阻止事件冒泡(常用);

            3.once:事件只触发一次(常用);

            4.capture:使用事件的捕获模式;

            5.self:只有event.target是当前操作的元素时才出发事件;

            6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕

修饰符可以连续写 

<body>
    <!-- 
       Vue中的事件修饰符:
            1.prevent:阻止默认事件(常用);
            2.stop:阻止事件冒泡(常用);
            3.once:事件只触发一次(常用);
            4.capture:使用事件的捕获模式;
            5.self:只有event.target是当前操作的元素时才出发事件;
            6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕;
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
       <h2>欢迎来到{{name}}学习</h2>
       <!-- 阻止默认事件(常用) -->
       <a href="http://www.atguigu.com" @click.prevent="showInfo">点我提示信息</a>
       <!-- 阻止事件冒泡(常用) -->
       <div @click="showInfo" class="demo1">
           <button @click.stop="showInfo">点我提示信息</button>
           <!-- stop.prevent 先停止冒泡再处理默认事件 -->
           <a href="http://www.atguigu.com" @click.stop.prevent="showInfo">点我提示信息</a>
       </div>
        <!-- 事件只触发一次(常用) -->
        <button @click.once="showInfo">点我提示信息</button>
        <!-- 使用事件的捕获模式 -->
        <div class="box1" @click.capture="showMsg(1)">
            div1
            <div class="box2" @click="showMsg(2)">
                div2
            </div>
        </div>

        <!-- 只有event.target是当前操作的元素时才出发事件; -->
        <div @click="showInfo">
            <button @click.self="showInfo">点我提示信息</button>
        </div>

        <!-- 事件的默认行为立即执行,无需等待事件回调执行完毕; -->
        <!-- scroll 为滚动事件 -->
        <ul class="list" @wheel.passive="demo">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
    </div>
    <script type="text/javascript">
        Vue.config.production = true; // 阻止 vue 在启动时生成生产提示。
        new Vue({
            el:"#root",
            data: {
                name:'尚硅谷'
            },
            methods: {
                showInfo(e){
                    // preventDefault 阻止默认行为
                    // e.preventDefault();

                    // stopPropagation 阻止冒泡行为
                    // e.stopPropagation()
                    // alert('同学你好!')

                    // console.log(e.target);
                },
                showMsg(msg){
                    console.log(msg);
                },
                demo(){
                    // console.log('@');
                    for (let i = 0; i < 10000; i++) {
                        console.log('#');
                    }
                    console.log('累坏了');
                }
            }
        })
    </script>
</body>
</html></html>

 

 3.键盘事件

1.Vue中常用的按键别名:

            回车 => enter

            删除 => delete (捕获"删除"和"退格"键)

            退出 => esc

            空格 => space

            换行 => tab (特殊, 必须配合keydown去使用)

            上 => up

            下 => down

            左 => left

            右 => right

        2.Vue未提供别名的按键,可以使用案件原始的key值去绑定,但注意要转为kebab-case(短横线命名)

        3.系统修饰键 (用法特殊):ctrl、alt、shift、meta

            (1).配合keyup使用: 按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发.

            (2).配合keydowm使用: 正常触发事件.

       

        4.也可以使用keyCode去指定具体的按键 (不推荐)

        5.Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名

 

<body>
    <!-- 
       1.Vue中常用的按键别名:
            回车 => enter
            删除 => delete (捕获"删除"和"退格"键)
            退出 => esc
            空格 => space
            换行 => tab (特殊, 必须配合keydown去使用)
            上 => up
            下 => down
            左 => left
            右 => right

        2.Vue未提供别名的按键,可以使用案件原始的key值去绑定,但注意要转为kebab-case(短横线命名)

        3.系统修饰键 (用法特殊):ctrl、alt、shift、meta
            (1).配合keyup使用: 按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发.
            (2).配合keydowm使用: 正常触发事件.
        
        4.也可以使用keyCode去指定具体的按键 (不推荐)

        5.Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名
    -->

    <!-- 准备好一个容器 -->
    <div id="root">
       <h2>欢迎来到{{name}}学习</h2>
       <!-- 键盘事件常用的 keyup,keydown -->
       <input type="text" placeholder="按下回车提示输入" @keyup.enter="showInfo">
       <input type="text" placeholder="按下回车提示输入" @keyup.caps-lock="showInfo">
    </div>
    <script type="text/javascript">
        Vue.config.production = true; // 阻止 vue 在启动时生成生产提示。
        Vue.config.keyCodes.huiche = 13 // 定义了一个别名按键
        new Vue({
            el:"#root",
            data: {
                name:'尚硅谷'
            },
            methods: {
                showInfo(e){
                    // if (e.keyCoed !== 13) return // 相当于无值返回
                    // console.log(e.target.value);

                    // 2.
                    console.log(e.key,e.keyCode);
                }
            }
        })
    </script>
</body>
</html></html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值