1.不使用setup语法糖,这种方式和vue2差不多,is可以是个字符串
javascript"><template>
<Child1 />
<Child2 />
<***ponent :is="current***p"></***ponent>
<el-button @click="***pChange">切换组件</el-button>
</template>
<script>
import { ref } from 'vue'
import Child1 from './Child1.vue'
import Child2 from './Child2.vue'
export default {
***ponents: {
Child1,
Child2
},
setup() {
let current***p = ref('Child1')
// 切换组件
const ***pChange = () => {
if(current***p.value == 'Child1') {
current***p.value = 'Child2'
}else {
current***p.value = 'Child1'
}
}
return {
current***p,
***pChange
}
}
}
</script>
2. 使用setup语法糖,这时候的is如果使用字符串会加载不出来,得使用组件实例
第一种方式
<template>
<Child1 />
<Child2 />
<***ponent :is="flag ? Child1 : Child2"></***ponent>
<el-button @click="flag = !flag">切换组件</el-button>
</template>
<script setup>
import { ref } from 'vue'
import Child1 from './Child1.vue'
import Child2 from './Child2.vue'
const flag = ref(true)
</script>
第二种方式
<template>
<Child1 />
<Child2 />
<***ponent :is="current***p"></***ponent>
<el-button @click="***pChange">切换组件</el-button>
</template>
<script setup>
import { shallowRef, ref } from 'vue'
import Child1 from './Child1.vue'
import Child2 from './Child2.vue'
//这里用ref的话,vue给出警告Vue接收到一个组件,该组件被制成反应对象。这可能会导致不必要的性能开销,应该通过将组件标记为“markRaw”或使用“shallowRef”而不是“ref”来避免。
// 如果使用 markRaw 那么current***p将不永远不会再成为响应式对象。 所以得使用 shallowRef
let current***p = shallowRef(Child1)
// 切换组件
const ***pChange = () => {
if(current***p.value == Child1) {
current***p.value = Child2
}else {
current***p.value = Child1
}
}
</script>