image.png

UI

image.png

一、components/ColumnList.vue

  1. <template>
  2. <ul>
  3. <li v-for="column of list" :key="column.id">
  4. <img :src="column.avatar" :alt="column.title">
  5. <h5>{{column.title}}</h5>
  6. <p>{{column.description}}</p>
  7. <a href="#">进入专栏</a>
  8. </li>
  9. </ul>
  10. </template>
  11. <script lang="ts">
  12. import { defineComponent, PropType } from 'vue'
  13. export interface ColumnProps{
  14. id:number,
  15. title:string,
  16. avatar:string,
  17. description:string
  18. }
  19. export default defineComponent({
  20. name:'ColumnList',
  21. props:{
  22. list:{
  23. type:Array as PropType<ColumnProps[]>,
  24. required:true
  25. }
  26. },
  27. setup(props){
  28. console.log(props)
  29. }
  30. })
  31. </script>

二、App.vue中使用这个组件

  1. <template>
  2. <column-list :list='list'></column-list>
  3. </template>
  4. <script lang='ts'>
  5. import { defineComponent } from 'vue'
  6. import 'bootstrap/dist/css/bootstrap.min.css'
  7. import ColumnList, { ColumnProps } from './components/ColumnList.vue'
  8. const testData:ColumnProps[] = [
  9. {
  10. id:1001,
  11. title:'vue3.x',
  12. avatar:'https://images.dog.ceo/breeds/schipperke/n02104365_9354.jpg',
  13. description: '这是一只野狗',
  14. },
  15. ];
  16. export default defineComponent({
  17. name: 'App',
  18. components: {
  19. ColumnList,
  20. },
  21. setup(){
  22. return {
  23. list:testData
  24. }
  25. }
  26. })
  27. </script>

三、ColumnList设置可选参数avatar,及计算属性

  1. <template>
  2. <div class="row">
  3. <div class="col-4 " v-for="column of columnList" :key="column.id">
  4. <div class="card h-100 shadow-sm text-center">
  5. <img class="card-img-top rounded" :src="column.avatar" :alt="column.title" />
  6. <div class="card-body">
  7. <h5 class="card-title">{{ column.title }}</h5>
  8. <p class="card-text">{{ column.description }}</p>
  9. <a href="#" class="btn btn-primary border">进入专栏</a>
  10. </div>
  11. </div>
  12. </div>
  13. </div>
  14. </template>
  15. <script lang="ts">
  16. import { computed, defineComponent, PropType } from "vue";
  17. import "bootstrap/dist/css/bootstrap.min.css";
  18. export interface ColumnProps {
  19. id: number;
  20. title: string;
  21. avatar?: string;
  22. description: string;
  23. }
  24. export default defineComponent({
  25. name: "ColumnList",
  26. props: {
  27. list: {
  28. type: Array as PropType<ColumnProps[]>,
  29. required: true,
  30. },
  31. },
  32. setup(props) {
  33. const columnList = computed(()=>{
  34. return props.list.map(item=>{
  35. if(!item.avatar){
  36. item.avatar = require('@/assets/logo.png')
  37. }
  38. return item;
  39. })
  40. })
  41. return {
  42. columnList
  43. }
  44. },
  45. });
  46. </script>