diff --git a/packages/card/index.js b/packages/card/index.js
new file mode 100644
index 000000000..448d6face
--- /dev/null
+++ b/packages/card/index.js
@@ -0,0 +1,84 @@
+import createSfc from '../utils/create';
+import createBem from '../utils/bem';
+import Tag from '../tag';
+
+const bem = createBem('van-card');
+
+export default createSfc({
+ name: 'card',
+
+ props: {
+ tag: String,
+ desc: String,
+ thumb: String,
+ title: String,
+ centered: Boolean,
+ lazyLoad: Boolean,
+ thumbLink: String,
+ num: [Number, String],
+ price: [Number, String],
+ originPrice: [Number, String],
+ currency: {
+ type: String,
+ default: '¥'
+ }
+ },
+
+ render(h) {
+ const { thumb, isDef, $slots: slots } = this;
+
+ const Thumb = (slots.thumb || thumb) && (
+
+ {slots.thumb ||
+ (this.lazyLoad ? (
+
+ ) : (
+
+ ))}
+ {this.tag && (
+
+ {this.tag}
+
+ )}
+
+ );
+
+ const Title = slots.title || (this.title &&
{this.title}
);
+
+ const Desc =
+ slots.desc || (this.desc && {this.desc}
);
+
+ const Price = (slots.price || isDef(this.price)) && (
+ {slots.price || `${this.currency} ${this.price}`}
+ );
+
+ const OriginPrice = isDef(this.originPrice) && (
+ {`${this.currency} ${this.originPrice}`}
+ );
+
+ const Num = (slots.num || isDef(this.num)) && (
+ {slots.num || `x ${this.num}`}
+ );
+
+ const Footer = slots.footer && ;
+
+ return (
+
+
+ {Footer}
+
+ );
+ }
+});
diff --git a/packages/card/index.vue b/packages/card/index.vue
deleted file mode 100644
index 75049fada..000000000
--- a/packages/card/index.vue
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{ tag }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ currency }} {{ price }}
-
-
- {{ currency }} {{ originPrice }}
-
-
- x {{ num }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/card/test/__snapshots__/demo.spec.js.snap b/packages/card/test/__snapshots__/demo.spec.js.snap
index 2c1bd205b..fc8c4eda6 100644
--- a/packages/card/test/__snapshots__/demo.spec.js.snap
+++ b/packages/card/test/__snapshots__/demo.spec.js.snap
@@ -4,26 +4,21 @@ exports[`renders demo correctly 1`] = `