Vue常用指令及自定义指令
一、常用指令
1. v-bind
固定绑定与动态绑定:
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<!-- v-bind动态属性数据绑定 -->
<!-- 固定 -->
<!-- <img src="http://www.mobiletrain.org/images_index/right-fixed-face.png" alt=""> -->
<!-- src属性中的数据它是通过data数据源中得到的 -- 动态 -->
<!--
语法:
标准语法:v-bind:属性="动态数据"
简写语法::属性="动态数拓"
-->
<img v-bind:src="src" alt="">
<img :src="src" alt="">
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
src: 'http://www.mobiletrain.org/images_index/right-fixed-face.png'
}
})
</script>
</body>
</html>
2. v-for
概述:
根据一组数组或对象的选项列表进行渲染。
v-for指令需要使用 (item,index) in 数组或对象 形式的特殊语法,同时还需要指定key值,key的作用在vue进行新旧数据比对渲染页面里,如果有key值会提升比对性能,加快渲染,key使用唯一的值来赋值。
循环 v-for vue中对于v-for进行了增强,它可以用 for in/of 都可以,而且两者都可以进行对象的迭代
语法:
vue2中小括号可以写,也可以不写,在vue3中一定要写小括号
注意:
- vue2中如果一个标签中同时有v-if和v-for,则v-for的优先级高于v-if,所以在vue2中不推荐两者在一个标签中
- vue3中v-if优先级高于v-for
- v-for=“(元素,索引) in/of 数组”
- v-for=“(元素,键名,索引) in/of 对象”
- v-for,建议给循环项每个添加一个key来作标识,用于提升性能,key值,一定要唯一不重复的,不太建议使用循环的索引当作key值,一般在和后台请求数据时,要求后台提供一个唯一的id给我们
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<!-- <li v-for="(item,index) in user">{{index}} -- {{item}}</li> -->
<!-- <li v-for="item,index in user">{{index}} -- {{item}}</li> -->
<li v-for="item,index in user" :key="item.id">{{item.name}}</li>
<!-- 循环对象 -->
<!-- <div v-for="item,key,index in user" :key="key">{{index}} -- {{key}} -- {{item}}</div> -->
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
// user: ['张三', '李四', '王五']
user: [{ id: 2, name: '李四' }, { id: 1, name: '张三' }]
// user: { id: 1, name: '张三' }
}
})
</script>
</body>
</html>
3. v-on
3.1 v-on事件
语法:
v-on:事件名=“实现的方法[此方法定义在vue配置中的methods中]”
v-on使用很频繁 @事件名=“方法”
注意:
绑定的方法,它可以写小括号,也可以不写小括号
绑定的方法是可以写在data配置中,但是不建议,data中属性会进行劫持
methods中定义方法不用使用箭头函数,但是在方法体中建议使用箭头函数,用来保持this指向
代码:
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<!--
v-on:事件名="实现的方法[此方法定义在vue配置中的methods中]"
v-on使用很频繁 @事件名="方法"
绑定的方法,它可以写小括号,也可以不写小括号
-->
<h3>{{num}}</h3>
<!-- <button v-on:click="clickFn">点击事件</button> -->
<button @click="clickFn">点击事件</button>
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
// 绑定的方法是可以写在data配置中,但是不建议,data中属性会进行劫持
// clickFn: function () {
// console.log('我是一个点击事件');
// }
num: 100
},
// 注:methods中定义方法不用使用箭头函数,但是在方法体中建议使用箭头函数,用来保持this指向
methods: {
// clickFn: function () {
// console.log('我是一个点击事件');
// }
// 简写
clickFn() {
// var _this = this
setTimeout(() => {
this.num++
console.log('我是一个点击事件');
}, 1000);
}
// 箭头函数 没有作用域,找父级
// clickFn: () => {
// console.log(this);
// this.num++
// console.log('我是一个点击事件');
// }
}
})
</script>
</body>
</html>
3.2 v-on事件对象
概述:
- 绑定的方法,它可以写小括号,也可以不写小括号
- 如果你绑定方法时,没有写小括号,则vue在解析时,会自动给你映射一个event给绑定方法
- 如果你绑定方法时,有写小括号,则需要手动把event对象传过去 e v e n t , event, event,event可以传多个,但是建议只传一个,一般写在第1位或最后1位
代码:
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<h3>{{num}}</h3>
<!-- 如果你绑定方法时,没有写小括号,则vue在解析时,会自动给你映射一个event给绑定方法 -->
<!-- <button @click="clickFn">点击事件</button> -->
<!--
如果你绑定方法时,有写小括号,则需要手动把event对象传过去$event,$event可以传多个,但是建议只传一个,一般写在第1位或最后1位
-->
<button uname="李四" data-uname="张三" @click="clickFn($event)">点击事件</button>
<input type="text" @keyup="onEnter">
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
num: 100
},
methods: {
// event可以用它来完成dom数据的获取
clickFn(evt) {
this.num++
// 自定义的需要使用getAttribute方法,简写(evt.target.name)必须使用标签内置属性
console.log(evt.target.getAttribute('uname'));
console.log(evt.target.dataset.uname)
},
onEnter(evt) {
// 回车键是13
if (evt.keyCode === 13) {
console.log(evt.target.value);
}
}
}
})
</script>
</body>
</html>
4. todolist
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<input placeholder="请输入内容" type="text" @keyup="onEnter">
<hr>
<ul>
<!-- 条件渲染 -->
<li v-if="todos.length===0">无任务</li>
<li v-else v-for="item,index in todos" :key="item.id">
<span>{{item.title}}</span>
<!-- <span @click="del(item.id)">删除</span> -->
<span @click="del(index)">删除</span>
</li>
</ul>
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
todos: []
},
methods: {
onEnter(evt) {
if (evt.keyCode === 13) {
this.todos.push({
// Date.now() 返回自1970年1月1日00:00:00 UTC以来经过的毫秒数
id: Date.now(),
title: evt.target.value.trim()
})
evt.target.value = ''
}
},
// del(id) {
// // 删除
// this.todos = this.todos.filter(item => item.id != id)
// }
del(index) {
// splice 可以用来替换/删除/添加数组内某一个值或几个值,该方法会改变初始数组。
// 删除 它可以使用 vue中提供的变异方法splice来完成,用此方法它会触发视图更新
this.todos.splice(index, 1)
}
}
})
</script>
</body>
</html>
5. 事件修饰符
多个修饰符,通过点来连接操作 用来处理事件的特定行为。
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<!-- 事件修饰符 -->
<!-- <input placeholder="请输入内容" type="text" @keyup.enter="onEnter" > -->
<!-- 多个修饰符,通过点来连接操作 用来处理事件的特定行为 -->
<!-- @keyup.alt.112:alt键+F1键 -->
<input placeholder="请输入内容" type="text" @keyup.alt.112="onEnter" >
<hr>
<ul>
<!-- 条件渲染 -->
<li v-if="todos.length===0">无任务</li>
<li v-else v-for="item,index in todos" :key="item.id">
<!-- once事件只绑定一次 -->
<a @click.prevent.once="showDetail" href="http://www.baidu.com">{{item.title}}</a>
<!-- <span @click="del(item.id)">删除</span> -->
<span @click="del(index)">删除</span>
</li>
</ul>
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
todos: []
},
methods: {
showDetail() {
console.log(1111);
},
onEnter(evt) {
this.todos.push({
id: Date.now(),
title: evt.target.value.trim()
})
evt.target.value = ''
},
// del(id) {
// // 删除
// this.todos = this.todos.filter(item => item.id != id)
// }
del(index) {
// 删除 它可以使用 vue中提供的变异方法splice来完成,用此方法它会触发视图更新
this.todos.splice(index, 1)
}
}
})
</script>
</body>
</html>
6. 动态样式
6.1 class
class样式的动态添加,分为对象和数组方式
注意:
- class和style都属于DOM属性,所以在vue中都用:class和:style表示
- 对象: {key它就是样式名称:布尔值【true生效,false不生效】} – 一般用于开关显示的样式,不太适合添加新的属性样式
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
<style>
.active {
color: red;
}
.font30 {
font-size: 30px;
}
</style>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<!--
class样式的动态添加,对象和数组方式
class和style都属于DOM属性,所以在vue中都用:class和:style表示
对象: {key它就是样式名称:布尔值【true生效,false不生效】} -- 一般用于开关显示的样式,不太适合添加新的属性样式
-->
<!-- <div :class="titleClass">我是一个标题</div>
<button @click="addClass">添加样式</button> -->
<!--
数组:[元素样式名称]
一般对于追加新样式,使用数组
-->
<div :class="titleStyle">我是一个标题</div>
<button @click="addStyle">添加样式</button>
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
titleClass: { active: false },
titleStyle: []
},
methods: {
addClass() {
// 点击切换
// this.titleClass.active = !this.titleClass.active
// this.titleClass.active = true//这里执行的时候会刷新数据,会顺带执行了下一句
// this.titleClass.font30 = true//注意,把上一句注释,只执行这一句的时候,样式不会生效,因为这里是是新加的属性,并没有被劫持
// console.log(this.$data);
// Vue方法
// 动态给对象添加成员属性(Vue中的方法)
// this.$set(this.titleClass, 'font30', true)
// let obj = Object.assign(参数1地址和返回值地址是同一个地址)
},
addStyle() {
// 给数组添加元素,元素就是样式名称,这样它会就追加样式
// push unshift shift pop splice sort reverse 调用时都会让视图更新
this.titleStyle.push('active')
this.titleStyle.push('font30')
}
}
})
</script>
</body>
</html>
6.2 style
style样式的动态添加,分为对象和数组方式。
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<!--
style样式的动态添加,对象和数组方式
-->
<!--
对象
-->
<div :style="{color:'blue',fontSize:'30px'}">我是一个标题</div>
<!--
数组
-->
<div :style="[{color:'blue'},{fontSize:'30px'}]">我是一个标题</div>
<!-- <button @click="addStyle">添加样式</button> -->
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
},
methods: {
}
})
</script>
</body>
</html>
7. input表单
概述:
在没有使用v-model指令时,来通过data数据控制表单项中的值,还是麻烦的,绑定属性和事件来完成 – 受控组件
v-model它是一个语法糖,value和事件的综合体
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<div>
<input type="text" v-model="username">
</div>
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
username: ''
},
// methods: {
// setUsername(evt) {
// this.username = evt.target.value.trim()
// }
// }
})
</script>
</body>
</html>
8. v-model修饰
<!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>vue学习使用</title>
<!-- 第1步: 引入vue库文件 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- 第2步:挂载点 -->
<div id="app">
<!-- v-model修饰符 -->
<!-- 延时更新数据源中的数据 光标移开才会改变数据 -->
<!-- <input v-model.lazy="title"> -->
<!-- 去空格 trim -->
<!-- <input v-model.trim="title"> -->
<!-- 转为数值 number -->
<input type="number" v-model.number="n1">
+
<input type="number" v-model.number="n2">
= {{n1+n2}}
</div>
<!-- 第3步:实例化vue -->
<script>
const vm = new Vue({
el: '#app',
data: {
title: '',
n1: 1,
n2: 2
}
})
</script>
</body>
</html>