• Vue的相关


    Vue

    Vue是一个前端js框架,由尤雨溪开发,是个人项目

    Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vue1.0悄悄的问世了,它的优雅,轻便也吸引了一部分用户,开始收到关注,16年中旬,VUE2.0问世,这个时候vue不管从性能上,还是从成本上都隐隐超过了react,火的一塌糊涂,这个时候,angular开发团队也开发了angular2.0版本,并且更名为angular,吸收了react、vue的优点,加上angular本身的特点,也吸引到很多用户,目前已经迭代到5.0了。

    学习vue是现在前端开发者必须的一个技能。

    前端js框架到底在干嘛,为什么要用

    js框架帮助开发者写js逻辑代码,在开发应用的时候js的功能划分为如下几点:

    1. 渲染数据

    2. 操作dom(写一些效果)

    3. 操作cookie等存储机制api

    在前端开发中,如何高效的操作dom、渲染数据是一个前端工程师需要考虑的问题,而且当数据量大,流向较乱的时候,如何正确使用数据,操作数据也是一个问题

    而js框架对上述的几个问题都有自己趋于完美的解决方案,开发成本降低。高性能高效率。唯一的缺点就是需要使用一定的成本来学习。

    Vue官网介绍

    vue是渐进式JavaScript框架

    “渐进式框架”和“自底向上增量开发的设计”是Vue开发的两个概念

    Vue可以在任意其他类型的项目中使用,使用成本较低,更灵活,主张较弱,在Vue的项目中也可以轻松融汇其他的技术来开发,并且因为Vue的生态系统特别庞大,可以找到基本所有类型的工具在vue项目中使用

    特点:易用(使用成本低),灵活(生态系统完善,适用于任何规模的项目),高效(体积小,优化好,性能好)

    Vue是一个MVVM的js框架,但是,Vue 的核心库只关注视图层,开发者关注的只是m-v的映射关系

    与AngularJS的对比

    Vue的很多api、特性都与angularJS相似,其实是因为Vue在开发的时候借鉴了很多AngularJS中的特点,而AngularJS中固有的缺点,在Vue中已经解决,也就是青出于蓝而胜于蓝,Vue的学习成本比AngularJS低很多,因为复杂性就低

    AngularJS是强主张的,而Vue更灵活

    Vue的数据流是单向的,数据流行更清晰

    Angular里指令可以是操作dom的,也可以封装一段结构逻辑代码,例如:广告展示模块

    Vue中的指令只是操作dom的,用组件来分离结构逻辑

    AngularJS的性能比不上Vue

    Vue的使用

    Vue不支持IE8,因为使用了ES5的很多特性

    可以直接通过script标签来引入vue.js,有开发版本和生产版本,开发版本一般我们在开发项目的时候引入,当最后开发完成上线的时候引入生产版本,开发版本没有压缩的,并且有很多提示,而生产版本全部删掉了

    在Vue中提供了一个脚手架(命令行工具)可以帮我们快速的搭建基于webpack的开发环境...

    Vue的实例

    每一个应用都有一个根实例,在根实例里我们通过组件嵌套来实现大型的应用

    也就是说组件不一定是必须的,但是实例是必须要有的

    在实例化实例的时候我们可以传入一个;配置项,在配置项中设置很多属性方法可以实现复杂的功能

    在配置中可以设置el的属性,el属性代表的是此实例的作用范围

    在配置中同过设置data属性来为实例绑定数据

    mvc/mvvm

    阮大神博客

    mvc 分为三层,其实M层是数据模型层,它是真正的后端数据在前端js中的一个映射模型,他们的关系是:数据模型层和视图层有映射关系,model改变,view展示也会更改,当view产生用户操作或会反馈给controller,controller更改model,这个时候view又会进行新的数据渲染

    MVC

    这是纯纯的MVC的模式,但是很多框架都会有一些更改

    前端mvc框架,如angularjs,backbone:

    前端MVC

    会发现,用户可以直接操作controller(例如用户更改hash值,conrtoller直接监听hash值变化后执行逻辑代码,然后通知model更改)

    控制器可以直接操作view,如果,让某一个标签获得进入页面获得焦点,不需要model来控制,所以一般会直接操作(angularJS,指令)

    view可以直接操作model (数据双向绑定)

    MVP:

    mvp

    view和model不能直接通信,所有的交互都由presenter来做,其他部分的通信都是双向的

    view较薄 ,presenter较为厚重

    MVVM:

    mvvm

    MVVM和MVP及其相似,只是view和viewmodel的通信是双向绑定,view的操作会自动的像viewmodel通过

    v-for

    在vue中可以通过v-for来循环数据的通知循环dom,语法是item in/of items,接收第二个参数是索引 (item,index) of items,还可以循环键值对,第一个参数是value,第二个是key,第三个依然是索引

    v-on

    在vue中还有v-on来为dom绑定事件,在v-on:后面加上要绑定的事件类型,值里可以执行一些简单javascript表达式:++ -- = ...

    可以将一些方法设置在methods里,这样就可以在v-on:click的值里直接写方法名字可以,默认会在方法中传入事件对象,当写方法的时候加了()就可以传参,这个时候如果需要事件对象,那就主动传入$event

    v-on绑定的事件可以是任意事件,v-on:可以缩写为@

    为什么在 HTML 中监听事件?

    你可能注意到这种事件监听的方式违背了关注点分离 (separation of concern) 这个长期以来的优良传统。但不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑定在当前视图的 ViewModel 上,它不会导致任何维护上的困难。实际上,使用 v-on 有几个好处:

    1. 扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法。
    2. 因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM 完全解耦,更易于测试。
    3. 当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何自己清理它们。
    响应式原理

    因为vue是mvvm的框架,所以当数据变化的时候,视图会立即更新,视图层产生操作后会自动通知vm来更改model,所以我们可以实现双向数据绑定,而其中的原理就是实例会将设置的data逐个遍历利用Object.defineProperty给数据生成getter和setter,当数据变化地方时候setter会监听到并且通知对应的watcher工具进行逻辑运算会更新视图

    声明式渲染

    在vue中,我们可以先在vue实例中声明数据,然后通过{{}}等方式渲染在dom中


    function foo(){// 第16行
        getName = function(){console.log(1)}
        return this
    }
    foo.getName = function(){console.log(2)}
    foo.prototype.getName = function(){console.log(3)}
    var getName = function(){console.log(4)}
    function getName(){console.log(5)}
    
    
    foo.getName()//2
    //foo是一个函数,也可以说是一个对象,所以它也可以挂载一些属性和方法,18行在其上挂载了一个getName方法
    //执行的结果是
    
    getName()//4
    //21行有一个全局函数,全局函数声明提前后被20行的getName覆盖,所以输出4
    
    foo().getName()//1
    //foo()执行完成后,将全局的getName也就是window.getName给更改后返回this,而在这里this执行的就是window,所以最后执行的就是window.getName,所以输出1
    
    getName()//1
    //在上面已经更改全局的getName,所以依然是1
    
    new foo.getName()//2
    //new 操作符在实例化构造器的时候,会执行构造器函数,也就是说,foo.getName会执行,输出2
    
    new foo().getName()//3
    //new操作符的优先级较高,所以会先new foo()得到一个实例,然后再执行实例的getName方法,这个时候,实例的构造器里没有getName方法,就会执行构造器原型上的getName方法
    
    new new foo().getName()//3
    //先执行new foo()得到一个实例,然后在new 这个实例的getName方法,这个时候会执行这个方法,所以输出3
    
    //除了本地对象的方法,其他的函数都能new

    响应式原理(mvvm)

    //ES5中有Object.defineProperty()可以,为某一个对象的属性创建出setter和getter,setter和getter其实是两个工具函数,分别会在数据被更改或者被使用的时候触发
    
        // 准备给data设置一个msg属性,这个属性改变的时候,页面中的显示也会改变
    
        // var data = {msg:'hello world'}
        // a.innerHTML = data.msg
    
        // inp.oninput = function () {
        //     data.msg = this.value
        //     a.innerHTML = data.msg
        // }
    
    
        //M
        var data = {msg:'hello world'}
    
        //VM
        new Bue({
            data:data
        })
        
        
        //vm将model的数据显示在view上,当用户参数操作,会自动通知viewmodel(事件的处理程序本身就是写在viewmodel中的),这个时候viewmodel就去更改model,数据更改之后,数据的setter会触发,viewmodel会通知view进行更新
        
        function  Bue(options) {
            var data = options.data//真正的数据
            var _data = {}//专门搞出来的数据
    
            //为搞出来的数据设置getter和setter
            let that = this
            this.watcher = function (newval) {
                document.getElementById("a").innerHTML = newval
            }
            
            Object.defineProperty(_data,'msg',{
                get:function(){//会设置数据的值,会在使用的时候触发,返回的值是多少,数据就是多少
                    console.log('getter')
                    return data.msg
                },
                set:function(newval){//数据被更改的时候会触发set,这个时候再通知viewmodel去控制view层改变
                   that.watcher(newval)
                }
            })
    
            document.getElementById("a").innerHTML = _data.msg
    
            inp.oninput = function () {
                _data.msg = this.value//更改数据
            }
    
            
    
        }

    vue响应式原理:

    //将数据挂载在vue的实例上的时候,Vue会对这些数据进行遍历处理,创建watcher,通过监听setter和getter来通知watcher,watcher进行计算后更新view
    
    
        //数据更改,view更改,view更改,数据更改,这个mvvm里的一个特性(响应式数据绑定),体现它的效果是数据双向绑定
    
        //这个特性在vue是通过对数据进行Object.defineProperty处理来实现的,实现的原理vue起了个名字叫响应式原理
  • 相关阅读:
    JVM内存分配及GC流程
    打印手机当前界面(位于栈顶)的activity
    AIDL通信过程中设置死亡代理
    最短路径&次短路径算法
    DEX、ODEX、OAT文件&Dalvik和ART虚拟机
    主线程中有多个handler的情况
    GB GBRT XgBoost
    logistic回归为什么要使用sigmoid函数
    十道海量数据处理面试题与十个方法大总结
    常见数据结构和算法题
  • 原文地址:https://www.cnblogs.com/Ari1c/p/8056889.html
Copyright © 2020-2023  润新知