一、要实现通过按钮切换显示哪个组件
- 传统代码实现方式如下:(v-show给组件设置是否显示)
<!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>21</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
<script>
const app = Vue.createApp({
data() {
return {currentItem: 'input-item'}
},
methods: {
handleClick() {
if (this.currentItem === 'input-item') {
this.currentItem = 'common-item'
}else {
this.currentItem = 'input-item'
}
}
},
template: `
<input-item v-show="currentItem === 'input-item'"/>
<common-item v-show="currentItem === 'common-item'"/>
<button @click="handleClick">切换</button>
`
});
app.component('input-item', {
template: `
<input />
`
});
app.component('common-item', {
template: `<div>Hello world</div>`
})
const vm = app.mount('#root')
</script>
</body>
</html>
- 用动态组件实现
动态组件是根据数据的变化,结合component标签来随时动态切换组件的显示
1)将对两个子组件的引用改为component标签,接收一个is属性参数
2)代码如下
<script>
const app = Vue.createApp({
data() {
return {currentItem: 'input-item'}
},
methods: {
handleClick() {
if (this.currentItem === 'input-item') {
this.currentItem = 'common-item'
}else {
this.currentItem = 'input-item'
}
}
},
template: `
<component :is="currentItem" />
<button @click="handleClick">切换</button>
`
});
app.component('input-item', {
template: `
<input />
`
});
app.component('common-item', {
template: `<div>Hello world</div>`
})
const vm = app.mount('#root')
</script>
二、异步组件
可异步的执行一下组件逻辑,如下代码:
<!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>21</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
<script>
const app = Vue.createApp({
template: `
<div>
<common-item />
<async-common-item />
</div>
`
});
app.component('common-item', {
template: `<div>Hello world</div>`
});
app.component('async-common-item', Vue.defineAsyncComponent(() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
template: `<div>this is an async component</div>`
})
}, 4000)
})
}))
const vm = app.mount('#root')
</script>
</body>
</html>
async-common-item组件是一个异步组件,在页面加载之后4s会显示