1.生命周期
每个vue实例在被创建时都要经过一系列的初始化过程,例如需要设置数据监听、编译模版、将实例挂载到DOM并在数据变化时更新DOM等,称为Vue实例的生命周期
2.使用生命周期钩子
在vue实例的生命周期过程中会运行一些叫做生命周期钩子的函数,这给用户在不同阶段添加自己代码的机会。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>购物车</title>
<script src="vue.js"></script>
<style>
.active{
background-color: #ddd;
}
</style>
</head>
<body>
<!-- 宿主文件 -->
<!-- {{ mustache }}是一个动态的值 左右就用双括号{{}}-->
<!-- 插值文本 -->
<!-- v-once执行一次性插值 之后值变了动态值不变 -->
<div id= "app">
<h2 :title="title">
{{ title }}
</h2>
<!-- 用户输入 -->
<!-- 键盘按下事件v-on:keydown -->
<p><input type="text" v-model = "course" v-on:keydown.enter = "addCourse">{{course}}</p>
<button @click = "addCourse">新增</button>
<!-- 条件渲染 -->
<!-- v-if 和 v-for最好不要放在一个标签上他们有优先级的不同会争抢 -->
<p v-if = "courses.length == 0 ">没有任何课程信息</p>
<div class="course-list" v-else>
<div
v-for="c in courses"
:key="c"
:class = "{active: selectedCourse === c}"
@click = "selectedCourse = c">
{{ c }}
</div>
<!-- 商品总数 -->
<p>
<!-- 表达式 -->
<!-- 课程总数:{{courses.length+'门'}} -->
<!-- 监听器 -->
课程总数:{{totalCount}}
</p>
</div>
<!-- 列表渲染 -->
<!-- 被选中点击一个动态的类 没有被选中类被移除掉-->
<!-- transparent 没有颜色透明色 -->
<!-- <div
v-for="c in courses"
:key="c"
:style = "{backgroundColor: selectedCourse === c ? '#' : 'transparent'}"
@click = "selectedCourse = c">
{{ c }}
</div> -->
<script>
// 模拟异步数据调用
function getCourses(){
return new Promise(resolve =>{
setTimeout(() => {
resolve(['web全栈','web高级'])
})
})
}
// 1.创建vue实例
// 保存vue实例
const app = new Vue({
// 交代宿主是谁
el:"#app",
data: {
title: '课程:',
course:"",
selectedCourse:'',
// courses:[],
courses:["黄帝内经","仲景心法","针灸","伤寒","金匮"],
totalCount:0,
},
methods: {
addCourse() {
// 1.添加course到数组
this.courses.push(this.course)
// 2.清空course
this.course = ""
}
},
// 异步用async await
// 创建钩子
async created(){
// created执行时刻,组件实例已创建,由于未挂载dom不存在
const courses = await getCourses()
this.courses = courses
},
// mounted获取业务数据
// mounted时间点更靠后,除了创建之后还做了挂载,获取业务数据
// 挂载的实际操作是将前面所有的渲染函数执行之后将虚拟DOM转换为真实DOM
// 也就是在mounted中可以访问到DOM元素了
// 其实vue实例被创建,挂载,渲染函数执行虚拟DOM转换为真实DOM都是很快的
// 异步数据获取选择mounted和created本质上没有什么差别
// 不用以为看到created界面会比较早 没有这个区别
// 因为我们访问数据所花销的时间远远大于初始化挂载的时间,没有什么实质上的区别
// mounted(){},
// computed是值变化了返回值
computed: {
total() {
// 计算属性是有缓存性的,如果值没有发生变化,则页面不会重新渲染
return this.courses.length+'门'
}
},
// watch 做某个值得监控,如果发生变化了则会执行这个函数做我想做的事情
// watch是值变化了执行这个函数
// 监控courses这个值的变化
// watch如果不加特别声明表示值变化之后才会执行,它一开始是不会执行的
// 默认情况下watch初始化时不执行想要watch立即执行 immediate为true。立即执行一次
// watch: {
// courses(newValue, oldValue) {
// this.totalCount = newValue.length +"门"
// }
// },
// 为了一开始就能执行要选带选项的watch vwatcher-options
watch: {
data: {
immediate: true,//立即执行 一次
// deep是当监控的数据是很复杂的数据的时候才使用如果是很浅就不需要用到deep
// deep: true,
handler(newValue, oldValue) {
}
}
},
})
</script>
</body>
</html>
vue所有的生命周期