Vue框架基本使用
Vue
(读音 /vjuː/
,类似于 view
) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue
被设计为可以自底向上逐层应用。Vue
的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue
也完全能够为复杂的单页应用提供驱动。
前端框架和库的区别
功能上的不同
jquery
库:包含DOM
(操作DOM
)+请求,就是一块功能。art-template
库:模板引擎渲染,高性能的渲染DOM
(我们后端的一种模板 跟python
的模板类似)
框架:大而全的概念,简易的DOM
体验+请求处理+模板引擎
在KFC
的世界里,库就是一个小套餐,框架就是全家桶。
代码上的不同
一般使用库的代码,是调用某个函数或者直接使用抛出来的对象,我们自己处理库中的代码。
一般使用框架,其框架本身提供的好的成套的工具帮我们运行我们编写好的代码。
框架的使用
初始化自身的一些行为
执行你所编写的代码
释放一些资源
nodejs
去官网https://nodejs.org/en/download/ 下载 安装(傻瓜式安装)
打开终端
cmd
: 执行node -v
如果出现版本号,证明安装node
成功 ,跟安装python
雷同下载完
node
之后,会自带包管理器npm
,好比 是python
中pip3
包管理器。pip3 install xxx
使用
npm
4.1 要初始化
npm
的项目 :npm init --yes
自动生成一个package.json文
件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"name": "vue_lesson",
"version": "1.0.0",
"description": "这是我的vue的第一个项目",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "Tony",
"license": "ISC",
"dependencies": {
"vue": "^2.5.16"
}
}4.2 下载依赖包
1
2npm install vue --save`
`npm install jquery --save4.3 卸载包
npm uninstall vue --save
4.4 下载所有的依赖包
npm install
vue
的起步
- 引包:
- 创建实例化对象
1 | new Vue({ |
指令系统
v-if和v-show
v-if
v-if
指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。
1 | <h1 v-if="awesome">Vue is awesome!</h1> |
也可以用 v-else
添加一个“else 块”:
1 | <h1 v-if="awesome">Vue is awesome!</h1> |
因为 v-if
是一个指令,所以必须将它添加到一个元素上。但是如果想切换多个元素呢?此时可以把一个 <template>
元素当做不可见的包裹元素,并在上面使用 v-if
。最终的渲染结果将不包含 <template>
元素。
1 | <template v-if="ok"> |
v-show
另一个用于根据条件展示元素的选项是 v-show
指令。用法大致一样:
1 | <h1 v-show="ok">Hello!</h1> |
不同的是带有 v-show
的元素始终会被渲染并保留在 DOM 中。v-show
只是简单地切换元素的 CSS
属性 display
。
注意,v-show
不支持 <template>
元素,也不支持 v-else
。
v-if
vs v-show
v-if
是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。v-if
也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,v-show
就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS
进行切换。
一般来说,v-if
有更高的切换开销,而 v-show
有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show
较好;如果在运行时条件很少改变,则使用 v-if 较好。
v-on v-bind v-for
v-on
缩写:
@
预期:
Function | Inline Statement | Object
参数:
event
修饰符:
.stop
- 调用event.stopPropagation()
。.prevent
- 调用event.preventDefault()
。.capture
- 添加事件侦听器时使用 capture 模式。.self
- 只当事件是从侦听器绑定的元素本身触发时才触发回调。.{keyCode | keyAlias}
- 只当事件是从特定键触发时才触发回调。.native
- 监听组件根元素的原生事件。.once
- 只触发一次回调。.left
- (2.2.0) 只当点击鼠标左键时触发。.right
- (2.2.0) 只当点击鼠标右键时触发。.middle
- (2.2.0) 只当点击鼠标中键时触发。.passive
- (2.3.0) 以{ passive: true }
模式添加侦听器
用法:
绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。
在监听原生
DOM
事件时,方法以事件为唯一的参数。如果使用内联语句,语句可以访问一个$event
属性:v-on:click="handle('ok', $event)"
。从
2.4.0
开始,v-on
同样支持不带参数绑定一个事件/监听器键值对的对象。注意当使用对象语法时,是不支持任何修饰器的。示例:
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<!-- 方法处理器 -->
<button v-on:click="doThis"></button>
<!-- 动态事件 (2.6.0+) -->
<button v-on:[event]="doThis"></button>
<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>
<!-- 缩写 -->
<button @click="doThis"></button>
<!-- 动态事件缩写 (2.6.0+) -->
<button @[event]="doThis"></button>
<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>
<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>
<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>
<!-- 串联修饰符 -->
<button @click.stop.prevent="doThis"></button>
<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">
<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">
<!-- 点击回调只会触发一次 -->
<button v-on:click.once="doThis"></button>
<!-- 对象语法 (2.4.0+) -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>在子组件上监听自定义事件 (当子组件触发“
my-event
”时将调用事件处理器):1
2
3
4
5
6
7<my-component @my-event="handleThis"></my-component>
<!-- 内联语句 -->
<my-component @my-event="handleThis(123, $event)"></my-component>
<!-- 组件中的原生事件 -->
<my-component @click.native="onClick"></my-component>
v-bind
缩写:
:
预期:
any (with argument) | Object (without argument)
参数:
attrOrProp (optional)
修饰符:
.prop
- 被用于绑定DOM
属性 (property
)。(差别在哪里?).camel
- (2.1.0+) 将kebab-case
特性名转换为camelCase
. (从 2.1.0 开始支持).sync
(2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的v-on
侦听器。
用法:
动态地绑定一个或多个特性,或一个组件 prop 到表达式。
在绑定
class
或style
特性时,支持其它类型的值,如数组或对象。可以通过下面的教程链接查看详情。在绑定
prop
时,prop
必须在子组件中声明。可以用修饰符指定不同的绑定类型。没有参数时,可以绑定到一个包含键值对的对象。注意此时
class
和style
绑定不支持数组和对象。示例:
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<!-- 绑定一个属性 -->
<img v-bind:src="imageSrc">
<!-- 动态特性名 (2.6.0+) -->
<button v-bind:[key]="value"></button>
<!-- 缩写 -->
<img :src="imageSrc">
<!-- 动态特性名缩写 (2.6.0+) -->
<button :[key]="value"></button>
<!-- 内联字符串拼接 -->
<img :src="'/path/to/images/' + fileName">
<!-- class 绑定 -->
<div :class="{ red: isRed }"></div>
<div :class="[classA, classB]"></div>
<div :class="[classA, { classB: isB, classC: isC }]">
<!-- style 绑定 -->
<div :style="{ fontSize: size + 'px' }"></div>
<div :style="[styleObjectA, styleObjectB]"></div>
<!-- 绑定一个有属性的对象 -->
<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>
<!-- 通过 prop 修饰符绑定 DOM 属性 -->
<div v-bind:text-content.prop="text"></div>
<!-- prop 绑定。“prop”必须在 my-component 中声明。-->
<my-component :prop="someThing"></my-component>
<!-- 通过 $props 将父组件的 props 一起传给子组件 -->
<child-component v-bind="$props"></child-component>
<!-- XLink -->
<svg><a :xlink:special="foo"></a></svg>.camel
修饰符允许在使用DOM
模板时将v-bind
属性名称驼峰化,例如SVG
的viewBox
属性:1
<svg :view-box.camel="viewBox"></svg>
在使用字符串模板或通过
vue-loader
/vueify
编译时,无需使用.camel
。
v-for
预期:
Array | Object | number | string | Iterable (2.6 新增)
用法:
基于源数据多次渲染元素或模板块。此指令之值,必须使用特定语法
alias in expression
,为当前遍历的元素提供别名:1
2
3<div v-for="item in items">
{{ item.text }}
</div>另外也可以为数组索引指定别名 (或者用于对象的键):
1
2
3<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, name, index) in object"></div>v-for
默认行为试着不改变整体,而是替换元素。迫使其重新排序的元素,你需要提供一个key
的特殊属性:1
2
3<div v-for="item in items" :key="item.id">
{{ item.text }}
</div>从 2.6 起,
v-for
也可以在实现了可迭代协议的值上使用,包括原生的Map
和Set
。不过应该注意的是Vue 2.x
目前并不支持可响应的Map
和Set
值,所以无法自动探测变更。当和
v-if
一起使用时,v-for
的优先级比v-if
更高。示例:
我们可以用
v-for
指令基于一个数组来渲染一个列表。v-for
指令需要使用item in items
形式的特殊语法,其中items
是源数据数组,而item
则是被迭代的数组元素的别名。1
2
3
4
5<ul id="example-1">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>1
2
3
4
5
6
7
8
9var example1 = new Vue({
el: '#example-1',
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})结果:
Foo
Bar
组件的使用
局部组件的使用
打油诗: 1.声子 2.挂子 3.用
1 | //1.声子 |
(1)父组件向子组件传递数据:通过Prop
1.在子组件自定义特性。props:[‘自定义的属性1’,’自定义属性2’]
当一个值传递给一个 prop 特性的时候,它就变成了那个组件实例的一个属性,那么我们就可以像访问data中的值一样
2.要在父组件中导入的子组件内部 绑定自定义的属性
1 | <Vheader :title = '父组件中data声明的数据属性'/> |
注意:一个组件默认可以拥有任意数量的 prop,任何值都可以传递给任何 prop。
(2)如何从子组件传递数据到父组件
1.给子组件中的某个按钮绑定原声事件,。我们可以调用内建的 this.$emit('自定义的事件名','传递的数据')
,来向父级组件触发一个自定义的事件.
2.在父组件中的子组件标签中 要绑定自定义的事件,
全局组件的使用
1 | Vue.component('全局组件的名字',{ |
1 | <slot> 元素作为承载分发内容的出口 |
过滤器的使用
局部过滤器
1 | //1.注册局部过滤器 在组件对象中定义 |
全局过滤器
1 | // 注册全局的过滤器 |
计算属性computed和侦听器(watch)
侦听的是单个属性
1 | watch:{ |
侦听多个属性:计算属性 computed
1 | // 计算属性 :默认只有getter方法 |
生命周期(钩子函数)
1 | beforeCreate(){ |
$属性
$refs
获取组件内的元素$parent
:获取当前组件的父组件$children
:获取当前组件的子组件$root
:获取New Vue
的实例化对象$el
:获取组件对象的DOM
元素
获取更新之后的dom添加事件的特殊情况
$nextTick
是在下次Dom
更新循环结束之后执行的延迟回调,在修改数据之后使用$nextTick
,则可以在回调中获取更新之后的DOM