UI
一、components/ColumnList.vue
<template>
<ul>
<li v-for="column of list" :key="column.id">
<img :src="column.avatar" :alt="column.title">
<h5>{{column.title}}</h5>
<p>{{column.description}}</p>
<a href="#">进入专栏</a>
</li>
</ul>
</template>
<script lang="ts">
import { defineComponent, PropType } from 'vue'
export interface ColumnProps{
id:number,
title:string,
avatar:string,
description:string
}
export default defineComponent({
name:'ColumnList',
props:{
list:{
type:Array as PropType<ColumnProps[]>,
required:true
}
},
setup(props){
console.log(props)
}
})
</script>
二、App.vue中使用这个组件
<template>
<column-list :list='list'></column-list>
</template>
<script lang='ts'>
import { defineComponent } from 'vue'
import 'bootstrap/dist/css/bootstrap.min.css'
import ColumnList, { ColumnProps } from './components/ColumnList.vue'
const testData:ColumnProps[] = [
{
id:1001,
title:'vue3.x',
avatar:'https://images.dog.ceo/breeds/schipperke/n02104365_9354.jpg',
description: '这是一只野狗',
},
];
export default defineComponent({
name: 'App',
components: {
ColumnList,
},
setup(){
return {
list:testData
}
}
})
</script>
三、ColumnList设置可选参数avatar,及计算属性
<template>
<div class="row">
<div class="col-4 " v-for="column of columnList" :key="column.id">
<div class="card h-100 shadow-sm text-center">
<img class="card-img-top rounded" :src="column.avatar" :alt="column.title" />
<div class="card-body">
<h5 class="card-title">{{ column.title }}</h5>
<p class="card-text">{{ column.description }}</p>
<a href="#" class="btn btn-primary border">进入专栏</a>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { computed, defineComponent, PropType } from "vue";
import "bootstrap/dist/css/bootstrap.min.css";
export interface ColumnProps {
id: number;
title: string;
avatar?: string;
description: string;
}
export default defineComponent({
name: "ColumnList",
props: {
list: {
type: Array as PropType<ColumnProps[]>,
required: true,
},
},
setup(props) {
const columnList = computed(()=>{
return props.list.map(item=>{
if(!item.avatar){
item.avatar = require('@/assets/logo.png')
}
return item;
})
})
return {
columnList
}
},
});
</script>