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一个对象



  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/wuqilang/p/12359465.html
Copyright © 2011-2022 走看看