vue1.0
vue1.0学习总结
前言
使用vue已经有三、四个月了,但是只是学着使用了一些基本方法。因为现在的前端框架越来越多(Angular,React...),但是我相信万变不离其宗,很多用法框架之间还是想通的,所以借总结的vue的机会深入了解vue到每个细节,以后能更加熟练地使用vue,有机会也能在别的框架中体会相通的思想。
一、基本&&重点介绍
- 兼容性:vue不支持IE8及以下版本,因为IE8不支持vue所使用的ECMAScript5语法
- 数据驱动视图:不需要操作DOM
- 支持双向绑定:但是默认为数据从父组件到子组件的单向绑定
- 组件化:每一个用vue搭建起来的项目,其实都是一个组件树
二、数据绑定语法
- 模板
- Mustache 语法
- 写法: {{}} 插文本 {{{}}}插html
- 可以插在属性里 eg.<div id="item-{{ id }}"></div>
- 指令
- 以v-为前缀,后面可以带一个参数以:连接,此外还可以带一个修饰符以.连接 eg. v-bind:href="xxx",v-on:click="onClick"
- 缩写: v-bind:href ---> :href="xxx" v-on:click ---> @click="xxx"
三、计算属性
- 计算属性会有一个响应依赖,并且它会持续追踪它的响应依赖,如果响应依赖没有变化,则会返回缓存结果。只有响应依赖变化的时候才会触发视图更新。
- 计算属性默认只是 getter,不过在需要时你也可以提供一个 setter:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// ...computed: { fullName: { // getter get: function () { return this.firstName + ' ' + this.lastName }, // setter set: function (newValue) { var names = newValue.split(' ') this.firstName = names[0] this.lastName = names[names.length - 1] } }}// ... |
现在在调用 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstName 和 vm.lastName 也会有相应更新。
四、Class与Style的绑定
- class的绑定
- 可以通过变量的布尔值,来控制class最后的渲染结果
- eg. <div class="static" v-bind:class="{ 'class-a': isA, 'class-b': isB }"></div> ( 显示class-a或class-b是否加入到class里,取决于isA和isB的布尔值)
- style的绑定
|
1
2
3
4
5
6
7
|
<div v-bind:style="styleObject"></div>data: { styleObject: { color: 'red', fontSize: '13px' }} |
五、条件渲染
- v-if: 支持使用<template></template>作为包装元素,不用直接操控元素,且最终渲染结果不会包括它(<template></template>)
- v-show: 相当于控制display,不支持<template></template>
注意:v-show直接用在组件上时,v-else会出现问题,可以用v-show代替v-else
|
1
2
|
<custom-component v-show="condition"></custom-component><p v-show="!condition">这可能也是一个组件</p> |
- v-if 和 v-show的区别:
v-if有更高的切换消耗而v-show有更高的初始渲染消耗。因为v-if里有数据和子组件,故操作时会不断销毁和重建,成本较高。但是v-show里的元素会被始终编译和保留
六、列表渲染
v-for
- 遍历数组
- 块内特殊变量: $index (数组索引)
- <template></template>包装元素:适用
- track-by: 指定数组以指定的某种顺序来渲染视图 eg.track-by="$index"
|
1
2
3
4
5
6
7
8
9
10
11
|
基本写法一:<ul id="example-2"> <li v-for="item in items"> {{ parentMessage }} - {{ $index }} - {{ item.message }} </li></ul>基本写法二:<div v-for="(index, item) in items"> {{ index }} {{ item.message }}</div> |
- 遍历对象
- 块内特殊变量:$key(对象中的key)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
new Vue({ el: '#repeat-object', data: { object: { FirstName: 'John', LastName: 'Doe', Age: 30 } }})基本写法一:<ul id="repeat-object" class="demo"> <li v-for="value in object"> {{ $key }} : {{ value }} </li></ul>基本写法二:<div v-for="(key, val) in object"> {{ key }} {{ val }}</div> |
数组变动检测
- 数组方法:可触发视图更新
eg. .push()、.pop()、.shift()、.unshift()、.splice()、.sort()、.reverse()
- 数组的限制:
1.不能之间用索引设置元素,eg. vm.items[0] = {}; 解决办法:使用$set方法,如 example.items.$set(0,{aaa:'changed!'}),这样就可以触发新视图了
2.不能直接设置数组的长短, eg. vm.items.length = 0; 解决办法:直接赋给一个空数组
- 数组的特殊方法
1. $set(数组索引,要修改的值)
使用方法:如上第一点的使用方法
2.$remove(下标)
七、方法与事件处理器
- 事件中的特殊变量:$event
|
1
2
3
4
5
6
7
8
|
<button v-on:click="say('hello!', $event)">Submit</button><br>// ...methods: { say: function (msg, event) { // 现在我们可以访问原生事件对象 event.preventDefault() }} |
- 事件修饰符: .prevent阻止默认事件 .stop阻止冒泡事件 .self只在事件发生在该元素本身(不为子元素)时触发回调 .capture添加事件监听器时
- 按键修饰符:enter 、tab、delete、esc、space、up、down、left、right
|
1
|
<input v-on:keyup.enter="submit"> |
八、表单控件绑定
表单控件的绑定,主要由v-model进行双向绑定
表单
- text/textarea: v-model 绑定的值就是text的值
- checkbox: v-model绑定的值默认为布尔值(也可以自定义),多个checkbox绑定同一个值,对应每个checkbox的值为其value值
- radio: v-model绑定的值为其value值,多个radio绑定同一个值,对应每个radio的值为其value值
- select: 单选时,v-model绑定的值为option中value;多选时,要在select上加multiple
参数特性
- lazy:在默认情况下,
v-model在input事件中同步输入框值与数据,可以添加一个特性lazy,从而改到在change事件中同步 - number:自动将用户输入的转成Number
- debounce:输入延迟
九、过渡
动画类处理方法,跳过
十、组件
前面提到vue的项目就是一个组件树,一个页面的所有可见的模块都可以细化成一个组件。
想要实现一个组件主要先从初始化根实例,定义组件和注册组件
|
1
2
3
4
5
6
7
8
9
10
|
// 定义var MyComponent = Vue.extend({ template: '<div>A custom component!</div>'})// 注册Vue.component('my-component', MyComponent)// 创建根实例new Vue({ el: '#example'}) |
props
可以从父组件传给子组件的一些数据
- 绑定修饰符:.sync 和 .once
|
1
2
3
4
5
6
|
<!-- 默认为单向绑定 --><child :msg="parentMsg"></child><!-- 双向绑定 --><child :msg.sync="parentMsg"></child><!-- 单次绑定 --><child :msg.once="parentMsg"></child> |
- props中的type验证: Stirng、Number、Object、Function、Boolean、Array
父子组件通信
- 自定义事件
- $on() 监听事件,一般在ready时就要进行监听,不然类似$dispatch事件没办法传递数据
- $emit()
- $dispatch() 派发事件,子组件派发到父组件
- $broadcast():广播事件,父组件传递到子组件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<!-- 子组件模板 --><template id="child-template"> <input v-model="msg"> <button v-on:click="notify">Dispatch Event</button></template><!-- 父组件模板 --><div id="events-example"> <p>Messages: {{ messages | json }}</p> <child></child></div>// 注册子组件// 将当前消息派发出去Vue.component('child', { template: '#child-template', data: function () { return { msg: 'hello' } }, methods: { notify: function () { if (this.msg.trim()) { this.$dispatch('child-msg', this.msg) this.msg = '' } } }})<br>// 初始化父组件// 将收到消息时将事件推入一个数组var parent = new Vue({ el: '#events-example', data: { messages: [] }, // 在创建实例时 `events` 选项简单地调用 `$on` events: { 'child-msg': function (msg) { // 事件回调内的 `this` 自动绑定到注册它的实例上 this.messages.push(msg) } }})<br><br> |
我们将这个示例分为几个步骤解读:
- 子组件的button元素绑定了click事件,该事件指向
notify方法 - 子组件的
notify方法在处理时,调用了$dispatch,将事件派发到父组件的child-msg事件,并给该该事件提供了一个msg参数 - 父组件的events选项中定义了
child-msg事件,父组件接收到子组件的派发后,调用child-msg事件。
- 用v-on绑定自定义事件
|
1
|
<child v-on:child-msg="handleIt"></child> |
当子组件触发了 "child-msg" 事件,父组件的 handleIt 方法将被调用。所有影响父组件状态的代码放到父组件的 handleIt 方法中;子组件只关注触发事件。
vue1.0的更多相关文章
- 使用vue1.0+es6+vue-cli+webpack+iview-ui+jQuery 撸一套高质量的后台管理系统
首先按照vue.js官网的指令安装: 1.本地安装好node.js 2.根据官方命令行工具 详情 这样一个官方的脚手架工具就已经搭建好了:但是有一点需要注意的是由于现在按照官方的搭建方法是搭建vue2 ...
- vue1.0和vue2.0的区别(一)
今天我们来说一说vue1.0和vue2.0的主要变化有哪些 一.在每个组件模板,不在支持片段代码 VUE1.0是: <template> <h3>我是组件</h3> ...
- vue1.0和vue2.0的区别(二)
这篇我们继续之前的vue1.0和vue2.0的区别(一)继续说 四.循环 学过vue的同学应该知道vue1.0是不能添加重复数据的,否则它会报错,想让它重复添加也不是不可以,不过需要定义别的东西 而v ...
- vue1.0中$index一直报错的解决办法
原文链接:https://www.cnblogs.com/liqiong-web/p/8144925.html 看学习视频,因为年份比较早了,其实vue早已迭代到vue2.0了,遇到一些问题: v-f ...
- vue1.0与vue2.0对于v-for的使用的区别
vue1.0与vue2.0对于v-for的使用的区别: 1,vue1.0中有$index,而vue2.0将$index移除. 2,vue1.0中(index,item) in list 而vue2.变 ...
- vue1.0+vue2.0实现选项卡
通常我们写tab选项卡的时候,一般都是用jq等去操作dom,给同级元素移除active类,然后,给被点击元素添加active类,用vue实现也是同样的原理,都是操作active类. 我们都知道用vue ...
- vue使用中遇到的,以及vue1.0到vue2.0新手踩的坑
最近再写一个vue的项目,视频中用的是vue1.0,但是现在vue已经2.0,所以踩了很多坑,先记录下来.理解有误再来修改. 路由问题 之前的路由是写在app.vue里边,而2.0的路由直接有个rou ...
- Vue1.0到2.0变化
一.生命周期 二.代码片段 在vue1.0中可以在template编写时出现: <template> <div>第一行</div> <div>第二行&l ...
- vue的生命周期(又称钩子函数)----以及vue1.0版本与vue2.0版本生命周期的不同
vue生命周期 1. vue1.0版本与vue2.0版本生命周期的不同 vue1.0版本生命周期图示 图1 vue1.0版本生命周期 vue1.0版本的生命周期: init 实例创建之前 creat ...
- vue2.x和vue1.0
1.首先挂载方式上 在vue2.0中,如果使用body或者html作为挂载点,则会报以下警告: Do not mount Vue to <html> or <body> - m ...
随机推荐
- 解题:SDOI 2014 重建
题面 做这个这个题需要稍微深入理解一点矩阵树定理:套矩阵树定理得到的东西是有意义的,它是“所有生成树边权乘积之和”(因为度数矩阵是点的边权和,邻接矩阵是边权),即$\sum_{t}\prod_{e∈t ...
- Qtree4——动态点分治
题目描述 给出一棵边带权的节点数量为n的树,初始树上所有节点都是白色.有两种操作: C x,改变节点x的颜色,即白变黑,黑变白 A,询问树中最远的两个白色节点的距离,这两个白色节点可以重合(此时距离为 ...
- 【codevs1006】等差数列
题目大意:给定一个 N(N <= 100) 个数字组成的集合,从中取出若干数字组成的等差数列最长是多少. 题解:由于这道题数据范围较小,可以直接依据每个数字进行枚举.首先,这道题给出的是一个集合 ...
- IE盒模型和W3C盒子模型的区别
其实这个问题到现在真的是没有意义了,因为早在IE6的兼容模式开始就已经弃用了IE盒子模型了,但是现在的各种面试题还是会时常出现这样的上世纪的题目,我觉得其实时纯粹的刁难. 好了,吐槽不多说了,直接上图 ...
- MySQL初始化以及客户端工具的使用
MySQL初始化以及客户端工具的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是关系型数据库 关系型数据库通常是把所有的数据都组织成二维关系.之所以称为关系型数据库是 ...
- 分布式锁--Redis小试牛刀
参考文章: Redis分布式锁的正确实现方式 分布式锁看这篇就够了 在这两篇文章的指引下亲测 Redis分布式锁 引言 分布式系统一定会存在CAP权衡问题,所以才会出现分布式锁 什么是CAP理论? 为 ...
- jquery(入门篇)无缝滚动
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- es6笔记(6) Iterator 和 for...of循环
概要 js中的数组.对象,加上ES6中增加的Map.Set四种数据集合. Iterator提供了一种机制,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍 ...
- CTEX windedt 打开中文tex乱码问题
% !TEX encoding = System % !TEX program = pdflatex % !TEX encoding = System% !TEX program = pdflatex ...
- py-faster-rcnn代码阅读3-roidb.py
roidb是比较复杂的数据结构,存放了数据集的roi信息.原始的roidb来自数据集,在trian.py的get_training_roidb(imdb)函数进行了水平翻转扩充数量,然后prepare ...