钩子函数,就是options里面的key, 它的值是函数
钩子函数写在其他配置项的后面
<div id="app">
<life-circle>life-circle>
div>
<template id="life-circle">
<div>
<h3> 组件生命周期的 初始化阶段 h3>
<p> {{ msg }} p>
div>
template>
<script>
Vue.component('LifeCircle',{
template: '#life-circle',
data () {
return {
msg: 'hello vue.js'
}
},
// 初始化阶段钩子函数
beforeCreate () { //表示组件创建前的准备工作( 初始化事件和生命周期 ) ---- 小孩降生前的准备工作
/*
组件未创建, 所以没有this , 数据拿不到 , DOM也拿不到
*/
console.log('01-beforeCreate');
console.log( 'data',this.msg )
console.log( 'DOM',document.querySelector('p'))
/* axios({
url: './data.json'
})
.then( res => {
this.msg = res
})
.catch( error => console.log(error))
*/
},
created () { // 组件创建结束
console.log('02-created')
console.log( 'data',this.msg )
console.log( 'DOM',document.querySelector('p'))
/* axios({
url: './data.json'
})
.then( res => {
this.msg = res
})
.catch( error => console.log(error)) */
},
beforeMount () {
console.log( '03-beforeMounte' )
console.log( 'data',this.msg )
console.log( 'DOM',document.querySelector('p'))
/* axios({
url: './data.json'
})
.then( res => {
this.msg = res
})
.catch( error => console.log(error)) */
},
mounted () {
console.log('04-mounted')
console.log('data',this.msg)
console.log('Real DOM',document.querySelector('p'))
axios({
url: './data.json'
})
.then( res => {
this.msg = res
})
.catch( error => console.log(error))
}
})
new Vue({
}).$mount('#app')
</script>
<!-- html代码 --!>
<div id="app">
<life-circle>life-circle>
div>
<template id="life-circle">
<div>
<h3> 运行中阶段 h3>
<p> {{ msg }} p>
div>
template>
//JS代码
Vue.component('LifeCircle',{
template: '#life-circle',
data () {
return {
msg: 'hello'
}
},
beforeUpdate () {
console.log( 'beforeUpdate' )
console.log( 'data', this.msg)
console.log( 'DOM', document.querySelector('p') )
},
updated () {
console.log( 'updated' )
console.log( 'data', this.msg )
console.log( 'DOM' , document.querySelector('p') )
// document.querySelector('p').style.background = 'red'
}
})
new Vue({
el: '#app'
})
- 总结: 数据更新, 也要进行DOM操作那么, 我们使用update这个钩子
<!-- html代码 --!>
<div id="app">
Vue.component('LifeCircle',{
template: '#life-circle',
methods: {
destroy(){
this.$destroy()
}
},
created () {
this.timer = setInterval( () => {
console.log('1')
},1000)
},
beforeDestroy () {
console.log('beforeDestory')
},
destroyed () {
console.log('destroyed')
clearInterval( this.timer )
// 如果是用$destroy这个方法来清除组件, 那么我们必须手动清除这个组件的外壳
document.querySelector('#app div').remove()
}
})
new Vue({
el: '#app',
data: {
flag: true
}
})
<!-- 需要引入的资源 --!>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.0/css/swiper.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.0/js/swiper.min.js">script>
<script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js">script>
<script src="../vue.js/vue.js">script>
<style>
.swiper-container {
width: 600px;
height: 300px;
}
style>
<div id="app">
<my-swiper>my-swiper>
div>
<template id="my-swiper">
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide" v-for="item in swiper">
<img :src="item.src" alt="">
div>
div>
<div class="swiper-pagination">div>
<div class="swiper-button-prev">div>
<div class="swiper-button-next">div>
<div class="swiper-scrollbar">div>
div>
template>
<script>
Vue.component("MySwiper",{
template:"#my-swiper",
data () {
return {
swiper :[
{
"id": 1,
"src": "https://m.360buyimg.com/babel/jfs/t1/38920/7/978/98861/5cbb35f6E9289f045/9372bac08d061fdc.jpg"
},
{
"id": 2,
"src": "https://img1.360buyimg.com/da/jfs/t1/36709/25/3628/65612/5cb9417bE5b30fdff/5cf6415bc396c9d0.jpg"
},
{
"id": 3,
"src": "https://m.360buyimg.com/babel/jfs/t1/38920/7/978/98861/5cbb35f6E9289f045/9372bac08d061fdc.jpg"
}
]
}
},
beforeCreate () {
},
created () {
},
beforeMount () {
},
mounted () {
// this.mySwiper = new Swiper ('.swiper-container', {
// loop: true, // 循环模式选项
// // 如果需要前进后退按钮
// navigation: {
// nextEl: '.swiper-button-next',
// prevEl: '.swiper-button-prev',
// },
// })
},
beforeUpdate () {
},
updated () {
this.mySwiper = new Swiper ('.swiper-container', {
loop: true, // 循环模式选项
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
})
},
beforeDestroy () {
},
destroyed () {
}
})
new Vue({
el:"#app"
})
</script>
DOM就没有渲染
数据直接有了
上面这个案例直接写死了数据,导致数据没有更新,所以卸载update钩子里的函数不会执行
真实DOM存在了, 才能实例化,所以要是直接写在create中必须要使用异步操作
<div class="swiper-pagination">div>
<div class="swiper-button-prev">div>
<div class="swiper-button-next">div>
<div class="swiper-scrollbar">div>
div>
template>
<script>
Vue.component("MySwiper",{
template:"#my-swiper",
data () {
return {
swiper : null
}
},
beforeCreate () {
},
created () {
axios({
url:"./swiper.json"
})
.then ( ( res ) => {
this.swiper = res.data
} )
.catch ( ( error ) => {
if( error ){
throw error
}
} )
},
beforeMount () {
},
mounted () {
},
beforeUpdate () {
},
updated () {
this.mySwiper = new Swiper ('.swiper-container', {
loop: true, // 循环模式选项
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
})
},
beforeDestroy () {
},
destroyed () {
}
})
new Vue({
el:"#app"
})
</script>
- 解决:
1. 在updated钩子中添加判断条件, ` if(!this.swiper){} `
updated () {
if( !this.mySwiper ){
this.mySwiper = new Swiper ('.swiper-container', {
loop: true, // 循环模式选项
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
})
}
},
3. 在数据请求里面写, 但是发现无法获得真实DOM
1. 将实例化代码发到异步队列
- setTimeout(function(){},0) 将实例化代码发到这里面 [不推荐]
- 案例:
created () {
axios({
url:"./swiper.json"
})
.then ( ( res ) => {
this.swiper = res.data
} )
.catch ( ( error ) => {
if( error ){
throw error
}
} )
setTimeout( function () {
this.mySwiper = new Swiper ('.swiper-container', {
loop: true, // 循环模式选项
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
})
},0)
},
- Vue.nextTick() /this.$nextTick 优先使用
- 概念: nextTick表示DOM渲染之后执行的业务
created () {
axios({
url:"./swiper.json"
})
.then ( ( res ) => {
this.swiper = res.data;
Vue.nextTick(( ) => {
this.mySwiper = new Swiper ('.swiper-container', {
loop: true, // 循环模式选项
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
})
})
} )
.catch ( ( error ) => {
if( error ){
throw error
}
} )
}