一. 指令
补充Vue(一)里面没有写完的属性
1. v-on: 监听 DOM 事件
绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
格式
-
v-on:事件名字.修饰符
-
:事件名
:页面加载完成,直接触发当前事件,只运行一次 -
@事件名
:简写
修饰符:(一小部分)
-
left
- (2.2.0) 只当点击鼠标左键时触发 -
right
- (2.2.0) 只当点击鼠标右键时触发 -
once
- 只触发一次回调。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 引入vue -->
<script src="js/vue.global.js"></script>
</head>
<body>
<div id="app">
<button @click="add()">按钮</button>
<button @click.once="yici()">一次</button>
<button @click.left="left()">左键</button>
<button @click.right="right()">右键</button>
</div>
<script>
// 创建vue实例
const app = Vue.createApp({
methods:{ //methods是一个属性用来声明函数(方法) 函数在声明的时候一般只使用第一种
// 函数的声明 一
add(){
alert("这是一个按钮")
},
yici(){
alert("不管点几次只出现一次");
},
left(){
alert("左键出现");
},
right(){
alert("右键出现");
}
}
});
// 将vue实例挂载到div id=app 上面
// 如果不挂载 试图不会显示
// app.mount("#app");
const vm = app.mount("#app")
</script>
</body>
</html>
2. v-on img: 点击切换图片
使用v-on监听事件完成图片轮播操作
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 引入vue -->
<script src="js/vue.global.js"></script>
</head>
<body>
<div id="app">
<img :src="imgs[index]" width="300px" height="300px"/>
<button @click="myimg()">切换</button>
</div>
<script>
// 创建vue实例
const app = Vue.createApp({
data() {
return{
imgs: ["img/1.png","img/2.png","img/3.png"],
index:0,
}
},
methods:{
myimg(){
/**
* 点击切换按钮的时候进行判断 如果 index 大于图片大于等于图片张数则赋值为0
* 重新从第一种图片开始
*/
if(this.index>=this.imgs.length-1){
this.index=0;
}else{
// 如果index的值不大于等于所拥有的图片 则加一 播放下一张
this.index++;
}
}
}
});
// 将vue实例挂载到div id=app 上面
// 如果不挂载 试图不会显示
// app.mount("#app");
const vm = app.mount("#app")
</script>
</body>
</html>
3. 样式绑定
绑定多个.class样式
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 引入vue -->
<script src="js/vue.global.js"></script>
<style>
.myclass1{
color: aqua;
}
.myclass2{
background-color: black;
}
</style>
</head>
<body>
<div id="app">
<div :class="[aaa,bbb]">只是一个测试</div>
</div>
<script>
// 创建vue实例
const app = Vue.createApp({
data() {
return{
aaa:'myclass1',
bbb:'myclass2'
}
}
});
// 将vue实例挂载到div id=app 上面
// 如果不挂载 试图不会显示
// app.mount("#app");
const vm = app.mount("#app")
</script>
</body>
</html>
4. v-moduel 表单绑定
在前端处理表单时,我们常常需要将表单输入框的内容同步给 JavaScript 中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦。v-model 指令在表单 、
及 `` 等元素上创建双向数据绑定。
v-model 会根据控件类型自动选取正确的方法来更新元素。
v-model 会忽略所有表单元素的 value、checked、selected 属性的初始值,使用的是 data 选项中声明初始值。
v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:
-
text 和 textarea 元素使用
value
属性和input
事件; -
checkbox 和 radio 使用
checked
属性和change
事件; -
select 字段将
value
作为属性并将change
作为事件。
<!DOCTYPE html>
<html>
<!-- 双向绑定 -->
<head>
<meta charset="utf-8" />
<title></title>
<!-- 引入vue -->
<script src="js/vue.global.js"></script>
</head>
<body>
<div id="app">
<input v-model="msg" placeholder="编辑我……"><br>
{{msg}}<br><br><br>
性别:<input type="radio" name="sex" value="男" v-model="sex" >男
<input type="radio" name="sex" value="女" v-model="sex">女<br>
选中的性别:{{sex}}<br><br><br>
兴趣爱好:
<input type="checkbox" name="inter" value="吃饭" v-model="inters" >吃饭
<input type="checkbox" name="inter" value="睡觉" v-model="inters">睡觉
<input type="checkbox" name="inter" value="钓鱼" v-model="inters" >钓鱼
<input type="checkbox" name="inter" value="跳舞" v-model="inters" >跳舞<br>
兴趣爱好:{{inters}}<br><br><br>
下拉框:
<select v-model="xueli">
<!-- option没有设置value属性的时候 默认值 是标签中间的值-->
<!-- 设置值了 设置的是什么就是什么-->
<!-- 下拉框选中的是value的值-->
<option value="0">吃饭</option>
<option value="1">睡觉</option>
<option value="2">打篮球</option>
</select>
<br>
选中的下拉框的值是:{{xueli}}<br><br><br>
多选下拉框:
<select v-model="wangzhan" multiple>
<option value="www.runoob.com">Runoob</option>
<option value="www.google.com">Google</option>
<option value="www.taobao.com">Taobao</option>
</select>
<br>
选中的下拉框的值是:{{wangzhan}}<br><br><br>
多行文本框:<br>
<textarea v-model="content"></textarea>
<br />
{{content}}
</div>
<script>
//创建vue实例
const app = Vue.createApp({
data(){
return{
msg:"dys",
sex:"女",
inters:["吃饭"],
xueli:"",
wangzhan:[],
content:"我是dys"
}
}
});
// 将vue实例挂载到id=app上面
// 如果不挂载 视图内容不会显示
app.mount("#app");
</script>
</body>
</html>
二. 属性
1. 计算属性 computed
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.global.js"></script>
</head>
<body>
<div id="app">
年龄: {{getAge()}}
性别: {{sex}}
</div>
<script>
const app = Vue.createApp({
data() {
return{
idcard:"410727198802103418"
}
},
methods:{
getAge(){
// 当前年份 - 出生的年份 每次运行都需要重新运行
// 获取到当前年份
let now = new Date().getFullYear();
// 截取身份证的年份
let birthyear=this.idcard.substr(6,4);
// 当前年份减去身份证年份 获取到年龄
let age = now-birthyear;
alert(age);
return age;
}
},computed:{
/**
* 计算属性
* 只要身份证不发生变化 性别就不会重新计算 提高效率
*/
sex(){
let sex = this.idcard.substr(16,1);
return sex%2==1?"男":"女";
}
}
})
const vm = app.mount("#app")
</script>
</body>
</html>
2. 监听属性 watch
监听属性,用来监听数据的变化,绑定数据变化时的相关操作
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.global.js"></script>
</head>
<body>
<div id="app">
千米: <input type="text" v-model="kilometers"/>
米: <input type="text" v-model="meters"/>
</div>
<script>
const app = Vue.createApp({
data() {
return{
kilometers:"1",
meters:"1000"
}
},
watch:{
// 设置 米 跟随 千米 变化而变化
kilometers(val1,val2){
this.meters=val1*1000;
},
// 设置 千米 跟随 米 变化而变化
meters(val1,val2){
this.kilometers=val1/1000;
}
}
})
const vm = app.mount("#app")
</script>
</body>
</html>
3.区别
-
计算属性是用来解决模板语法冗余的, 侦听器是用来侦听data中某一数据的变化(功能不同)
-
计算属性有缓存机制, 侦听器没有
-
计算属性不支持异步操作, 侦听器支持
-
计算属性可以给vue新增属性, 侦听器必须是data中已有的属性
-
计算属性只要使用了就会立即执行一次, 侦听器默认只有当数据第一次改变才会执行, 需要设置immediate属性来控制是否立即执行一次
三. Vue组件
1.根组件
一旦写了在 createApp 中传入了 template 则就构成了当前应用的根组件 (告诉 vue 如何去渲染根组件相关页面)
不声明template,默认使用挂载点作为根组
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 引入vue -->
<script src="js/vue.global.js"></script>
</head>
<body>
<div id="app"></div>
<script>
//创建vue实例
const app = Vue.createApp({
// 根组件
// createApp 的时候 template 成为根组件 无需调用即可显示到界面中
template:"<h1>DYS------</h1>"
});
// 将vue实例挂载到id=app上面
// 如果不挂载 视图内容不会显示
app.mount("#app");
</script>
</body>
</html>
2.全局组件
1.注册多个全局组件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 引入vue -->
<script src="js/vue.global.js"></script>
<!-- <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> -->
</head>
<body>
<div id="app">
<my-com></my-com>
<my-com2></my-com2>
</div>
<script>
//创建vue实例
const app = Vue.createApp({
});
/**
* 注册全局组件
* vue对象.component("组件名字",{具体内容})
*/
// 第一个全局组件
app.component("my-com",{
template:"<h1>DYS~~~~~~</h1>"
})
// 第二个全局组件
app.component("my-com2",{
template:"<h1>AaAaAaAaA</h1>"
})
// 将vue实例挂载到id=app上面
// 如果不挂载 视图内容不会显示
app.mount("#app");
</script>
</body>
</html>
2.组件的复用性
即同一个组件有点像 api , 它是可以被重复用的, 和小工具一样, 而且互相之间是隔开的, 举个栗子如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!-- 引入vue -->
<script src="js/vue.global.js"></script>
<!-- <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> -->
</head>
<body>
<div id="app">
<!-- 组件可重复调用并别之间互不影响< -->
<my-btn></my-btn>
<my-btn></my-btn>
<my-btn></my-btn>
</div>
<script>
//创建vue实例
const app = Vue.createApp({
});
app.component("my-btn",{
data(){
return{
count:1
}
},
template:'<div @click="count += 1">按钮:{{count}}</div>'
})
// 将vue实例挂载到id=app上面
// 如果不挂载 视图内容不会显示
app.mount("#app");
</script>
</body>
</html>
缺点
只要通过 app.component ( ) 注册的组件即为全局的, 在任何地方都能用, 很方便. 但同时也会一直挂载在 app 上, 则会占用其资源, 性能也是有很多损耗
3.局部组件
与全局组件相比是相对的, 要注册后才会挂载, 在实际工作中基本都是局部组件的方式来拆分功能。 从代码来看, 自定义一个局部组件就是一个对象而已。然后通过在父组件中进行注册 (component) 即可使用。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.global.js"></script>
</head>
<body>
<div id="app">
<my-jubu></my-jubu>
<my-jubu2></my-jubu2>
</div>
<script>
const app = Vue.createApp({
components:{
"my-jubu":{
template:"<h1>DYS</h1>"
},
"my-jubu2":{
template:"<h1>DYS2</h1>"
}
}
})
const vm = app.mount("#app")
</script>
</body>
</html>