父組件與子組件的 Layout 佈局 - daniel-qa/Vue GitHub Wiki
-
height: 100%; 目前佔空間的100%; 繼承至父組件,沒有父組件沒有設定明確高度的話,會有錯誤
-
height: 100vh; 视口高度的 100%;
如果你希望子组件 .container 占据整个宽度,可以明确设置宽度为 100% 或 100vw(视口宽度)。
考虑到你使用的是 flex 布局,可以使用 flex-grow 或 flex-basis 来调整布局,确保子组件的宽度能够适应父容器的宽度。
-
flex-grow 控制元素如何分配剩余空间。
-
flex-basis 控制元素的初始大小。
如果容器有足够的空间,flex-grow: 1 会使所有子元素均匀地分配剩余的空间。
父組件,儘量不要作太多複雜的設定,留給每個子組件,自己設定
- 父組件
<template>
<el-container>
<el-header style="color: white;width:100%;">
<h1> New Message </h1>
</el-header>
<div v-if="active === 0">
<New_Msg_Type :active="active" @update-active="updateActive" />
</div>
<div v-if="active === 1">
<New_Msg_BatchSelect active="active" @update-active="updateActive" />
</div>
</el-container>
</template>
<script setup>
import { ref } from 'vue'; // 引入 ref 函數
import New_Msg_Type from './new_msg_type.vue'; // 引入组件
import New_Msg_BatchSelect from './new_msg_BatchSelect.vue'; // 引入组件
import { ChatDotSquare } from '@element-plus/icons-vue'
// 定义 active 变量并设定初始值
const active = ref(0);
// 更新 active 的方法
const updateActive = (newActive) => {
active.value = newActive;
};
</script>
- 子組件
<template>
<el-container style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%;">
<el-card style="width: 50%; margin-top: 20px;">
<template #header>
<span class="head-text">選擇發送類型</span>
</template>
<el-radio-group v-model="firstCardSelection" style="margin-top: 20px;">
<el-radio label="option1">端外通知</el-radio>
<el-radio label="option2">Email</el-radio>
<el-radio label="option3">簡訊</el-radio>
</el-radio-group>
</el-card>
<el-card style="width: 50%; margin-top: 20px;">
<template #header>
<span class="head-text">選擇挑選方式</span>
</template>
<el-radio-group v-model="secondCardSelection" style="margin-top: 20px;">
<el-radio label="option1">端外通知</el-radio>
<el-radio label="optionA">個別挑選</el-radio>
<el-radio label="optionB">批量挑選</el-radio>
</el-radio-group>
</el-card>
<el-button type="primary" @click="goNextStep" style="margin-top: 50px;">
下一步
</el-button>
</el-container>
</template>
<script setup>
import { ref } from 'vue'; // 引入 ref,創建響應式變量
import { defineProps, defineEmits } from 'vue';
// 創建響應式變量來管理選擇狀態
const firstCardSelection = ref('option1');
const secondCardSelection = ref('optionA');
// 定义父组件传递过来的 props
const props = defineProps({
active: {
type: Number,
required: true
}
});
// 定义触发事件的方式
const emit = defineEmits();
// 在按钮点击时,触发事件并传递新的 active 值
const goNextStep = () => {
emit('update-active', 1); // 通知父组件更新 active 的值
};
</script>
<style scoped>
.head-text {
display: block; /* 确保它是块级元素 */
height: 60px; /* 设置高度 */
line-height: 60px; /* 垂直居中文本 */
font-size: 32px;
font-weight: bold;
}
.radio-group {
display: flex;
justify-content: center; /* 水平居中 */
margin-top: 50px; /* 与标题的距离 */
}
.nextbtn {
width: 25%;
margin-left: auto; /* 左邊距自動調整 */
margin-top: 5%;
}
.radio-group .el-radio {
margin-bottom: 50px; /* 给每个 radio 添加底部间距 */
}
</style>