8、动态组件和异步组件
动态组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello vue</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
const app = Vue.createApp({
data(){
return{
currentItem: 'input-item'
}
},
methods:{
shift(){
if(this.currentItem === 'input-item'){
this.currentItem = 'common-item'
}else{
this.currentItem = 'input-item'
}
}
},
template: `
<div>
<component :is="currentItem" />
<button @click="shift()">切换</button>
</div>
`
});
app.component('input-item',{
template: `
<input />
`
});
app.component('common-item',{
template: `
<div>hello world!</div>
`
});
const vm = app.mount('#root');
</script>
</html>
运行结果

内容缓存
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello vue</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
const app = Vue.createApp({
data(){
return{
currentItem: 'input-item'
}
},
methods:{
shift(){
if(this.currentItem === 'input-item'){
this.currentItem = 'common-item'
}else{
this.currentItem = 'input-item'
}
}
},
template: `
<div>
<keep-alive>
<component :is="currentItem" />
</keep-alive>
<button @click="shift()">切换</button>
</div>
`
});
app.component('input-item',{
template: `
<input />
`
});
app.component('common-item',{
template: `
<div>hello world!</div>
`
});
const vm = app.mount('#root');
</script>
</html>
运行结果

异步组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello vue</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
const app = Vue.createApp({
data(){
return{
currentItem: 'input-item'
}
},
template: `
<div>
<common-item />
<async-common-item />
</div>
`
});
// 异步组件
app.component('async-common-item', Vue.defineAsyncComponent( () => {
return new Promise((resolve, reject) => {
// 定时执行:4秒后执行
setTimeout(() => {
// 成功时执行
resolve({
template: `
<div>这是一个异步组件!</div>
`
})
}, 4000);
})
}))
// 同步组件
app.component('common-item',{
template: `
<div>hello world!</div>
`
});
const vm = app.mount('#root');
</script>
</html>
运行结果
