一、引言
Vue.js 的组件化开发是其核心特性之一,它允许开发者将复杂的界面拆分为可复用的、独立的、小的组件,从而提高开发效率和代码的可维护性。
二、关键点
1.组件的定义
在components下创建.vue文件timecard.vue用来编辑内容。
文件创建完毕后,在timecard.vue内编写内容。以演出预告为例,包括演出节目、演出时间、演出状态。
<div class="content">
<div>演出节目</div>
<div>演出时间</div>
<div>演出状态:</div>
</div>
然后设置该div的样式
.content {
box-shadow: 1px 1px 1px 1px #ccc;
width: 300px;
height: 50px;
margin: 10px;
padding: 10px;
border-radius: 5px;
}
接着设置index.vue,在index.vue中的div设置标题和timecard的内容。同时在script中引入components文件中的timecard.vue。
设置完成后打开终端进入locahost查看
2.组件的传参:
1.父传子:
我们在 timecard内传属性name
<TimeCard :name="'张三'"></TimeCard>
然后在timecard中声明一个变量props用definprops来接受这个属性
const props=defineProps({
name:String
})
console.log(props);
包含两个值,第一个name表示的是属性名,第二个string表示的是属性类型
打开html可以看到name已经被传过来了
接着复制一个更改name的值
接着我们在index.vue中创建一个存放演出数据的数组,然后在timecard标签中循环这个数组
<template>
<div class="content">
<div>演出节目:{{ props.title }}</div>
<div>演出时间:{{ props.start }}~{{ props.end }}</div>
</div>
</template>
<script setup>
const props = defineProps({
title: String,
start: String,
end: String
})
console.log(props);
</script>
<style scoped>
.content {
box-shadow: 1px 1px 1px 1px #ccc;
background-color: #fff;
width: 300px;
margin: 10px;
padding: 10px;
border-radius: 5px;
}
</style>
引入计算函数和响应对象
import { computed, ref } from 'vue';
声明状态的变量名,然后获取当前时分秒
const date = new Date();
let time = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`
之后根据时间来判断演出状态
let status = computed(() => {
// 判断演出状态1.未开始 2.进行中 3.已结束
if(time<props.start){
return{
color: '#0000ff',
msg: '未开始'
};
}else{
if(time<props.end){
return{
color: '#00ff00',
msg: '进行中'
};
}else{
return {
color: '#aaaaaa',
msg: '已结束'
};
}
}
})
这样就可以根据首页传来的演出信息来显示演出信息的状态
TimeCard.vue
<template>
<div class="content" :style="{color: status.color}">
<div>演出节目:{{ props.title }}</div>
<div>演出时间:{{ props.start }}~{{ props.end }}</div>
<div>演出状态:{{ status.msg }}</div>
</div>
</template>
<script setup>
import { computed, ref } from 'vue';
const props = defineProps({
title: String,
start: String,
end: String,
status: String
})
const date = new Date();
let time = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`
let status = computed(() => {
// 判断演出状态1.未开始 2.进行中 3.已结束
if(time<props.start){
return{
color: '#0000ff',
msg: '未开始'
};
}else{
if(time<props.end){
return{
color: '#00ff00',
msg: '进行中'
};
}else{
return {
color: '#aaaaaa',
msg: '已结束'
};
}
}
})
console.log(props);
</script>
<style scoped>
.content {
box-shadow: 1px 1px 1px 1px #ccc;
background-color: #fff;
width: 300px;
margin: 10px;
padding: 10px;
border-radius: 5px;
}
</style>
index.vue
<template>
<div>
<h1>index页面</h1>
<TimeCard v-for="(item, index) in list" :key="index" :title="item.title" :start="item.start" :end="item.end">
</TimeCard>
</div>
</template>
<script setup>
import TimeCard from '@/components/TimeCard.vue';
let list = [
{
title: "演出一",
start: '08:00:00',
end: '09:00:00',
status:'未开始'
},
{
title: "演出二",
start: '13:00:00',
end: '14:00:00',
status:'进行中'
},
{
title: "演出三",
start: '16:00:00',
end: '18:00:00',
status:'已结束'
}
]
</script>
<style lang="scss" scoped></style>