首页 > 其他分享 >Vue 学习笔记-入门(1)

Vue 学习笔记-入门(1)

时间:2023-02-21 15:59:28浏览次数:32  
标签:Vue 入门 绑定 vm 笔记 js msg data

Vue入门
简述
​ Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用(SPA)提供驱动。

MVVM模式的实现者
Model:模型层,在这里表现 JavaScript 对象
View:视图层,在这里表示 DOM(HTML操作的元素)
ViewModel:连接驶入和数据的中间件,Vue.js 就是 MVVM 中的 ViewModel 层的实现者
在MVVM 架构中,是不允许数据和视图直接通信的,只能通过 ViewModel 来通信,而ViewModel 就是定义了一个Observer观察者
ViewModel 能够观察到数据的变化,并对试图对应的内容进行更新
ViewModel 能够监听到试图的变化,并能够通知数据发生改变
Vue.js 就是一个MVVM的实现者,他的核心就是实现了 DOM 监听 与 数据绑定
为什么要使用Vue.js
轻量级,体积小是一个重要指标,它压缩之后只有20多kb(Angular压缩后56kb+,React压缩后44kb+)
移动优先,更适合移动端,比如移动端的Touch时间
易上手,学习曲线平稳,文档齐全
吸取了Angular(模块化)和React(虚拟DOM)的长处,并拥有自己独特的功能,如计算属性
开源,社区活跃度高
第一个Vue程序
​ IDEA可以安装 Vue 的插件

​ 注意:Vue 不支持 IE8 及以下的版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性,但它支持所有兼容ECMAScript 5的浏览器。

下载
​ 地址:https://vuejs.org/v2/guide/installation.html

​ 开发版本:

 

CDN:

​ 出于原型设计或学习目的,可以使用最新版本:

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
1
​ 对于生产,建议链接到特定版本号并构建以避免较新版本意外损坏:

<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
1
​ 如果使用原生 ES 模块,还有一个 ES 模块兼容构建:

<script type="module">
import Vue from 'https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.esm.browser.js'
</script>
1
2
3
示例:
hello vue

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello vue</title>
</head>
<body>
<div id="app">
{{message}} <br/>
</div>
</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data:{
message : "hello vue"
}
});
</script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
动态绑定:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>动态绑定</title>
</head>
<body>
<div id="app">
{{message}} <br/>
<span v-bind:title="msg">
鼠标悬停几秒查看此处动态绑定的信息
</span>
</div>
</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data:{
message : "hello vue",
msg: "hello world"
}
});
</script>

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
效果:

 

基本语法:

if-else if-else:

​ 修改type值,展示不同内容

​ 示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>if判断</title>
</head>
<body>
<div id="app">
<p v-if="type==='A'">A</p>
<p v-else-if="type==='B'">B</p>
<p v-else-if="type==='C'">C</p>
<p v-else>D</p>
</div>
</body>
</html>

<script>
var vm = new Vue({
el: "#app",
data:{
type: 'e'
}
});
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
for

循环打印内容

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for循环</title>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item,index) in items">
{{item.msg}} -- {{index}}
</li>
</ul>
</div>
</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data:{
items: [
{msg: "Sakura"},
{msg: "World"},
{msg: "筑梦师"}
]
}
});
</script>

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
绑定事件:

点击按钮弹出窗口展示msg内容

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>绑定事件</title>
</head>
<body>
<div id="app">
<button v-on:click="sayHi">Click Me</button>
</div>
</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data:{
msg: "world"
},
methods: {
sayHi: function (event){
alert(this.msg);
}
}
});
</script>

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
双向数据绑定
什么是双向数据绑定
​ Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时候,试图也就发生滨化,当视图发生变化的时候,数据也会跟着同步变化,也算是Vue.js 的精髓之处。

​ 需要注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的,非UI控件不会涉及到数据双向绑定,单向数据绑定是使用状态管理工具的前提,如果我们使用 vuex,那么数据流也是单项的,这是就会何双向数据绑定有冲突。

为什么要实现数据的双向绑定
​ 在Vue.js 中,如果使用 vuex,实际上数据还是单向的,之所以说是数据双向绑定,这是用的UI控件来说,对于我们处理表单,Vue.js 的双向数据绑定用起来就特别舒服了,及两者并不互斥,在全局性数据流使用单项,方便跟踪;局部性数据流使用双星,简单易操作。

在表单中使用双向数据绑定
​ 可以用 v-model 指令在表单 、、及 元素上创建双向数据绑定,它会根据控件类型自动选取正确的方法来更新元素,尽管有些什么,但 v-model 本质上不过是语法糖,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

​ 注意:v-model 会忽略所有表单的 value、cheked、selected特性的初始值二总是将 Vue 实例的数据作为数据来源,应该在 JavaScript 在组件的 data 选项中声明初始值。

示例:

文本双向绑定:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文本双向绑定</title>
</head>
<body>
<div id="app">

文本:<input type="text" v-model="msg" />
<br/>
<textarea rows="3" v-model="msg"></textarea>
<br/>
{{msg}}

</div>
</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data: {
/* 不设置默认值 */
msg: ""
/* 设置默认值 */
/*msg: "123"*/
}
});
</script>

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
单选按钮双向绑定:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>单选按钮双向绑定</title>
</head>
<body>
<div id="app">

性别:<input type="radio" name="sex" value="男" v-model="msg"/> 男
<input type="radio" name="sex" value="女" v-model="msg" /> 女
<br/>
选择了:{{msg}}

</div>
</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: ''
}
});
</script>

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
下拉框双向绑定:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下拉框双向绑定</title>
</head>
<body>
<div id="app">

下拉框:
<select v-model="msg">
<option value="" disabled>---请选择---</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<br/>
选择了:{{msg}}

</div>
</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: ''
}
});
</script>

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
Vue组件
什么是组件
​ 组件时可复用的 vue 实例,说白了就是一组可以重复使用的膜拜你,跟 JSTL 的自定义标签、Thymeleaf的 th: fragment 等框架有着异曲同工之妙,通常一个应用会以一棵嵌套的组件树的形式来组织。

 

​ 例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。

​ 注意:在实际开发中,我们并不会用以下方式开发组件,而是采用 vue-cli 创建 .vue 模板文件的方式挨罚,以下方法只是为了让大家理解什么是组件

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>组件示例</title>
</head>
<body>
<div id="app">

<!-- 组件:传递给组件中的值:props -->
<world v-for="item in items" v-bind:sak="item"></world>

</div>
</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>

//定义一个Vue组件component
Vue.component("world",{
props: ['sak'],
template: '<li>{{sak}}</li>'
});

var vm = new Vue({
el: "#app",
data: {
items: ['Java','Linux','Vue.js']
}
});
</script>

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
Axios异步通信
什么是Axios
​ Axios 是一个开源的可以用在浏览器端何 NodeJS 的异步通信框架,它的主要作用就是实现AJAX异步通信,其功能特点如下:

从浏览器中创建 XMLHttpRequests
从 node.js 创建 http 请求
支持 Promise API [JS中链式编程]
拦截请求何响应数据
转换请求数据何响应数据
取消请求
自动转换 JSON 数据
客户端支持防御 XSRF(跨站请求伪造)
文档:http://axios-js.com/zh-cn/docs/

​ https://cn.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html

为什么要使用 Axios
​ 由于 Vue.js 是一个 视图层 框架 并且作者(尤雨溪)严格准守SoC(关注度分离原则),所以 Vue.js 并不包含 Ajax 的通信功能,为了解决通信问题,作者单独开发了一个名为 vue-resource 的插件,不过在进入2.0版本以后停止了对该插件的维护并推荐了 Axios 框架,少用 jQuery ,因为它的操作Dom太频繁。

第一个 Axios 应用程序
CDN:

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.js"></script>
1
​ 开发的接口大部分都是采用JSON格式,可以先在项目里模拟一段JSON数据,数据内容如下:

{
"name": "World",
"url": "https://baidu.com",
"page": 1,
"isNonProfit":true,
"address": {
"street": "含光门",
"city": "陕西西安",
"country": "中国"
},
"links": [
{
"name": "B站",
"url": "https://www.bilibili.com/"
},
{
"name": 4399,
"url": "https://www.4399.com/"
},
{
"name": "百度",
"url": "https://www.baidu.com/"
}
]
}

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
Vue 的生命周期
​ Vue 实例有一个完整的生命周期,也就是从开始创建。初始化数据、编译模板、挂载DOM、渲染–>更新–> 渲染、卸载等一系列过程,我们称这是 Vue 的生命周期,通俗说就是 Vue 实例从创建到销毁的过程,就是生命周期。

​ 在 Vue 的整个生命周期中,它提供了一系列的事件,可以让我们字事件触发时注册 JS 方法,可以让我们用自己注册的 JS 方法控制整个大局,在这些事件响应方法中的 this 直接指向的是 Vue 的实例。

 

 


示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Axios</title>

<!-- 解决闪烁问题 -->
<style>
[v-cloak]{
display: none;
}
</style>
</head>
<body>

<div id="vue" v-cloak>
<div>{{info.name}}</div>
<div>{{info.address.country}}</div>

<a v-bind:href="info.url">百度一下</a>
</div>

</body>
</html>
<!-- 引入js文件 -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#vue",
data(){
return {
// 请求的返回参数合适,必须和json字符串一样
info: {
name: null,
url: null,
address: {
street: null,
city: null,
country: null
}
}
}
},
mounted(){ //钩子函数,链式编程,ES6新特性
axios.get("../data.json").then(response=>(this.info=response.data));
}
});
</script>

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
43
44
45
46
47
48
49
data.json位置如下:

 

计算机属性
​ 计算机属性重点突出在 属性 两个字上(属性是名词),首先它是个 属性,其次这个属性有 计算 的能力(计算是动词),这里的 计算 就是个函数;简单说,它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已,可以想象为缓存。

​ 计算机属性:计算出来的结果,保存在属性中,内存中运行:虚拟Dom

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>计算机属性</title>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>

<div id="app">
<p>currentTime1 {{currentTime1()}}</p>
<p>currentTime2 {{currentTime2}}</p>
</div>

</body>
</html>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: "hello vue"
},
methods: {
currentTime1: function () {
return Date.now(); //返回一个时间戳
}
},
computed: { //计算属性:methods,computed 方法名不能重名,重名之后,只会调用 methods 的方法
currentTime2: function () {
return Date.now(); //返回一个时间戳
}
}
});
</script>

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
methods:定义方法,调用方法使用currentTime1(),需要带括号
computed:定义计算属性,调用属性使用currentTime2,不需要带括号; this.message是为了能够让currentTime2观察到数据变化而变化心
如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用vm.me s sage=“qinjiang” ,改变下数据的值,再次测试观察效果!
结论:

​ 调用方法时,每次都需要进行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这一点, **计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销 **;

内容分发
​ 在 Vue.js 中我们使用 元素作为承载分发内容的出口,作者称其为 插槽,可以应用在组合组件的场景中。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>插槽slot</title>
</head>
<body>

<div id="app">
<todo>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items>
</todo>
</div>

</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>

// slot插槽
Vue.component("todo",{
template: '<div>' +
'<slot name="todo-title"></slot>' +
'<ul>' +
'<slot name="todo-items"></slot>' +
'</ul>' +
'</div>'
});

Vue.component("todo-title",{
props: ['title'],
template: "<div>{{title}}</div>"
});

Vue.component("todo-items",{
props: ['item'],
template: "<li>{{item}}</li>"
});

var vm = new Vue({
el: "#app",
data:{
title: "World",
todoItems: ["Java","Vue.js","MySQL"]
}
});
</script>

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
43
44
45
46
47
48
49
自定义事件
​ 通过以上代码不难发现,数据项在 Vue 的实例中,但删除操作要在组件中完成,那么组件如何才能删除 Vue 实例中的数据呢? 此时就设计到参数传递与事件分发了,Vue 为我们提供了自定义事件的共呢个很好的帮助我们解决了这个问题,使用 this.$emit(‘自定义事件名’, 参数),操作过程如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义事件</title>
</head>
<body>

<div id="app">
<todo>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="(item,index) in todoItems"
:item="item" :index="index" v-on:remove="removeItems(index)" :key="index"></todo-items>
</todo>
</div>

</body>
</html>
<!-- 导入Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>

// slot插槽
Vue.component("todo",{
template: '<div>' +
'<slot name="todo-title"></slot>' +
'<ul>' +
'<slot name="todo-items"></slot>' +
'</ul>' +
'</div>'
});

Vue.component("todo-title",{
props: ['title'],
template: "<div>{{title}}</div>"
});

Vue.component("todo-items",{
props: ['item','index'],
template: "<li>{{index}}---{{item}} <button @click='remove'>删除</button></li>",
methods: {
remove: function (index) {
// this.$emit 自定义事件分发
this.$emit('remove',index);
}
}
});

var vm = new Vue({
el: "#app",
data:{
title: "World",
todoItems: ["Java","Vue.js","MySQL"]
},
methods: {
removeItems: function (index) {
console.log(this.todoItems[index]);
this.todoItems.splice(index,1); //一次删除一个元素
}
}
});
</script>

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

————————————————
版权声明:本文为CSDN博主「Hello+World」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_47284422/article/details/119303686

 

标签:Vue,入门,绑定,vm,笔记,js,msg,data
From: https://www.cnblogs.com/im18620660608/p/17141276.html

相关文章

  • jedis-快速入门
    jedis-快速入门Jedis是一款Java操作redis数据库的工具创建lib包,然后导入jar包  JedisTest测试类packagecom.example.test;importorg.junit.Test;importredi......
  • 2023最新版Selenium 4.6.0完整语法入门
    简介Selenium是一款强而有力的前端应用测试工具,也非常适合搭配Python作为网络爬虫的工具;Selenium可以模拟使用者所有浏览器操作的动作,包括输入文本、点击按钮及拖拽进度条......
  • 论今日,Vue VSCode Snippets 不进行代码提示的问题 或 vetur Request textDocument/doc
    这他喵的是因为vetur这个鬼东西升级了,然后和项目中某些包不匹配了,降级就好了,法克尤啊法克尤,我整了一天,大概是坏了吧灵感来源:https://cxymm.net/article/a843334549/1......
  • PMP学习笔记《第八章 项目成本管理》
    质量管理的各种名言警句:1、等级低不一定是个问题,质量未达到要求肯定是个问题;2、PDCA循环由休哈特定义,戴明改进并完善PDCA环(14条原则)即持续改进;预防胜于检查3、朱兰:质......
  • 如何在手机上做高质量的读书笔记
    你有没有这样的感受,自己想要在写作上有所建树,但是每天只进行阅读,而没有时间做读书笔记。这样一篇文章阅读结束了,不知道文章的中心思想有哪些;一本书读完之后,也是只知道个大......
  • 随堂笔记11-spring之配置类解析
    spring之配置类解析启动spring时,需要传入一个appconfig.class给applicationContext,然后被封装为beanDefinition,这种beanDefinition称之为配置类beanDefinitionConfigu......
  • vue-cli创建项目、项目目录介绍、es6导入导出语法、小练习-登录功能、scoped
    目录1vue-cli创建项目2vue项目目录介绍3es6导入导出语法3.1App.vue,main.js,About.vue写了什么3.2导入导出语法3.2vue项目编写步骤4小练习-登录功能4.1App.vue动......
  • VUEX 使用学习六 : modules
    转载请注明出处:当Store中存放了非常多非常大的共享数据对象时,应用会变的非常的复杂,Store对象也会非常臃肿,所以Vuex提供了一个Module模块来分隔Store。通过对Vuex中的Sto......
  • 笔记即思维
    很多人会纠结于哪个笔记软件比较好,对比各个软件的功能。其实并没有必要,他们只是代表了各个设计者不同的思维。比如:印象笔记,是按照传统的笔记本,多个笔记本形成组,就像我们......
  • VUEX 使用学习五 : getter
    转载请注明出处:Getter对Store中的数据进行加工处理形成新的数据。他不会修改state中的原始数据,起到的是包装数据的作用;有时我们需要从store中的state中派生出一......