zoukankan      html  css  js  c++  java
  • vue-day01&day02----vue渐进式MVVM框架、new操作符做了哪些事、指令、事件修饰符、浏览器按下回车后发生了什么、浏览器渲染页面的流程、虚拟DOM的特点、回流和重绘、computed、vue实例身上的方法、watch监听、生命周期、ref、组件

    # day01


    ### vue基础

        vue是一个渐进式的JavaScript框架,是一个MVVM框架。
        M:数据层
        V:视图层
        VM:映射层

        vue的特点:通过数据去操作视图

        底层原理:Object.defineProperty()(ES5,不支持IE8)   vue3.0是使用new Proxy()(ES6,不支持IE11)
            写在data中的数据会自动添加数据劫持,当修改时会触发watch监听,以此做数据监听。

        因为Vue是一个构造函数,所以使用vue的时候要通过new的方式进行使用,Vue这个构造函数的参数是一个配置项options。
            let vm=new Vue({    
                el:"#app",
                data:{
                    msg:"赏一碗蝙蝠汤"
                }
            });

        Question:new操作符做了哪些事? 
            1、开辟一块内存空间
            2、将this指向这块内存空间
            3、将构造函数上面的属性和方法添加到实例对象身上
        

    ### 指令

        v-text:
            作用:用来渲染数据和执行一些js语法

            底层是innerText

            简写:{{}}

            v-test在加载的时候,如果vue.js还未加载进来,页面不会出现{{}},而使用简写方式就会出现{{}}。

        v-html:
            作用:用来渲染数据和执行一些js语句

            可以用来解析html标签

            简写:{{{}}}    仅限于vue1.0,所以不用了

        v-if:
            通过创建和删除元素来控制元素的显示和隐藏

            值:true----显示,false----隐藏

            可以和v-else-if、v-else连用

        v-show:
            通过display来控制元素的显示和隐藏

        v-if和v-show的区别:
            1、v-if有更高的切换开销,而v-show有更高的初始渲染开销。因此,如果需要频繁地切换,则使用v-show,如果在运行时条件很少改变,则使用v-if
            2、使用场景:
                频繁切换的时候用v-show,例如选项卡
                登录与非登录页面,vip与非vip,权限页面用v-if
            3、v-for不能和v-if一起使用,v-for的优先级更高,v-for和v-show一起使用

        v-for:
            遍历数组、对象、字符串、数字

            语法:v-for="(item,index) in 需要遍历的数据" 

        v-bind:
            作用:用来给元素绑定属性
                href
                src
                title
                class
                style
                自定义属性

            语法:v-bind:属性="值"

            简写::属性="值"

        v-on:
            绑定事件

            简写:@事件名称="事件函数"

            关于事件对象:
                默认情况下如果事件函数不需要传递参数的时候可以不加(),然后在methods中的函数里通过参数e来获取到事件对象。

                默认参数是事件对象,不传参时,参数默认为e;
                如果有其他参数,事件对象e需要通过$event手动传递。

        v-pre:
            解析{{}}    让{{}}不再去解析数据

        v-cloak:
            防止vue.js没有加载进来的时候,页面显示{{}}

        v-once:
            只渲染一次数据

        v-model:
            双数据绑定

            流程:当输入框的数据发生改变时会修改data中相对应的数据,当data中数据发生改变,视图会跟着发生改变。

            使用场景:只能在表单元素中进行使用



    ### 事件修饰符

        作用:辅助一些事件,阻止事件冒泡,阻止浏览器默认事件等

        语法:@事件名称.修饰符.修饰符.修饰符...="事件函数"(一个事件后面可以跟多个修饰符)

        常见的修饰符:
            .stop:阻止事件冒泡
            .prevent:阻止浏览器默认行为
            .once:事件只触发一次
            .enter:回车键触发,也可以写 .13


    ### Question

        1、浏览器按下回车后发生了什么

            ①DNS解析,浏览器会先去本地的hosts文件中找有没有和地址栏域名对应的IP,如果有直接打开,如果没有就会发送DNS请求到DNS服务器。
            ②拿到对应的IP后,浏览器通过三次握手建立TCP/IP联系后,发送http请求,进行网络通信,浏览器从应用层到传输层(TCP)、到网络层(IP)、到链路层(网络)、客户端发送请求的阶段结束。
            ③服务器接收到客户端的http请求后,查找客户端请求的资源,然后再从链路层到网络层、到传输层、到应用层,将响应的报文返回,通过四次挥手断开TCP/Ip连接。
            ④浏览器收到html、css、js等文件后,解析html构建DOM树,构建render树、布局render树、绘制render树、然后解析css文件构建渲染树,这个过程完成后,浏览器开始布局渲染树并将其绘制到页面中。
            注意:在首次加载的时候会经历回流和重绘,速度较慢。js的加载可以看成是这个同步的主线程上的一个任务队列。有的网页页面很大,可以用预加载和懒加载提升用户体验。

        2、浏览器渲染页面的流程

            ①解析html,构建DOM
            ②解析css,构建CSSOM
            ③js脚本加载
            ④将DOM和CSSOM组合生成Render Tree(渲染树)
            ⑤遍历渲染树,将渲染树上每个节点进行页面的回流与重绘,生成页面
            注意:上述过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完才去构建和布局render树,它是解析一部分就显示一部分,同时,可能还在通过网络下载其余内容。

        3、虚拟DOM特点

            什么是虚拟DOM:它就是内存中的一个变量,是一个对象结构

            前端效率优化:最致命的问题就是DOM操作,尽量减少DOM操作

            vue的高效:
                ①虚拟DOM页面渲染高效
                ②js     获取数据,根据数据渲染界面DOM   vue将开发者的精力从DOM操作上转移到了数据操作上,数据变页面变

        4、回流和重绘

            回流:渲染树中的一部分或者全部元素因为尺寸、布局、隐藏等改变而需要重新构建。回流至少会发生一次,也就是第一次加载的时候。

            重绘:在回流时,浏览器会使渲染树中受影响的元素部分失效,并重新绘制这个部分的渲染树,完成回流后,浏览器重新绘制收到影响的元素到页面中。background-color

            区别:回流一定会发生重绘,重绘不一定会发生回流。

        5、diff算法

    # day02


    ### computed

        通过属性计算得来的属性

        注意:
            1、computed内部的函数可以随意编写
            2、computed内部的函数必须通过return的方式返回出去,最好不要在computed内部进行赋值操作
            3、虽然computed内部是以函数的方式进行编写,但是在调用的时候并不是一个函数,所以不需要加()
            4、只要函数内部所依赖的属性发生了改变,那么这个函数就会自己调用
            5、当函数内部所依赖的属性没有发生改变的时候computed会从缓存中读取结果

        总结:computed中的方法都是依赖vue中的属性,如果属性发生了改变那么computed中的对应的函数就会去执行。

        使用的场景:当多个属性影响一个属性的时候就需要用到computed----购物车

    ### vue实例身上的方法   

        $on():事件绑定
            参数:
                参数一:事件名称
                参数二:事件函数

        $emit():事件触发
            参数:
                参数一:事件名称
                参数二:需要传递的参数(选填)

        $off():事件解绑
            参数:
                参数一:事件名称
                参数二:需要解绑的事件函数(选填)

        $once():事件绑定,只触发一次
            参数:
                参数一:事件名称
                参数二:事件函数

        $mount():外部设置挂载点

        $forceUpdate():强制更新(耗费性能,一般不用)

        $nextTick():获取数据更新后最新的DOM结构

        $destroy():卸载    断开vue与实例之间的联系

        $set():
            作用:给一个响应式对象添加一个响应式属性或者给响应式对象设置属性
            语法:$set(object,key/index,value);

        $delete():
            作用:删除响应式对象的某一个值
            语法:$delete(object,key/index);

    ### watch监听

        作用:监听data中属性的变化
        当data中的属性发生了变化,那么watch中相对应的函数就会执行

        注意:
            1、watch中的函数名称必须是所依赖data中的属性名称
            2、watch中的函数是不需要调用的,只要函数所依赖的属性发生了变化,那么相对应的函数就会执行
            3、watch中的函数有两个参数:newVlaue,oldValue
            4、watch默认情况下无法监听对象的改变,如果需要进行监听则需要进行深度监听,因为它只会监听对象的地址是否发生了改变,不会监听值的改变。
                深度监听的两种方法:
                    ①"obj.name"(newVlaue,oldValue){

                    }
                    ②obj:{
                        handler(newValue){

                        },
                        deep:true
                    }
            5、watch默认情况下第一次的时候不会去做监听,如果需要第一次加载的时候就监听需要设置immediate:true
            6、watch在特殊情况下是无法监听到数组的变化:
                ①通过下标来更改数组中的数据
                ②通过length来改变数组的长度
            对应的解决办法:
                ①通过vue实例方法$set()进行设置
                ②通过splice来进行数组清空

    ### 生命周期

        什么是生命周期:
            也叫生命周期钩子函数
            在相对应的阶段做相对应的事情

        vue有自己的生命周期:
            beforeCreate()
                当前生命周期是vue初始化的时候执行的钩子函数,在这个函数里面data和methods都还没有将自身的属性和方法代理到vue的实例身上,因此在当前生命周期中是访问不到data中的属性和methods中的方法的。

                当前生命周期函数的执行的时候组件还未进行创建,因此我们可以在当前组件中进行loading的显示

            *created()
                1、因为当前生命周期函数是组件创建后执行的,所以我们可以在当前生命周期中进行数据的请求(ajax)
                2、当前生命周期在执行的时候会将data身上所有的属性进行数据劫持,给每个属性添加setter和getter方法
                3、当前生命周期在执行的时候会将data身上所有的属性和methods身上所有的方法添加到vue的实例身上

            beforeMount()
                当前生命周期是组件挂载到页面之前执行的钩子函数,我们可以在当前生命周期函数中对数据进行最后的更改
                当前生命周期数据和模板还未结合,因此访问不到真实的DOM结构

            *mounted()
                当前生命周期是组件挂载到页面之前会执行的钩子函数,我们可以在当前生命周期函数中访问到真是的DOM结构
                当前生命周期函数中数据和模板已经进行了结合,可以通过this.$refs来访问到真是的DOM结构
                场景:在当前生命周期函数中进行方法的初始化(Swiper better-scroll echarts)

            beforeUpdate()
                当前生命周期函数中我们可以访问到真实的DOM结构
                当前生命周期函数中我们可以对更新的数据做最后的更改
                当前生命周期函数中更新的数据还未和模板进行结合
                同时也可以进行更新数据的检测

            uodated()
                当前生命周期函数中数据和模板进行进行结合,我们可以在当前生命周期函数中获取到数据更新后最新的DOM结构
                如果我们在当前生命周期函数中进行实例化操作,一定要进行边界判断,否则会造成无用的性能消耗,不建议在这里实例化。

                边界判断:
                    if(!this.swiper){
                        this.swiper=new Swiper();
                    }

            *beforeDestroy()
                当前生命周期函数会在组件被销毁的时候去执行,我们可以在当前生命周期函数中进行事件的解绑,定时器的清除
                我们在当前生命周期中仍可以获取到真实的DOM结构

            destroyed()
                在当前生命周期函数中我们访问不到真实的DOM结构,以及当前生命周期会断开与vue的关联


    ### ref

        语法:
            1、给需要获取真实的DOM结构的元素添加ref属性,例如 <p ref="p"></p>   这个名字必须是唯一的
            2、通过this.$refs.p可以获取到真实的DOM结构

    ### 组件

        1、什么是组件:
            页面上任何一个部分都是一个组件,多个组件组成一个模块

        2、组件的特点:
            复用性强,便于维护

        3、组件的组成部分:
            html    css     js
        
        4、如何创建一个组件:
            全局组件:
                语法:
                    Vue.component("组件名称",组件配置项)

            局部组件:
                new Vue({
                    components:{
                        组件名称:组件配置项
                    }
                })

            注意:
                1、全局组件必须要在实例化之前
                2、组件的配置项和vue的配置项一模一样,唯一的不同点是vue的data是一个对象,组件的data是一个函数return一个对象



  • 相关阅读:
    交互题
    线段树
    最小生成树
    拓扑排序
    欧拉回路
    RMQ问题
    dfs序与求子树子节点(染了色)的个数
    dp题
    树状数组与离散化
    没做完的题
  • 原文地址:https://www.cnblogs.com/wuqilang/p/12359465.html
Copyright © 2011-2022 走看看