Hello Vue~!

Vue特性介绍

渐进式框架

什么是渐进式框架

按需应用

  1. 声明式渲染: 核心库,只当作模版引擎使用,将数据渲染到视图中
  2. 组件系统:将界面划分n个小模块
  3. 客户端路由: 做移动端SPA单页应用
  4. 大规模状态管理: 组件过多,共享数据
  5. 构建工具 : 模块化,打包

Vue中的两个核心点

1. 响应的数据绑定

  • 当数据发生改变====>自动更新视图。(双向绑定)
  • 核心机制: 主要是利用Object.defineProperty()方法中的settergetter来代理数据,并且监控对数据的操作。

get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined

set
一个给属性提供 setter 的方法,如果没有 getter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined

2.组合的视图组件

  • UI 页面映射为组件树
  • 划分组件可维护、可重用、可调试


    视图组件

虚拟DOM

  • 运行js的速度很快,但是大量操作DOM的效率就相对很慢。时常在更新数据后会重新渲染页面,这样造成没有改变数据的地方也重新渲染DOM节点,这样就会造成了很大程度上的资源浪费和性能降低。
  • 利用在内存中生成与真实环境DOM与之相对应的数据结构,这个在内存中生成的结构称之为虚拟DOm
虚拟DOM渲染过程
  • 当数据发生变化时,能够以最小代价按规则计算出重新渲染组件并应用到DOM操作上。


    只修改有数据更改的地方

MVVM模式

  • M: Model 数据类型
  • V :View 视图模版
  • VM : view-Model 视图模型,也就是new Vue()
M层和V层是相对独立的,通过VM层做联系

声明式渲染


        var arr = [1, 2, 3, 4, 5];
        // 命令式渲染
        //**需要以具体代码表达在哪里做什么,以及如何实现
        var newArr1 = [];
        for (var i = 0; i < arr.length; i++) {
            newArr1.push(arr[i] * 2);
        }

        // 声明式渲染
        //**只需声明在哪里做什么,无需关心如何实现
        var newArr2 = arr.map(function(i) {
            return i * 2;
        })
        console.clear();
        console.log(newArr1);
        console.log(newArr2);

Vue实例

  1. Vue实例

每一个应用都是通过Vue这个构造函数创建根实例来启动new Vue(选项对象)

需要传入的选项对象包含挂在元素、模版、方法等。

选项对象 用途 类型
el 挂载元素选择器 String|HtmlElement
data 代理数据 Object|Function
methods 定义方法,放置事件处理函数 Object
  1. Vue代理data数据

每个Vue实例都会代理其data对象里所有的属性,这些被代理的属性是响应的。新添加的属性不具备相应功能,改变后不会更新视图。

  1. Vue实例自身属性及方法

暴露自身的属性和方法,以&开头,例如:&el,&data....

vue实例的自身属性和方法

指令

什么是指令?

  • 指令是一种特殊的自定义行间属性;
  • 指令的职责是当其表达式的值发生改变时,相应的将某些行为应用到DOM上;
  • 在Vue中,指令以v-开头

Vue的内置指令

指令 说明
v-bind 动态的绑定数据。简写为:
v-on 绑定事件监听器。简写为@
v-text 更新数据,会覆盖已有结构。
v-html 可解析数据中的html结构。
v-show 根据值来获取真假,切换元素的display属性。true为显示,false为隐藏。
v-if 根据值来获取真假,切换元素会被销毁和重建。true为重建,false为销毁。
v-else-if 多条件判断,条件为真则渲染。
v-else 条件都不符合时渲染。
v-for 基于源数据多次渲染元素或者模版块。
v-model 在表单控件元素上创建双向数据绑定。
v-pre 跳过元素及其子元素的编译过程。
v-cloak 隐藏未编译的Mustache语法,css中设置{v-cloack}{display:none}
v-once 仅渲染一次,随后数据更新也不会重新渲染。

模版

html模版

插值

 <div id="demo" :custom="abc">
        <!--简单的表达式-->
        {{ true? 123:456}} {{1+2+3+46+5}}
        <div v-html="html"> </div>
 </div>

  <script>
        let obj = {
            html: "<h1>这里是H1标签</h1>",//避免恶意攻击,此处必须是可信的html结构
            abc: 1
        }
        var vm = new Vue({
            el: '#demo',
            data: obj
        })
   </script>
渲染结果

字符串模版

template字符串

  • template选项对象的属性。
  • 模版会替换挂在的元素,挂载元素的内容都将被忽略。
  • 根节点只能有一个,允许嵌套,禁止并列。因为是映射的是一个对象嵌套对象的形式。
  • 将html结构写在一对script标签中,并设置type="x-template"属性。
  1. 使用字符串:
//错误写法=>根节点仅能有一个,不允许有兄弟节点
 var errorStr = `<div>hello ,Vue!{{abc}}</div><div>test text</div>`;
 <div id="demo" v-html="html" :data-id="abc"> </div>

    <script>
        let obj = {
            abc: 1
        }

        // 正确写法
        var str = `<div>hello ,Vue!{{abc}} <div>Test text</div>  </div>`;
        var vm = new Vue({
            el: '#demo',
            data: obj,
            template: str // template权限更高会冲掉静态Dom
        })
    </script>
渲染结果
  1. 使用x-template:

缺点:不能跨文件使用,同样只能允许有一个根节点,类似于<style>标签。

    <div id="demo">
        <span>测试文字</span>
    </div>

    <script type="x-template" id="temp">
        <div>
            hello,{{abc}}
            <span>{{message}}</span>
            <div v-html="html">
            </div>
        </div>
    </script>

    <script>
        let obj = {
            message: "我是个message",
            html: "<p>这里是一个段落</p>",
            abc: "test"
        }
        var vm = new Vue({
            el: "#demo",
            data: obj,
            template: "#temp"
        });
    </script>
渲染结果

render函数

render() 属于选项对象的属性,”最接近编译器的“方法。

数据对象属性

语法 定义
class:{} 绑定class,和v-bind:class的API通用
style:{} 绑定行间样式,和v-bind:style的API通用
attrs:{} 添加行间属性
domProps:{} DOM元素的属性
on:{} 绑定事件
nativeOn:{} 监听原生事件
directives:{} 自定义命令
scopedSlots:{} slot作用域
slot:{} 定义slot名称
key:"key" 给元素添加唯一标识
ref:"ref" 引用信息

render里的class

render里的class是使用v-bind来通过数据驱动添加或者移除的,它与原生的class能够共存。

<style>
   .bg { background: #9f0;}
   .fontSize {font-size: 50px;}
</style>
<div id="demo" class="fontSize" :class="{bg:addClass}">测试文字</div>
<script>
    let obj = {
      addClass: true
    }
    var vm = new Vue({
      el: "#demo",
      data: obj,
    });
</script>
渲染结果

render里的creatElement

语法: createElement(tagName,data,childElement)

参数说明:

参1 tagName :标签名

参2 data :数据对象{}

参3 childElement:子元素(文本或数组)

 <div id="demo"> </div>
    <script>
        var vm = new Vue({
            el: "#demo",
           
            render(creatElement) {
               // creatElement(标签名,{数据对象},子元素)
              
              
              //此处return的就是VNode对象(虚拟DOM)
                return creatElement(
                    "ul",
                    //自定义属性 
                    {
                        class: {
                            bg: true,
                                fontSize: true
                        },
                        // 添加行内样式
                        style: {
                            padding: "10px",
                            margin: "0",
                            listStyle: "none"
                        },
                        // 添加自定义属性
                        attrs: {
                            abc: "xyz"
                        },
                        // domProps的innerHTML权重比createElement高
                        domProps: {
                            innerHTML: "<li class='bg2'>我的权重更高</li>"
                        }
                    }, [
                        creatElement("li", 1),
                        creatElement("li", 2),
                        creatElement("li", 3)
                    ]
                )
            }
        });
    </script>
输出DOM结果以及控制台打印return creatElement
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容