​ 直接在html中引入vue.js,以html界面为核心


插值语法

​ 在html中使用双括号即可直接使用在script中定义好的data

1
2
<h1>插值语法</h1>
<h3>你好,{{name}}</h3>
1
2
3
4
5
6
7
8
//data对象式写法
data: {
name: 'yx',
web: {
name: '爷的宝藏小站',
url: 'https://ackermanncora.site/'
},
},

v-bind (单向数据绑定)

​ 将html元素的某一参数与data的某一项单向绑定

1
2
<!-- v-bind:简写为: -->
<a :href="web.url">点我去宝藏小站!</a>

v-model (双向数据绑定)

​ v-model只能用在表单元素上

  1. v-bind绑定value属性的值;
  2. v-on绑定input事件监听到函数中,函数会获取最新的值赋值到绑定的属性中
1
双向数据绑定: <input v-model="data2" type="text" />
1
2
3
4
5
6
7
8
9
10
var vm2 = new Vue({
el: "#root2",
//data函数式写法:使用组件时必须用,不然用对象法写会报错
//data(){}也行
data: function() {
return {
data2: "12345"
}
}
})

v-on

简介

v-on用法

  • v-on 指令用于绑定事件监听器,v-on 指令的简写形式为 @event。
  • v-on 指令可以支持同时写多个事件监听器,多个事件监听器的简写形式为 v-on={@event1:handler1, @event2:handler2}。
  • v-on 指令支持原生 JavaScript 的所有的事件,并且支持参数传递。

语法

  • 缩写:@
  • 预期:Function | Inline Statement | Object
  • 参数:event

v-on的6个事件修饰符

  1. prevent:阻止默认事件
  2. stop:阻止事件冒泡
  3. once:事件只发生以此(终结v-for循环)
  4. capture:使用事件的捕获模式
  5. self:只有event.target是当前操作的元素时才触发事件
  6. passive:事件的默认行为立即执行,无需等待事件回调执行完毕
1
2
3
4
5
6
7
8
9
10
11
12
13
<a :href="web.url" @click.prevent="showinfo1">阻止默认事件</a>
<br/>
<div @click="showinfo1">
<a :href="web.url" @click.stop="showinfo1">阻止事件冒泡</a>
</div>
<br/>
<button @click.once="showinfo1">事件只发生一次</button>
<br/>
<div @click.capture="showMSG(1)">
事件捕获模式1
<div @click="showMSG(2)">事件捕获模式2</div>
</div>
<hr/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
methods: {
//event代表鼠标点击这个事件
showinfo1(event) {
alert("我是提示信息1!")
console.log(event)
},
showinfo2(num, event) {
alert("我是提示信息2!!")
console.log(num, event)

},
showMSG(msg) {
alert("事件发生第" + msg + '次!!!')
}
}

键盘事件

常用按键别名

  1. 回车:enter
  1. 删除或退格:delete
  1. 退出:esc
  1. 空格:space
  1. 换行:tab(必须配合keydown使用,ctrl、alt、shift、meta也是)
  1. 上下左右:up、down、left、right

使用例

1
2
<h2>键盘事件keyup</h2>
<input type="text" placeholder="按下回车提示输入" @keyup.enter="showinfoKey">
1
2
3
4
5
6
methods: {
showinfoKey(e) {
// if (e.keyCode != 13) return
alert("我是提示信息" + e.target.value + "!")
}
}

Computed (计算属性)

​ computed计算属性用于将data中的数据加工成沃玛需要的新数据,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
computed: {
fullName1: {
get() {
return this.firstName + "-" + this.lastName
},
//set方法没必要覆写,除非你希望添加些其他东西
// set(value) {
// const arr = value.split("-")
// this.firstName = arr[0]
// this.lastName = arr[1]
// }
},
//或者这样简写:
fullName2() {
return this.firstName + "-" + this.lastName
}
}
1
2
3
4
5
6
<h1>计算属性</h1>
姓:<input v-model="firstName" type="text" /><br>
名:<input v-model="lastName" type="text" /><br>
全名:
<span>{{fullName1}}</span>
<span>{{fullName2}}</span>

Watch (监视属性)

​ 当指定的data发生变化时,所执行的方法

1
2
3
4
<div id="root4">
<h2>监视属性:今天天气很{{info}}</h2>
<button @click="changeWeather">切换天气</button>
</div>
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
var vm4 = new Vue({
el: "#root4",
data: {
isHot: true,
numbers: {
a: 1,
b: 2
}
},
methods: {
changeWeather() {
this.isHot = !this.isHot
}
},
computed: {
info() {
return this.isHot ? '炎热' : '凉爽'
}
},
watch: {
isHot: {
immediate: false, //可省略,true为初始化时发生改变
handler(newValue, oldValue) {
console.log("isHot被修改了", newValue, oldValue)
}
},
numbers: {
deep: true, //深度监视,可以监测到多层级数据的变化
handler() {
console.log("numbers被修改了")
}
}
}
})

​ 也可以先创建vm,后续再把watch属性加入到vm中:

1
2
3
4
5
6
7
//第二种写法:
vm4.$watch('info', {
immediate: false, //可省略,true为初始化时发生改变
handler(newValue, oldValue) {
console.log("info被修改了", newValue, oldValue)
}
})

列表渲染 v-for

​ v-for可以设定类似for循环的子标签自动标准化生成功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<h2>列表渲染v-for</h2>
<div id="root5">
<ul>
<li v-for="p in persons" :key="p.id">
{{p.id}}-{{p.name}}
</li>
</ul>
<ul>
<li v-for="(p,index) in perArr" :key="index">
{{index}}-{{p.id}}-{{p.name}}
</li>
</ul>
<button @click.once="add">添加一个老刘</button>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var vm5 = new Vue({
el: "#root5",
data: {
persons: [{
id: 10001,
name: "张三"
},
{
id: 10002,
name: "李四"
}
]
},
methods: {
add() {
const p = { id: 10003, name: '老刘' }
this.persons.unshift(p)
}
}
})

过滤器fliter

​ 过滤器实质不改变原始数据,只是对数据进行加工处理后返回过滤后的数据再进行调用处理,我们也可以理解其为一个纯函数。

Vue 允许你自定义过滤器,可被用于一些常见的文本格式化。

​ ps: Vue3中已废弃filter

如何使用

1
2
3
4
<!-- 在双花括号中 -->
{{message | captialize}}
<!-- 在`v-bind`中 -->
<div v-bind:id="rawId | formatId"></div>

定义代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var app = new Vue({
el: '#app',
data: {
timestamp: Date.now()
},
computed: {//计算属性方法
formattedTimestamp() {
return dayjs(this.timestamp).format('YYYY-MM-DD HH:mm:ss');
}
},
methods: {//methods方法
formatTimestamp() {
return dayjs(this.timestamp).format('YYYY-MM-DD HH:mm:ss');
}
},
filters: { //过滤器方法
formatTimestampFilter(timestamp) {
return dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss');
}
}
});
1
2
3
4
5
6
7
8
<div id="app">
<h1>Formatted Timestamp</h1>
<p>{{ formattedTimestamp }}</p>
<h1>Formatted Timestamp (using method)</h1>
<p>{{ formatTimestamp() }}</p>
<h1>Formatted Timestamp (using filter)</h1>
<p>{{ timestamp | formatTimestampFilter }}</p>
</div>

mounted() 挂起

官方文档说明:

​ 实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了。如果根实例挂载到了一个文档内的元素上,当 mounted 被调用时 vm.$el 也在文档内。

​ 注意 mounted 不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕再执行某些操作,可以在 mounted 内部使用 vm.$nextTick

1
2
3
4
5
mounted: function () {
this.$nextTick(function () {
// 仅在整个视图都被渲染之后才会运行的代码
})
}

该钩子在服务器端渲染期间不被调用。

使用例:

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
<!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="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
<div id="root">
<h2 :style="{opacity}">欢迎学习Vue.js</h2>
</div>
</body>
<script>
new Vue({
el: "#root",
data: {
num: 0.1,
opacity: 1
},
//Vue完成模板的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
mounted() {
setInterval(() => {
this.opacity -= this.num
if (this.opacity <= 0 || this.opacity >= 1) this.num = -1 * this.num
}, 160);
}
})
</script>

</html>