Web网络开发 -- Vue2基础语法,属性和生命周期
引入
什么是Vue
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
Vue2官方教程
Vue3官方教程
设计模式
MVVM设计模式
M Model 模型层
VM ViewModel 中间件
V View 视图层
导入Vue.js
<script src="js/vue.min.js"></script>
min是生产环境,建议使用,不带min是开发环境,会显示错误日志
创建容器
<div class="app">...
</div>
创建vue2实例对象
<script>const app = new Vue({el: '#app',data: {message: 'Hello World!',num: 1}})
</script>
一个实例对象只能挂载在一个元素身上,一个元素只能被一个实例对象挂载,这是一对一的关系
如果一个元素被多个实例对象挂载,挂载由上到下,最下面的才会生效
绑定元素
// 方式一 el绑定
new Vue({el: '#app',data: {tag: '<h1>这是解析标签的</h1>'}
})
// 方式二 创建实例对象时赋值
var app = new Vue({el: '#app',data: {tag: '<h1>这是解析标签的</h1>'}
})
app.$mount('#app')
// 方式三 创建实例对象时直接绑定
new Vue({el: '#app',data: {tag: '<h1>这是解析标签的</h1>'}
}).$mount('#app')
基础语法
插值语法
可以用{{}}
来在html中显示变量
<div id="app"><h1>{{ message }}</h1><h2>{{ num + 1 }}</h2><p>{{num >= 10?"ture":"false" }}</p>
</div>
渲染解析html标签
可以使用v-text
/v-html
属性来将某些文字/html标签渲染到容器中,这里将vue实例对象中的tag值渲染到id为"app"的容器中
<div id="app" v-html="tag"></div>
<script>var app = new Vue({el: '#app',data: {tag: '<h1>这是解析标签的</h1>'}})
</script>
v-html
会覆盖元素中已有的内容,并替换为tag
中的内容
隐藏html标签
可以使用v-if
/v-show
属性来隐藏容器中指定的html标签
<div id="app"><div v-if="isShow">这是元素1</div> <!-- 通过删除和创建节点来实现隐藏,适用于一次性弹窗场景 --><div v-show="isShow">这是元素2</div> <!-- 通过CSS属性来实现隐藏,适用于导航栏下拉菜单等多次使用的场景 -->
</div>
<script>var app = new Vue({el: '#app',data: {tag: '<h1>这是解析标签的</h1>',isShow: true,}})
</script>
v-if
和v-show
都可以实现隐藏元素,区别是前者通过删除和创建节点来实现隐藏,适用于一次性弹窗场景;后者通过元素的display
CSS属性来实现隐藏,适用于导航栏下拉菜单等多次使用的场景.后者可以节约资源避免反复删除创建元素带来的性能损耗
单向绑定和双向绑定
v-bind:value
属性用于实现单向绑定,可以简写为:value
,其只能由data中的变量的内容单向输出到输入框中,修改输入框的内容不会影响到data中的数据,适用于只展示数据的情况
v-model:value
属性用于实现双向绑定,可以简写为v-model
,其data中的变量和输入框双方,修改一方另一方也会同步修改,适用于与数据进行交互的情况,只适用于输入框输入
<div id="app"><span> {{num}} </span><input type="text" v-bind:value="num"> <!-- 单向绑定 --><input type="text" v-model:value="num"> <!-- 双向绑定 --><input type="text" :value="info"> <!-- 单向绑定简写 --><input type="text" v-model="info"> <!-- 双向绑定简写 --></div>
<script>var app = new Vue({el: '#app',data: {// 这里可以定义变量num: 80,info:"这是一个例子"}})
</script>
绑定网页和图片
v-bind
属性也可用于绑定网页或图片等,例如v-bind:href
(简写为:href
)、v-bind:src
(简写为:src
)等
<div id="app"><a v-bind:href="web.url" target="_blank">{{web.title}}</a> <!-- 绑定网页 --><a :href="web.url" target="_blank">{{web.title}}</a> <!-- 绑定网页简写 --><img :src="'https://www.baidu.com/img/flexible/logo/pc/result.png'" alt="百度logo"> <!-- 图片绑定 --><img :src="bd" alt="百度logo"> <!-- 图片绑定 -->
</div>
<script>var app = new Vue({el: '#app',data: {web:{url: "https://www.baidu.com",title: "百度一下,你就知道",},bd: 'https://www.baidu.com/img/flexible/logo/pc/result.png',},},})
</script>
事件对象 Event
$event
可以调用当前事件的详细信息,通过函数传参到方法中
<div id="app"><span> {{num}} </span><button v-on:click="fn($event)">点我</button><button @click="fn($event)">点我</button>
</div>
<script>var app = new Vue({el: '#app',data: {// 这里可以定义变量num: 80,},methods: {// 这里可以定义方法fn(e){console.log(e); // 打印事件对象console.log('点击了',this.num);this.num += 10; // 每次点击按钮num加10}}})
</script>
点击事件
v-on:click
用于给元素绑定点击事件,也可以简写为@click
<div id="app"><span> {{num}} </span><button v-on:click="num++">点我+1</button><button @click="num--">点我-1</button>
</div>
<script>var app = new Vue({el: '#app',data: {num: 80,}})
</script>
常见其他事件类型
-
鼠标经过
v-on:mouseover
或@mouseover
v-on
绑定事件 -
阻止某个标签的默认事件
v-on:click="$event.preventDefault"
或@click.prevent
-
点击弹窗
@click="alert('弹窗')"
-
事件只执行一次
@click.once="fn"
-
阻止事件冒泡执行
@click.stop="fn"
冒泡就是一大一小两个框重叠,且都绑定事件,点击相同区域会同时执行两个事件
- 按下按键触发事件
@keydown="getVaule($event)"
- 按下指定按键(例如回车键)触发事件
@keydown.Enter="getVaule($event)"
<div id="app"><span> {{num}} </span><button @click="num--">点我-1</button><button @mouseover="num+=3">鼠标经过</button><button @click="add(5)">按钮</button><!-- 阻止默认事件--><a href="https://www.baidu.com" @click.prevent>百度一下</a><!-- 事件只执行一次 --><button @click.once="showBox">点击一次</button><!-- 阻止事件冒泡执行 --><div class="big" @click="show1"><div class="small" @click.stop="show2"></div></div></div>
<script>new Vue({data: {// 这里可以定义变量num: 80,},methods: {// 这里可以定义方法add(n) {console.log(n); // 打印传入的参数nthis.num += n; // 每次点击按钮num加n},showBox() {alert('弹窗');},show1() {alert('大盒子');},show2() {alert('小盒子');},}}).$mount('#app'); // 挂载到#app元素上console.log(app); //在控制台中打印vue的详细信息
</script>
在Vue.js中,
.stop
是一个事件修饰符,它的作用是调用event.stopPropagation()
,阻止事件冒泡如果没有
.stop
修饰符,点击内层div时,事件会冒泡到外层div,导致两个事件都会被触发加上
.stop
后,点击内层div只会触发show2,不会触发外层的show1
在控制台输出vue2实例对象的详细信息
<script>console.log(app);
</script>
多级条件判断
v-if
不止可以显示单一条件判断,也可以多级判断
<div id="app"><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>
</div>
<script>var app = new Vue({el: '#app',data: {score: 80,}})
</script>
列表循环
可以使用v-for
对数组进行遍历,其中item
是数组(列表)中的一项,index
是数组(列表)的索引
index
可以省略不写
<div id="app"><ul><li v-for="(item,index) in arr">{{index}} - {{item.name}} - {{item.age}}</li></ul><ul><li v-for="item in arr2"> //index可以省略不写{{item}}</li></ul>
</div>
<script>new Vue({data: {arr: [{ name: '张三', age: 18 },{ name: '李四', age: 20 },{ name: '王五', age: 22 }],arr2: ['red','orange','blue']},}).$mount('#app');
</script>
Vue2定义实例对象
<script>const app = new Vue({data:{...},methods:{...},computed:{...},watch:{...},c...}.$mount("#app")
</script>
- data:{} 定义变量,用于存储实例对象的数据
- methods:{} 定义方法,用于存储实例对象的方法
- computed:{} 定义监听(计算)属性,用于响应式数据计算和结果缓存
- watch:{} 定义观察属性,用于观察数据的前后变化
计算数据和计算属性的应用
方法一: 通过自定义方法并绑定到指定按钮上实现计算
方法二: 通过计算属性实现响应式计算,实时计算并显示
<div id="app"><input type="text" v-model="num1"><input type="text" v-model="num2"><button @click="add()">求和</button><p>结果: {{count}} </p> <!-- 方法一 --><p>结果: {{he}} </p> <!-- 方法二 -->
</div>
<script>const app = new Vue({data:{num1: 0,num2: 0,count: 0,},methods:{// 方法一add() {// 将输入的字符串转换为数字const n1 = parseFloat(this.num1);const n2 = parseFloat(this.num2);// 计算和this.count = n1 + n2;}},computed:{// 计算属性// 方法二he(){return Number(this.num1) + +this.num2;}}}).$mount('#app');console.log(app);
</script>
观察属性
用于观察数据的前后变化
<div id="app"><input type="text" v-model="num1">
</div>
<script>const app = new Vue({data:{num1: 0,},watch:{num1:{handler(newVal, oldVal) {console.log(`num1 changed from ${oldVal} to ${newVal}`);},}}}).$mount('#app');console.log(app);
</script>
Vue2生命周期
Vue 的生命周期是指组件从创建到销毁的整个过程,包括初始化数据、编译模板、挂载 DOM、更新 DOM 和卸载等阶段。在这些阶段中,Vue 提供了一系列的生命周期钩子函数,允许开发者在特定时机运行自定义代码。
Vue 的生命周期分为四个主要阶段,每个阶段都有对应的钩子函数:
- 创建阶段: beforeCreate:实例初始化后调用,此时数据和 DOM 尚未初始化。 created:实例创建完成后调用,此时数据已初始化,但 DOM 尚未挂载。
- 挂载阶段: beforeMount:挂载开始前调用,此时模板已编译,但 DOM 尚未渲染。 mounted:挂载完成后调用,此时 DOM 已渲染,可以进行 DOM 操作。
- 更新阶段: beforeUpdate:数据更新后、DOM 更新前调用,可用于访问更新前的 DOM。 updated:数据更新后调用,此时 DOM 已完成更新。
- 销毁阶段: beforeDestroy:实例销毁前调用,可用于清理定时器或事件监听器。 destroyed:实例销毁后调用,此时所有事件和子实例均已移除。
<script>new Vue({data:{num: 10,},methods:{},computed:{},watch:{num:{handler(newValue, oldValue){ },},},// Vue的四个生命周期和八个钩子函数beforeCreate(){}, //创建之前created(){}, //创建beforeMount(){}, //挂载之前mounted(){}, //挂载beforeUpdate(){}, //更新之前updated(){}, //更新beforeDestroy(){}, //销毁之前destroyed(){}, //销毁})
</script>