VUE-1:基础、指令、数据

vue.js

        `vue.js` 是一套用于构建用户界面的渐进式框架


渐进式


Vue 核心

        - 声明式渲染

        - 组件


引入

        我们还是先通过 \<script\> 的方式来引入 <u>vue</u>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

组件

        `vue` 的核心功能之一就是组件


组件基本分类

        - 根组件

        - 可复用的功能组件


根组件的创建

        通过 `vue` 提供的构造函数可以实例化出来一个跟组件实例对象

let app = new Vue

可复用的功能组件

        通过 `Vue` 提供的静态方法 `component` 窗口可复用的功能组件

let component1 = Vue.component

        组件配置选项:https://cn.vuejs.org/v2/api/


组件内容渲染

        渲染一个组件的内容可以通过两种方式来进行

                - template 选项(模板)

                - render 选项(函数)


template(模板)

        type : string

                组件的模板结构(HTML),模板内容会被 `vue` 进行渲染,生成最终的 `HTML` 内容,并替换占位(挂载)元素


el

        type : string | Element

                提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。可以是 CSS 选择器,也可以是一个 HTMLElement 实例,

                        - 该选择只对 `new` 创建的实例有效

                        - 如果提供 `el` ,但是没有提供 `template` ,则 `el` 的内容讲作为 `template`


render函数

        type : (createElement: () => VNode) => VNode

                发挥 `JavaScript` 最大的编程能力,直接创建 `VNode` (虚拟dom对象),优先级高于 `el` 和 `template`

                        - 有更强大的编程能力

                        - 有更高的性能

                                    https://cn.vuejs.org/v2/guide/render-function.html

HTML模板解析成虚拟DOM再解析成DOM元素

使用 $mount 方法延迟 `Vue` 实例的挂载

        当 `Vue` 实例没有 `el` 选项的时候,它会处于一种 未挂载 的状态,我们可以通过组件 `Vue` 实例对象的 `$mount` 方法来手动挂载,

        通过该方式,我们也可以达到延迟 `Vue` 实例的挂载的目的


组件中的数据(状态)

data

        组件内部使用的数据,`data` 是一个对象,`data` 中的值可以中模板中直接访问

                - `Vue` 实例组件(根组件)的 `data` 是一个对象

                - 可复用功能组件的 `data` 必须是一个函数,且该函数必须返回一个对象(因为复用性,避免多个组件实例引用同一个对象。

                  换句话说,组件中使用的数据必须是一个对象,但是可复用组件的这个数据对象必须通过函数返回


data 的访问

        `data` 数据可以直接通过组件实例对象访问,也可以通过实例对象下的 `$data` 属性进行访问

                组件实例对象下有很多的以 `$` 开头的属性,这些都是实例对象内置的一些属性和方法,`vue` 为了区分数据与内置属性方法,

                内置的属性和方法默认都是以 `$` 开始的,所以我们中数据中应该避免使用 `$` 开头的数据


模板语法

        vue 使用了基于 html 的模板语法,使用声明式的方式把实例中的数据(`data`)与 DOM 进行绑定,`data` 中的数据在模板中可以

        直接使用


Mustache(双大括号,大胡子) 语法

        在 vue 中,我们是通过一对双大括号把实例中的数据渲染到模板内容中

插值表达式

        在 {{    }} 中,我们可以放置表达式值


数据到视图的更新

        vue 会把  `data` 中的数据挂载到实例属性下,同时对它们进行主动的监听拦截,当数据发生变化的时候,重新渲染模板。我们可以

        通过实例对象对数据进行修改


检测变化的注意事项

        在 vue3 之前,数据的监听是通过 `Object.defineProperty` 方法来实现的,但是该方法只能监听拦截单个数据,对于对象新增属性无法

        监听拦截。所以,对于数据对象中新增的属性,我们需要调用 vue 提供的方法来进行处理

扩展

        通过 `Object.defineProperty` 监听拦截中存在一些问题

                - 属性新增属性

                - 数组方法:push、pop、shift、unshift、splice、sort、reverse

                - 数组新增值:[    ]

                - 数组 length 属性

        以上的操作中并不会触发监听拦截

                `vue` 对数组中的 `push`、`pop` 等方法进行重新包装,所以在 `vue` 中调用这些方法,可以对数组的修改进行监听拦截

                [https://cn.vuejs.org/v2/guide/list.html#%E5%8F%98%E5%BC%82%E6%96%B9%E6%B3%95-mutation-method]

                (https://cn.vuejs.org/v2/guide/list.html#变异方法-mutation-method)


使用 Vue.set 方法添加新数据

        在模板中,我们使用了一个不存在的数据 `user.gender`

        如果我们通过 `app.user.gender = '男' `的方式来新增,是不会被 vue 拦截监听处理的,我们需要使用

        这样的方式,`set` 方法给 `app.user`  添加 `gender` 属性的同时,对它进行了 `defineProperty`


指令

        表达式的值除了可以出现内容中,也可以使用在其它位置,比如:属性。但是不能使用 `{{    }}` 语法,而是需要 `指令`

        在 `vue` 中,指令是一个带有 `v-` 前缀的属性,与普通属性不一样的地方在于,指令的值是引号括起来的 `表达式`,不同的指令有不同

        的作用,`vue` 内置了一些常用的指令,后期我们还可以自定义属于自己的指令

                - 内容输出

                - 循环

                - 逻辑

                - 属性绑定

                - 事件

                - 其它


内容输出

        通过 `{{    }}` 我们可以很方便的中模板中输出数据,但是这种方式会有一个问题,当页面加载渲染比较慢的时候,页面中会

        出现 `{{    }}` ,`vue` 提供了几个指令来解决这个问题


指令中的表达式不需要使用 `{{    }}`

v-text(推荐下面的方法)

        弊端:`v-text` 会填充整个 `innerHTML`,会把整个title填充掉,p再写数据也没用


v-cloak(这种写法用的比较多,结合{{    }}和v-text的优点)

这样写可以避免html加载完前出现{{    }}

        需要配合 css 进行处理


v-html

        为了防止 `xss` 攻击,默认情况下输出是不会作为 `html` 解析的,通过 `v-html` 可以让内容作为 `html` 进行解析


v-once

        只渲染元素和组件一次,后期的更新不再渲染


v-pre

        忽略这个元素和它子元素内容的编译


逻辑处理

v-show

        根据表达式的值(布尔值),切换元素的显示与隐藏(display 属性)

                适用于状态切换比较频繁的情况


v-if

        根据表达式的值(布尔值),创建或销毁元素

                适用于状态切换不频繁的情况


v-else / v-else-if

        与 `v-else` 配合


循环与列表

v-for

        根据数据循环渲染 `v-for` 指令所在的元素及其子元素

                可以循环的数据:Array | Object | number | string | Iterable (2.6 新增)

        v-for 中也可以使用 of 语法,在 vue 中两者没有什么区别


:key

        默认情况下,在渲染 `DOM` 过程中使用 原地复用 ,这样一般情况下会比较高效,但是对于循环列表,特别是依赖某种状态的列表,

        会有一些问题,我们可以通过 `:key` 属性,来给每个循环节点添加一个标识


属性绑定

v-bind

        绑定数据(表达式)到指定的属性上,`<div v-bind:参数="值/表达式"></div>`,这里的参数就是指定的属性名称


缩写

        有的一些常用指令会有对应的缩写,`v-bind` 对应的缩写为 `:`


样式

        针对样式属性,`v-bind` 值有一些特殊的写法

style

原生普通写法

v-bind 写法

对象写法

数组写法


class

原生普通写法

v-bind 写法

数组写法

对象写法

        使用对象写法,可以根据值(boolean)动态添加对应的 class


单向数据流

        通过上面的知识点和案例,我们可以看到,当数据更新的时候,页面视图就会更新,但是页面视图中绑定的元素更新的时候,

        对应的数据是不会更新的

        我们称为:单向数据流 数据 -> 视图

                在 vue 中,还有一种双向数据流绑定的方式


v-model

        数据 `title` 更新,视图中 `input` 的 `value` 就会更新。同时,当 input 中的 `value` 更新的时候,数据 `title` 也会更新,这就是我们说的

        数据双向绑定 [与 React 中的受控组件类似]


表单

        针对一般元素,比如 div、span、p、img 等,采用的是单向绑定:v-bind,只需要把数据绑定到视图中就可以,但是对于表单这种交互

        性比较强的元素或组件,我们一般可能需求双向绑定,即:用户对视图元素的操作同时更新数据

                v-model 在内部为不同的输入元素使用不同的属性和事件来处理数据


`text` 和 `textarea`


`checkbox` 和 `radio`


单选框绑定一个值

    绑定的v3不是value,是单选框的check值


多选框绑定到一个布尔值或数组


`select`

单选绑定到值,多选绑定到数组


指令修饰符

        一个指令可以包含的内容包括:

                - 指令名称

                - 指令值

                - 指令参数

                - 指令修饰符


.lazy(懒)

        取代 `input` 监听 `change` 事件,焦点失去后触发

.number

        输入字符串转为有效的数字


.trim

        输入首尾空格过滤


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,193评论 0 6
  • 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: 实例生命周期钩子 每个 Vue 实例...
    Timmy小石匠阅读 1,370评论 0 11
  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 3,309评论 0 3
  • 本章内容:表单 与 v-model、组件、自定义指令 六、表单 与 v-model 6.1、基本用法 Vue.js...
    了凡和纤风阅读 872评论 1 2
  • 路城靖源水泉甘, 川外青峰春略寒, 府邸堂前菊瓣散。 山峦岭上枸荆团 曾经远走嘉关险, 如今驱程御道闲 若问庶卒何...
    古城苍狼阅读 646评论 16 11