vue3 组件篇 Card
card组件在我们日常开发中经常使用,如果能够有一个较好的封装,将会省去很多的重复代码,提高开发效率。要与cardGroup相结合能够实现水平排列和垂直排列,或者瀑布流排列。提供了线上的体验网站,欢迎大家前来,并提出你的建议。必须分为标题和内容两部分,并且都支持自定义。card组件需要实现哪些功能呢。提供一种或多种hover特效。card提供点击事件用以交互。......
·
组件介绍
“Card” 组件通常是用于构建用户界面的一种常见 UI 元素,它用于展示信息、内容或功能模块,并通常以卡片状的形式呈现。卡片通常包含标题、文本、图像、按钮和其他交互元素,以便向用户呈现信息并提供操作。下面是一些关于 “Card” 组件的常见特点和用法:
-
标题和内容:
- 卡片通常包含一个标题或主题,用于描述卡片的内容或主题。下方是内容区域,用于展示详细信息、文本、图像等。
-
图像:
- 卡片可以包含一个或多个图像,用于可视化地表示信息。这些图像可以是独立的图片或者是图片链接。
-
按钮:
- 卡片通常包含按钮,用于触发相关操作,例如点击按钮查看更多信息、执行某个操作,或者导航到相关页面。
-
交互性:
- 有些卡片可以具有交互性,允许用户与其进行互动。这可以包括展开或折叠内容、滑动、拖动或其他操作。
-
信息展示:
- 卡片通常用于展示信息,如产品信息、文章摘要、用户资料等。它们通常以简洁而直观的方式呈现信息,使用户能够快速了解内容。
-
布局灵活性:
- 卡片的布局可以根据需要进行自定义。它们可以采用单列、多列、网格布局等不同形式,以适应不同的设计和内容需求。
-
响应式设计:
- 好的卡片组件通常支持响应式设计,以便在不同屏幕尺寸和设备上正常显示。这意味着它们能够适应移动设备、平板电脑和桌面计算机的屏幕尺寸。
-
数据呈现:
- 卡片组件常用于显示数据库记录、社交媒体帖子、新闻文章、产品列表等多种类型的数据。
-
自定义样式:
- 开发人员通常可以自定义卡片组件的样式,以满足特定的设计需求。这包括字体、颜色、边框、阴影等。
-
可访问性:
- 良好的卡片组件应该考虑到可访问性,以确保它们对于使用辅助技术的用户也能够易于理解和操作。
“Card” 组件是现代用户界面设计中的一个重要元素,它们通常用于构建信息展示和交互的部分。不同的前端框架和库(如React、Angular、Vue.js等)通常都提供了卡片组件的实现,或者你也可以自行开发一个以满足特定需求。
开发思路
card 组件需要实现哪些功能呢
必须分为标题和内容两部分,并且都支持自定义
要与cardGroup相结合能够实现水平排列和垂直排列,或者瀑布流排列
能够自定义背景色
提供一种或多种hover特效
card提供点击事件用以交互
组件安装与使用
需要先安装vue3-dxui
yarn add vue3-dxui
或者
npm install vue3-dxui
全局main.ts中引入css
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import 'vue3-dxui/dxui/dxui.css'
createApp(App).use(store).use(router).mount('#app')
按需引入
<script>
import { Card } from 'vue3-dxui'
export default {
components: {
Card
}
}
</script>
组件代码
<template>
<div
@click="cardClick"
class="dx-card-warpper"
:class="hover"
:style="background ? { background } : {}"
>
<div class="dx-card-title" v-if="showTitle">
<slot name="title" />
</div>
<div class="dx-card-title dx-card-title-default" v-else-if="title">
<span class="dx-card-title-default-text">
{{ title }}
</span>
</div>
<div class="dx-card-content">
<slot />
</div>
</div>
</template>
<script lang="ts">
import { ComponentInternalInstance, getCurrentInstance, ref, PropType } from 'vue'
export default {
props: {
title: {
required: false,
default: '',
type: String
},
hover: {
required: false,
default: '',
type: String as PropType<'boxShadow' | 'floatUp' | 'enlarge'>
},
background: {
required: false,
default: '',
type: String
}
},
setup() {
const currentInstance: ComponentInternalInstance | null = getCurrentInstance()
const cardClick = function (e: Event) {
currentInstance?.emit('click', e)
}
// 自定义card头部
const showTitle = ref(false)
const title = currentInstance?.slots.title
if (title) {
showTitle.value = true
}
return {
cardClick,
showTitle
}
}
}
</script>
<style lang="scss" scoped>
@import '@/scss/layout.scss';
.dx-card-warpper {
border-radius: 4px;
border: $border;
cursor: pointer;
width: 100%;
.dx-card-title {
border-bottom: $border;
padding: 24px;
}
.dx-card-title-default {
font-size: 16px;
font-weight: 600;
display: flex;
}
.dx-card-content {
padding: 24px;
}
}
.dx-card-warpper.boxShadow:hover {
box-shadow: 4px 4px 10px rgb(0 0 0 / 29%);
}
.dx-card-warpper.floatUp:hover {
transform: translateY(-10%);
}
.dx-card-warpper.enlarge:hover {
transform: scale(1.1);
}
</style>
cardgroup组件
<template>
<div class="dx-card-group-warpper" :class="ClassName" ref="cardGroup">
<slot />
</div>
</template>
<script lang="ts">
import { ref, onMounted } from 'vue'
import { Data } from '../dialog/types'
export default {
props: {
// columnNumber表示每行有多少列
columnNumber: {
required: false,
default: 1,
type: Number
}
},
setup(propsData: Data) {
// 自定义card头部
const cardGroup: any = ref(null)
const ClassName = `count-number-${propsData.columnNumber}`
const flowClassName = onMounted(() => {
// ref只能在onMounted里面才能获取
const hasNotCardComponents = [...cardGroup.value.children].some((item: any) => {
return item.className !== 'dx-card-warpper'
})
if (hasNotCardComponents) {
// 算是给开发者的题型,在CardGroup里只能使用card组件
console.log(Error('Only Card components can be used in CardGroup'))
}
})
return {
cardGroup,
ClassName
}
}
}
</script>
<style lang="scss" scoped>
@import '@/scss/layout.scss';
.dx-card-group-warpper {
width: 100%;
display: flex;
flex-wrap: wrap;
align-items: stretch;
::v-deep .dx-card-warpper {
margin-bottom: 12px;
}
}
@for $i from 2 through 99 {
.count-number-#{$i} {
// gap: calc(4% / #{$i - 1});
::v-deep .dx-card-warpper {
width: calc(96% / #{$i});
margin-right: calc(4% / #{$i - 1});
}
::v-deep .dx-card-warpper:nth-child(#{$i}n + #{$i}) {
margin-right: 0 !important;
}
}
}
</style>
与cardgroup组件一起使用
<CardGroup :columnNumber="3">
<Card>Hover</Card>
<Card>Hover</Card>
<Card :title="3">Hover</Card>
<Card :title="3">Hover</Card>
</CardGroup>
关于dxui组件库
dxui组件库是我个人搭建的vue3 前端交互组件库,倾向于pc网站的交互模式。
- 如果你有任何问题,请在博客下方评论留言,我尽可能24小时内回复。
- dxui新上线的官网域名变更 http://dxui.cn
- npm 官方链接 https://www.npmjs.com/package/vue3-dxui
- 如果你想看完整源码 https://github.com/757363985/dxui
更多推荐
已为社区贡献17条内容
所有评论(0)