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>
<!--这么写太麻烦了,我们来精简一下-->
<!--<input-item v-show="this.currentItem === 'input-item'" />-->
<!--<common-item v-show="this.currentItem === 'common-item'" />-->
<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>
运行结果
![image-20210613184438395.png](https://i-blog.csdnimg.cn/blog_migrate/e68345e28eb18ceadc382f4a423f3811.png)
内容缓存
<!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>
<!--这么写太麻烦了,我们来精简一下-->
<!--<input-item v-show="this.currentItem === 'input-item'" />-->
<!--<common-item v-show="this.currentItem === 'common-item'" />-->
<!--内容缓存-->
<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>
运行结果
![image-20210613184819809.png](https://i-blog.csdnimg.cn/blog_migrate/99cf97c4d415137bf6f1e87c5b7040f7.png)
异步组件
<!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) => {
setTimeout(() => {
resolve({
template: `
<div>这是一个异步组件!</div>
`
})
}, 4000);
})
}))
app.component('common-item',{
template: `
<div>hello world!</div>
`
});
const vm = app.mount('#root');
</script>
</html>
运行结果
![image-20210613190328421.png](https://i-blog.csdnimg.cn/blog_migrate/ff7419408cfda0f572a838bc341a64db.png)