Vue学习(笔记上)

第一章:
1.1 Hello World案例

 <!-- 1、让Vue工作,必须创建一个Vue实例,且传入一个配置对象 -->
    <!-- 2、root容器里的代码被成为Vue模板 -->
    <div id="root">
        <h1>hello,{{name}}</h1>
    </div>
    <script>
        Vue.config.productionTip = false;
        // 创建Vue实例
        new Vue({
            el: '#root', //el用于指定当前Vue实例为哪个容器服务
            data: { //data中用于存储数据,供el所指定的容器去使用,值暂时写成一个对象
                name: '尚硅谷'
            }
        })
    </script>   
     <!-- 3、Vue实例与容器是一一对应的,没有别的对应关系 -->

1.2 模板语法

 <!-- Vue模板语法由两大类 -->
        <!-- 1、插值语法:{{}} -->
        <!-- 功能:解析标签体内容 -->
        <!-- 2、指令语法:v-xxx -->
        <!-- 功能:用于解析标签(标签属性、标签体内容、绑定事件..) -->

1.3 数据绑定

<!-- Vue中由2钟数据绑定的方式 -->
            <!-- 1、单向绑定(v-bind):数据只能从data流向页面 -->
            <!-- 2、双向绑定(v-model):一般应用在表单元素上 -->
            <!-- v-model:value可以简写为v:model,因为v-model默认收集的就是value值 -->
        单向数据绑定:<input type="text" :value="name"> <br/> 

1.4 el与data的两种写法

// el的两种写法
            // 1、el:#root
            // 2、v.$mount('#root')
        // data的两种写法
            // 1、对象式:
            // data: {
            //     name: '尚硅谷',
            //     url: 'http://www.atguigu.com'
            // }
            // 2、函数式:冒号与function可省略
            // data:function(){
            //     return{
            //         name:'尚硅谷'
            //     }
            // }

1.5 理解MVVM模型

// 1、M:模型:data中的数据
        // 2、V:视图:模板代码
        // 3、VM:视图模型:Vue实例

1.6 数据代理

  • 数据代理重要基础方法
let number = 18
            // 1、回顾Object.defineproperty方法
        let person = {
            name: '张三',
            sex: '男'
        }
        Object.defineProperty(person, 'age', {
            value: 18,
            enumerable: true, //控制属性是否可以枚举(被遍历),默认值是false
            writable: true, //控制属性是否可以修改,默认值为false
            configurable: true, //控制属性是否可以被删除,默认值是false

            // 当有人读取person的age属性时,get就会被调用,返回值为age的值
            get: function() {
                return numver
            },

            // 对应get的获取
            set(value) {
                numver = value
            }
        })
  • 数据代理
// 数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)
        let obj = {
            x: 100
        }
        let obj2 = {
            y: 200
        }

        Object.defineProperty(obj2, 'x', {
            get() {
                return obj.x
            },
            set(value) {
                obj.x = value
            }
        })
  • 数据代理案例
// 1、Vue中的数据代理:
        //     通过vm对象来代理data对象中属性的操作(读\写)
        // 2、Vue中数据代理的好处
        //     更加方便的操作data中的数据
        // 3、基本原理
        //     通过object.definProperty()把data对象中所有属性加到vm上,
        //     为每一个添加的属性,都指定一个getter/serrer,通过getter/setter
        //     操作data中的属性

1.7 事件处理

// 事件的基本使用
            // 1、使用v-on:xxx或@xxx绑定事件,xxx是事件名
            // 2、事件回调函数配置到methods对象中
            // 3、@click="demo"和@cliccl="demo{$event}"效果一致,但后者可以传参
  • 事件修饰符
<!-- prevent阻止默认事件(常用) -->
        <a href="http://www.baidu.com" @click.prevent="showInfo1">点我提示信息</a>

        <!-- stop阻止冒泡事件(常用) -->
        <a href="http://www.baidu.com" @click.stop="showInfo1">点我提示信息</a>

        <!-- once事件只触发一次 -->
        <a href="http://www.baidu.com" @click.once="showInfo1">点我提示信息</a>

        <!-- capture使用事件的捕获关系(从捕获阶段就执行,一般是从冒泡阶段才执行) -->
        <!-- self只有event.target是当前操作的元素才触发事件 -->
        <!-- passive事件的默认行为立即执行,无需等待事件回调执行完毕 -->
  • 键盘事件
// Vue中常用的按键别名
            // 回车->enter
            // 删除->delet(删除与退格键)
            // 退出->esc
            // 空格->space
            // 换行->tab(必须配合keydown使用)
            // 上->up
            // 下->down
            // 左->left
            // 右->right
        // Vue未提供别名的按键,用原案件的key值绑定,
        // 但注意要转为caps-lock

1.8 计算属性

// 计算属性:
                // 定义:要用的属性不存在,通过已有属性计算得来
                // set函数什么时候执行?
                    // 初次读取时会执行一次
                    // 依赖的数据发生变化时会被再次调用
                // 优势:与method相比,内部有缓存机制,效率更高
                // 备注:计算属性最终出现在vm上,直接读取即可

1.9 监视属性

 // 监视的两种写法
                // 1、new Vue时传入watch配置
            watch: {
                isHot: {
                    // 默认为false,改为true后再初始化的时候让handler调用一次
                    immediate:true,
                    // isHot发生改变的时候,hander函数调用一次
                    handler(newValue, oldValue) {
                        
                    }
                }
            }
                // 2、通过vm.$watch监视
                vm.$watch('isHot',{
                    // 内容与第一种写的一毛一样
                })
  • 深度监视
 // 深度监视
                // 1、Vue中的watch默认不监测对象内部值得改变(一层)
                // 2、配置deep:true可以检测对象内部值得改变(多层)
            // 备注
                // 1、Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以
  • 监视的简写
简写的前提是不能使用其他两个方法
 isHot(newValue, oldValue) {
                    // 需要执行的内容
                }
                
vm.$watch('isHot', function(newValue, oldValue) {
            // 需要执行的内容
        })
  • watch与computed的区别
// computed和watch之间的区别:
    // 1. computed能完成的功能,watch都可以完成。
    // 2. watch能完成的功能, computed不一定能完成, 例如: watch可以进行异步操作。
    // 两个重要的小原则:
    // 1. 所被Vue管理的函数, 最好写成普通函数, 这样this的指向才是vm 或 组件实例对象。
    // 2. 所有不被Vue所管理的函数( 定时器的回调函数、 ajax的回调函数等、 Promise的回调函数)
    // 最好写成成箭头函数,这样this的指向才是vm 或 组件实例对象。

1.10 绑定样式

    <!-- 
			绑定样式:
					1. class样式
								写法:class="xxx" xxx可以是字符串、对象、数组。
                                        1、是happy还是sad还是normal
										字符串写法适用于:类名不确定,要动态获取。
                                        2、可能绑定一个类名,也可能绑定98个类型
										对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。
                                        3、atguigu1与atguigu2的不确定取舍
										数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。
					2. style样式
								:style="{fontSize: xxx}"其中xxx是动态值。
								:style="[a,b]"其中a、b是样式对象。
		-->

1.11 条件渲染

    <!-- 
				条件渲染:
							1.v-if
										写法:
												(1).v-if="表达式" 
												(2).v-else-if="表达式"
												(3).v-else="表达式"
										适用于:切换频率较低的场景。
										特点:不展示的DOM元素直接被移除。
										注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。

							2.v-show
										写法:v-show="表达式"
										适用于:切换频率较高的场景。
										特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
								
							3.备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。
		 -->

1.12 列表渲染

		<!-- 
				v-for指令:
						1.用于展示列表数据
						数组中为(对象,索引号),对象中为(关键字,值)
						2.语法:v-for="(item, index) in xxx" :key="yyy"
						3.可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)
		-->
  • key的原理与作用
 - 虚拟DOM中key的作用:
										key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】, 
										随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:
										
						2.对比规则:
									(1).旧虚拟DOM中找到了与新虚拟DOM相同的key:
												①.若虚拟DOM中内容没变, 直接使用之前的真实DOM!
												②.若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM。

									(2).旧虚拟DOM中未找到与新虚拟DOM相同的key
												创建新的真实DOM,随后渲染到到页面。
												
						3. 用index作为key可能会引发的问题:
											1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
															会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。

											2. 如果结构中还包含输入类的DOM:
															会产生错误DOM更新 ==> 界面有问题。

						4. 开发中如何选择key?:
											1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
											2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,
												使用index作为key是没有问题的。
  • Vue监视数据总结
<!-- Vue监视数据的原理:
1. vue会监视data中所有层次的数据。

2. 如何监测对象中的数据?
                通过setter实现监视,且要在new Vue时就传入要监测的数据。
                    (1).对象中后追加的属性,Vue默认不做响应式处理
                    (2).如需给后添加的属性做响应式,请使用如下API:
                                    Vue.set(target,propertyName/index,value) 或 
                                    vm.$set(target,propertyName/index,value)

3. 如何监测数组中的数据?
                    通过包裹数组更新元素的方法实现,本质就是做了两件事:
                        (1).调用原生对应的方法对数组进行更新。
                        (2).重新解析模板,进而更新页面。

4.在Vue修改数组中的某个元素一定要用如下方法:
            1.使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()
            2.Vue.set() 或 vm.$set()

特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!! -->

1.13 收集表单输入

<!-- 
			收集表单数据:
					若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。
					若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值。
					若:<input type="checkbox"/>
							1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
							2.配置input的value属性:
									(1)v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
									(2)v-model的初始值是数组,那么收集的的就是value组成的数组
					备注:v-model的三个修饰符:
									lazy:失去焦点再收集数据
									number:输入字符串转为有效的数字
									trim:输入首尾空格过滤
		-->
		<!-- 准备好一个容器-->

1.14 Vue内置指令整理

<!-- 1、v-text指令:完全替换节点中的内容 -->
    <div v-text="name"></div>

    <!-- 2、v-html:就像Js中的innerHTML -->
    <!-- 带有很大的安全性问题,一定要在可信的内容上使用 -->

    <!-- 3、v-clock(没有值),vue实例创建完毕后删除,配合 -->
    <!-- css解决网速慢时展示出{{xxx}}的问题 -->

    <!-- 4、v-once(没有值),初次动态渲染后,就视为静态内容了, -->
    <!-- 以后的数据的改变不再引起改变 -->

    <!-- 5、v-pre(没有值),加上后Vue不去解析了。可利用其跳过没有使用插值语法 -->
    <!-- 的结点,可用于性能优化 -->

1.15 自定义指令

   <!-- 自定义指令总结:
            一、定义语法:
                        (1).局部指令:
                                        directives:{指令名:配置对象}   或   directives{指令名:回调函数}
                        (2).全局指令:
                                        Vue.directive(指令名,配置对象) 或   Vue.directive(指令名,回调函数)

            二、配置对象中常用的3个回调:
                        (1).bind:指令与元素成功绑定时调用。
                        (2).inserted:指令所在元素被插入页面时调用。
                        (3).update:指令所在模板结构被重新解析时调用。

            三、备注:
                        1.指令定义时不加v-,但使用时要加v-;
                        2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。

1.16 生命周期

<!-- 
				生命周期:
						1.又名:生命周期回调函数、生命周期函数、生命周期钩子。
						2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
						3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
						4.生命周期函数中的this指向是vm 或 组件实例对象。
		-->
<!-- 
				常用的生命周期钩子:
						1.mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
						2.beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

				关于销毁Vue实例
						1.销毁后借助Vue开发者工具看不到任何信息。
						2.销毁后自定义事件会失效,但原生DOM事件依然有效。
						3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。
		-->

第二章 Vue组件化编程

  • 基本使用
<!-- 
			Vue中使用组件的三大步骤:
					一、定义组件(创建组件)
					二、注册组件
					三、使用组件(写组件标签)

			一、如何定义一个组件?
						使用Vue.extend(options)创建
						区别如下:
								1.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。
						备注:使用template可以配置组件结构。
			二、如何注册组件?
							1.局部注册:靠new Vue的时候传入components选项
							2.全局注册:靠Vue.component('组件名',组件)

			三、编写组件标签:
							<school></school>
		-->
  • VueComponent构造函数
<!-- 
			关于VueComponent:
						1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

						2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
							即Vue帮我们执行的:new VueComponent(options)。

						3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

						4.关于this指向:
								(1).组件配置中:
											data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
								(2).new Vue(options)配置中:
											data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

						5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
							Vue的实例对象,以后简称vm。
		-->

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值