1.Vue入门
1.1 插值表达式{{ xxx }}
1.2 vue.js引用:
①下载后本地引用;
②引用在线js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>入门案例</title>
</head>
<body>
<div id="app">
<!-- 插值表达式 {{}} -->
<h1>{{hello}}</h1>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app=new Vue({
el:("#app"),
data:{
hello:"测试"
}
});
</script>
</body>
</html>
2 常用指令
2.1 v-cloak指令
设置隐藏样式,在解析对应的数据前隐藏为编译的标签格式“{{xxx}}”
2.2 v-text 指令
直接展示解析后的数据
2.3 v-html指令
可解析并展示带有html标签的内容
2.4 v-pre指令
跳过解析,可在页面直接显示“{{xxx}}”
2.5 v-once指令
配置该标签只解析一次,即使后续对应的该值改变,页面数据不变
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>指令练习</title>
<style>
[v-cloak]{
display: none;
}
</style>
</head>
<body>
<div id="app" >
测试1:测试v-cloak指令
<h1 v-cloak>{{msg}}</h1>
<hr>
测试2:测试v-text指令
<h2 v-text="msg"></h2>
<hr>
测试3:测试v-html指令<br>
<span v-html="html"></span>
<hr>
测试4:测试v-pre指令:展现{{msg}},不需要vue解析;v-pre直接跳过配置了该指令的表达式<br>
<span v-pre >{{msg}}</span>
<hr>
测试5:测试v-once指令 元素只解析一次,之后用户随意修改,数据不变<br>
<span v-once >{{one}}</span>
</div>
<script src="../js/vue.js">
</script>
<script>
//sleep(1000);
let app = new Vue({
el: "#app",
data: {
msg: "测试数据",
html: '<h3>测试html语法</h3>',
one:'只加载一次'
}
})
</script>
</body>
</html>
3 数据双向绑定
3.1 v-model:只能标记可以编辑的标签;输入框以及vue属性两者任一变化另一个跟着变化,数据和页面两者同步修改
<body>
<div id="app">
<!-- v-model:只能标记可以编辑的标签 输入框以及vue属性两者任一变化另一个跟着变化
数据和页面两者同步修改
-->
数据录入:<input type="text" v-model="msg" />
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
const app=new Vue({
el: "#app",
data: {
msg: '测试数据'
}
})
</script>
</body>
4 常用事件
4.1 点击事件v-on:click
4.1.1 可直接配置事件操作内容
4.1.2 可简化操作v-on用@代替
4.1.3 配置方法时间,在methods中增加相关方法,在没有参数时可省略参数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
数值:{{num}}
<!-- 1.1 直接编辑操作内容 -->
<button v-on:click="num++">增加1</button>
<!-- 1.2 v-on:简化操作@ -->
<button @click="num--">减少1</button>
<!-- 1.3 -->
<button @click="addNum">增加1</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app=new Vue({
el: "#app",
data: {
num: 1
},
methods: {
/* addNum: function(){
alert(111)
} */
//省略写法
addNum(){
this.num++;
}
}
})
</script>
</body>
</html>
4.2 事件修饰符
4.2.1 stop 阻止事件冒泡
事件冒泡:由于嵌套关系,先执行内部事件,如果执行成功,则事件冒泡给外层事件
4.2.2 prevent 阻止默认事件
form表单的action提交,a标签的跳转
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
数值:{{num}}
<!--1. stop 阻止事件冒泡
事件冒泡:由于嵌套关系,先执行内部事件,如果执行成功,则事件冒泡给外层事件-->
<div @click="addNum1">
<button @click="addNum2">增加2</button>
<button @click.stop="addNum2">增加1</button>
</div>
<!-- 2.prevent 阻止默认事件 -->
<a href="http://www.baidu.com" @click.prevent="btnA">百度</a>
<div>
<form></form>
</div>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
num: 1
},
methods: {
addNum1() {
this.num++;
},
addNum2() {
this.num++;
}
}
})
</script>
</body>
</html>
5.常用属性
5.1 v-model属性
1.number 将用户输入变为数字类型
2.trim 去除开头和结尾的空格,字符串中间的空格不能去除
3.lazy 懒加载,当input中控件失去焦点时再触发,–防止重复交互刷新
5.2 计算属性
- 计算属性如果调用多次,则有缓存机制,只计算一次
- 方法如果调用多次,则每次都要重新执行方法
页面涉及多次调用并需要计算时使用计算属性
<body>
<div id="app">
<form>
姓名:<input type="text" v-model="user.username"/><br />
详情:<textarea v-model="user.info"></textarea><br />
城市:<select name="city" v-model="user.city" multiple="multiple">
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="成都">成都</option>
</select><br />
性别:<input type="radio" name="sex" value="男" v-model="user.gender"/>男<input type="radio" name="sex" v-model="user.gender" value="女"/>女<br />
</form>
<!-- 1.number 将用户输入变为数字类型
2.trim 去除开头和结尾的空格
3.lazy 懒加载,当input中控件失去焦点时再触发,--防止重复交互刷新
-->
<div>
<input type="text" v-model.number="num" /><button @click="num+=10">增加10</button><br>
<input type="text" v-model="name" />获取name长度{{name.length}}<br>
<input type="text" v-model.trim="name1" />获取name长度{{name1.length}}<br>
<input type="text" v-model.lazy="user.username" />观察响应{{user.username}}
</div>
<!--
1. 计算属性如果调用多次,则有缓存机制,只计算一次
2. 方法如果调用多次,则每次都要重新执行方法
如果涉及
-->
<div>
用户输入:<input type="text" v-model="user.msg" /><br>
数据展示:{{user.msg.split('')}}<br>
数据展示:{{user.msg.split('').reverse()}}<br>
数据展示:{{user.msg.split('').reverse().join('|')}}<br>
数据展示:{{user.msg.split('').reverse().join('')}}<br>
计算属性:{{reverse}}{{reverse}}{{reverse}}<br>
{{reverseMe()}}{{reverseMe()}}{{reverseMe()}}
</div>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
user: {
username: '',
info: '',
city: ['上海','北京'],
gender: '男',
msg: ''
},
num: '',
name: '',
name1: ''
},
computed:{
reverse(){
console.log('计算属性执行');
return this.user.msg.split('').reverse().join('')
}
},
methods:{
reverseMe(){
console.log('方法执行');
return this.user.msg.split('').reverse().join('')
}
}
})
</script>
</body>
6 分支循环
6.1 分支
v-if 可以单独编辑使用 v-else/v-else-if 不可以单独使用必须和v-if联用
<body>
<div id="app">
分数:<input type="text" v-model="score" /><br>
<div v-if="score>=90">优秀</div>
<div v-else-if="score>=80">良好</div>
<div v-else-if="score>=70">中等</div>
<div v-else-if="score>=60">及格</div>
<div v-else>你是最棒的</div>
<!-- v-if 可以单独编辑使用
v-else/v-else-if 不可以单独使用必须和v-if联用-->
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
score: '0'
}
})
</script>
</body>
6.2 循环结构
问题:什么样的数据需要使用循环1.数组 2.对象
语法:v-for 遍历展现的是标签
遍历对象时 直接遍历对象,则展现value的值 如:“value in user”
(value,key,index) in user 分别代表对象的 属性值:属性名:下标位置 从0开始
<body>
<div id="app">
<!-- 问题:什么样的数据需要使用循环1.数组 2.对象
语法:v-for 遍历展现的是标签
-->
<h1>循环遍历数组</h1>
<p v-for="item in hobby" v-text="item"></p>
<div v-for="i in hobby"> {{i}}</div>
<hr />
<h1>遍历对象</h1>
<!-- 直接遍历对象,则展现value的值
(value,key,index) in user 分别代表对象的
-->
<div v-for="(value,key,index) in user">
<span v-text="key"></span>:<span v-text="value"></span>:<span v-text="index"></span>
</div>
<hr />
<div v-for="(j,i,index) in user">
<span v-text="i"></span>:<span v-text="j"></span>:<span v-text="index"></span>
</div>
<div v-for="user in userlist" >
<span v-text="user.id"></span>:<span v-text="user.name"></span>
</div>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
hobby: ['电脑','手机','平板'],
user: {
id: 100,
name: 'tomcat猫'
},
userlist: [
{id: 200,name: 'tomcat猫1'},
{id: 300,name: 'tomcat猫2'},
{id: 400,name: 'tomcat猫5'}
]
}
})
</script>
</body>
7 生命周期函数
beforeCreate()、created()、beforeMount()、mounted()、beforeUpdate()、updated()、beforeDestroy()、destroyed()
一般不适用before函数
<body>
<div id="app">
<h3 v-text="msg"></h3>
<button @click="destroy">销毁</button>
</div>
<!--引入js函数类库 -->
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el : "#app",
data : {
msg: "vue生命周期"
},
//在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
beforeCreate(){
console.log("beforeCreate")
},
//在实例创建完成后被立即调用
created(){
console.log("created")
},
//在挂载开始之前被调用:相关的 render 函数首次被调用。
beforeMount(){
console.log("beforeMount")
},
//实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了。
mounted(){
console.log("mounted")
},
//数据更新时调用,发生在虚拟 DOM 打补丁之前
beforeUpdate(){
console.log("beforeUpdate")
},
//由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
updated(){
console.log("updated")
},
//实例销毁之前调用。在这一步,实例仍然完全可用
beforeDestroy(){
console.log("beforeDestroy")
},
//实例销毁后调用。
destroyed(){
console.log("destroyed")
},
methods:{
destroy(){
this.$destroy()
}
}
})
</script>
</body>
8 数组用法
数组相关用法 队列/栈 push 压栈 pop 弹栈
push() 在最后追加元素
pop() 从最后删除元素
shift() 从开头删除元素 出现笔试题
unshift() 从开头追加元素
splice() 替换数据
sort() 排序按照字符编码编码顺序排列
reverse() 数组反转
<body>
<div id="app">
<!-- 数组相关用法 队列/栈 push 压栈 pop 弹栈
push() 在最后追加元素
pop() 从最后删除元素
shift() 从开头删除元素 出现笔试题
unshift() 从开头追加元素
splice() 替换数据
sort() 排序按照字符编码编码顺序排列
reverse() 数组反转
-->
<!-- 对数据进行循环遍历-->
<span v-for="item in array">{{item}},</span><br>
追加数据: <input type="text" v-model.number="num"/>
<button @click="push">push</button><br>
<button @click="pop">pop</button>
<button @click="shift">shift</button>
<button @click="splice1">替换第一个元素</button>
<button @click="splice2">将前3个数据改为num</button>
<button @click="splice3">将前3个数据改为num,num,num</button>
<button @click="splice4">删除第2个数据</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<script>
const app = new Vue({
el: '#app',
data: {
array: [1,2,3,4,5],
num: ''
},
methods: {
push(){
this.array.push(this.num)
},
pop(){
this.array.pop()
},
shift(){
this.array.shift()
},
splice1(){
/* arg1: 操作数据的起始位置 下标从0开始
arg2: 操作的数量
arg3: 替换后的值 可以有多个值
案例1:替换第一个元素
*/
this.array.splice(0,1,this.num)
},
splice2(){
//将前3个数据改为num
this.array.splice(0,3,this.num)
},
splice3(){
//将前3个数据改为num,num,num
this.array.splice(0,3,this.num,this.num,this.num)
},
splice4(){
//删除第2个数据 隐藏功能
this.array.splice(1,1)
}
}
})
</script>
</body>