自己在写这个组件的时候主要遇到的问题就是在动态传入背景图片或者背景色的时候没能立马顺利写出来,不过现在实现了这个简单组件就和大家分享一下

<template>
<div class="card" :style="bg != undefined ? setBg() : {backgroundColor: '#fff'}">
<div class="cardTop">
<span class="left">
<span>
<avatar class="leftImg" :src="cardImg" alt=""></avatar>
</span>
<span class="content">
<span class="cardName">{{cardName != undefined ? cardName : defaultCardName}}</span>
<span class="cardType">{{cardType != undefined ? cardType : defaultCardType}}</span>
</span>
</span>
<span class="right">
<avatar :src="QRCode" alt=""></avatar>
</span>
</div>
<div class="cardBottom">
<span class="cardNum">卡号:{{cardNum != undefined ? cardNum : defaultCardNum}}</span>
</div>
</div>
</template>
<script>
import Avatar from '@/components/avatar/Avatar.vue';
export default {
components: {
Avatar,
},
props: {
cardImg: {},
QRCode: {},
bg: {},
cardName: {
type: String,
},
cardType: {
type: String,
},
cardNum: {
type: String,
},
},
data() {
return {
backGround: '#fff',
defaultCardName: '阿里云',
defaultCardType: '会员卡',
defaultCardNum: '8888 8888 8888'
}
},
computed: {},
methods: {
setBg() {
let cur = this.bg.lastIndexOf('.'); let img = this.bg.substr(cur + 1); if (/(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(img)) {
return { backgroundImage: 'url(' + this.bg + ')' }
} else {
return { backgroundColor: this.bg }
}
}
}
}
</script>
<style scoped lang="less"> .card {
height: 180px;
max-width: 350px;
display: flex;
flex-direction: column;
border-radius: 10px;
padding: 10px;
justify-content: space-between;
border: 1px solid #ccc;
.cardTop {
display: flex;
justify-content: space-between;
.left {
display: flex;
flex-direction: row;
.leftImg {
height: 70px;
width: 70px;
}
.content {
margin-left: 10px;
min-height: 70px;
display: flex;
flex-direction: column;
justify-content: space-around;
.cardName, .cardType {
font-size: 18px;
}
}
}
.right {
img {
height: 50px;
width: 50px;
}
}
}
.cardBottom { }
} </style>

图片组件如下:

<template>

    <span :class="avatarCls">
<img :src="src" v-if="src">
<i v-else-if="icon" :class="['iconfont', `icon-${icon}`]"></i>
<span v-else :class="`${prefixCls}-string`" :style="style" ref="children">
<slot></slot>
</span>
</span>
</template>
<script>
export default {
name: "Avatar",
data() {
return {
prefixCls: "ei-avatar",
scale: 1,
isSlotShow: false,
style: {}
};
},
props: {
size: {
type: String,
default: "large"
}, src: String,
shape: {
type: String,
default: "square"
},
icon: String
},
computed: {
avatarCls() {
const size = { large: "lg", small: "sm" }[this.size]; return [
this.prefixCls,
`${this.prefixCls}-${this.shape}`,
{
[`${this.prefixCls}-${size}`]: !!size,
[`${this.prefixCls}-icon`]: !!this.icon,
[`${this.prefixCls}-image`]: !!this.src
}
];
},
},
methods: {
setScale() {
this.isSlotShow = !this.src && !this.icon;
if (this.$refs.children) {
const childrenWidth = this.$refs.children.offsetWidth;
const avatarWidth = this.$el.getBoundingClientRect().width; if (avatarWidth - 8 < childrenWidth) {
this.scale = (avatarWidth - 8) / childrenWidth;
} else {
this.scale = 1;
}
}
}
},
mounted() {
this.setScale();
},
updated() {
this.setScale();
}
};
</script>
<style lang="stylus">
@import '../../assets/stylus/variable.styl';
@import '../../assets/stylus/mixin.styl'; .ei-avatar {
display: inline-block;
flex-center(start, center, center)
text-align: center;
background: $avatar-bg;
color: $avatar-color;
white-space: nowrap;
position: relative;
overflow: hidden;
avatar-size($avatar-size-base, $avatar-font-size-base); &-lg {
avatar-size($avatar-size-lg, $avatar-font-size-lg);
} &-sm {
avatar-size($avatar-size-sm, $avatar-font-size-sm);
} &-square {
border-radius: $avatar-border-radius;
} & > img {
width: 100%;
height: 100%;
display: block;
}
}
</style>

vue实现一个会员卡的组件(可以动态传入图片(分出的一个组件)、背景、文字、卡号等)的更多相关文章

  1. django在style的样式image url添加静态图片路径和django如何动态传入图片链接?

    #django在style的样式image url添加静态图片路径 style=" background:url({% static "agribusiness/images/lo ...

  2. 如何在小程序自定义组件和动态传入数据小demo

    在开发过程中,我们会将页面常用功能抽象为一个组件,这样既方便又可以避免代码冗余.小程序中也提供了自定义组件,了解Vue的伙伴们会发现其实和Vue的组件化很相似.这里用返回顶部功能来说说如何自定义组件, ...

  3. AngularJS下拉列表select在option动态变化之后多出了一个错误项的问题

    场景: Select初始化之后,选中select的某个选项 通过AngularJS更新select的选项 错误写法: HTML(使用ng-repeat) <div ng-app="Te ...

  4. VUE 单选下拉框Select中动态加载 默认选中第一个

    <lable>分类情况</lable> <select v-model="content.tid"> <option v-for=&quo ...

  5. Vue2.0组件实现动态搜索引擎(一)

    原文链接:https://blog.csdn.net/qwezxc24680/article/details/74550556 从github上看到一个不错的开源项目:https://github.c ...

  6. Knockout.js组件系统的详解之(一) - 组件的定义和注册

    (Knockout版本:3.4.1 ) KO的组件主要从以下四个部分进行详细介绍: 1.组件的定义和注册 2.组件绑定 3.使用自定义元素 4.自定义组件加载器(高级) 目录结构 1.通过" ...

  7. Vue加载组件、动态加载组件的几种方式

    https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...

  8. Vue.js教程--基础(实例 模版语法template computed, watch v-if, v-show v-for, 一个组件的v-for.)

    官网:https://cn.vuejs.org/v2/guide/index.html Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统. 视频教程:https: ...

  9. [Vue]组件——实现动态组件:keep-alive的使用

    1.在app.vue中用一个 <keep-alive> 元素将其动态组件包裹起来: keepAlive为true时,第一次被创建的时候缓存下来,为false时,不会缓存 <keep- ...

随机推荐

  1. jquery.base64.js

    (function($) { $.base64 = function(options) { var defaults = { data:"", type:0, unicode:tr ...

  2. linux下pptp配置步骤

    最近买了个VPS,于是随手搭了个VPN玩,ubuntu安装pptp太蠢了,直接apt-install pptp就行了 1./etc/pptpd.conf 注销最后两行,就是设置IP转发的范围,给那么几 ...

  3. js垃圾回收机制理解

    原理 找到不再被使用的变量,然后释放其占用的内存,但这个过程不是时时的,因为其开销比较大, 所以垃圾回收器会按照固定时间间隔周期性的执行 回收方式 a.标记清除 当变量进入环境时,将这个变量标记为“进 ...

  4. opengl绘制三维人物luweiqi

    素材中有四个.bmp格式的纹理文件和一个.txt的模型参数文件 文件格式说明: 纹理文件数量 纹理文件1(字符串)//.bmp 纹理文件2(字符串) 纹理文件3(字符串) . . . 材质数量 amb ...

  5. 学习——HTML5中事件

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...

  6. 关于cocos2dx之lua使用TableView

    在手机游戏的开发中,滚动是一项很重要的操作,而cocos2dx中使用的最广泛的就属于TableView了,只是由于cocos2dx的接口比較晦涩,所以须要一个熟悉的过程.本文主要解说怎样使用Table ...

  7. NYOJ 203 三国志(Dijkstra+贪心)

    三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 <三国志>是一款非常经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.如今他把游戏简化一下 ...

  8. 浏览器加载渲染HTML、DOM、CSS、 JAVASCRIPT、IMAGE、FLASH、IFRAME、SRC属性等资源的顺序总结

    页面响应加载的顺序:   1.域名解析->加载html->加载js和css->加载图片等其他信息 DOM详细的步骤如下: 解析HTML结构. 加载外部脚本和样式表文件. 解析并执行脚 ...

  9. Day5费用流

    算法 zkw费用流:多路增广,增光D[y]=D[i]+c的边 无源汇上下界最小费用可行流 每次强行增加下界的流量 类似网络流,拆边 原边的费用为c,拆出来的边费用为0 负边和负圈 直接应用 SDOI2 ...

  10. VS Code 关于SFTP上传文件到多服务器的配置

    工欲善其事,必先利其器! 刚学前端的时候一直用的DW来编写代码,其功能非常强大,但在Linux下不能用,所以就转VS Code了. 但是刚开始使用VS Code的时候,很多DW上的功能需要自己安装扩展 ...