Commit c6336ce4948b3f11cd8457372066a842f97ea479

Authored by Aresn
Committed by GitHub
2 parents 2ec84333 c7cd8bdd

Merge pull request #2667 from lison16/messagerender

make Message and Notice support render
examples/routers/message.vue
@@ -13,12 +13,19 @@ @@ -13,12 +13,19 @@
13 info () { 13 info () {
14 // this.$Message.info('这是一条普通提示'); 14 // this.$Message.info('这是一条普通提示');
15 this.$Message.success({ 15 this.$Message.success({
16 - content: '这是一条普通提示2', 16 + // content: '这是一条普通提示2',
17 duration: 500, 17 duration: 500,
18 onClose () { 18 onClose () {
19 // console.log(123) 19 // console.log(123)
20 }, 20 },
21 - closable: true 21 + closable: true,
  22 + render (h) {
  23 + return h('Button',{
  24 + props: {
  25 + type: 'primary'
  26 + }
  27 + }, '这是render出来的');
  28 + }
22 }) 29 })
23 }, 30 },
24 success () { 31 success () {
examples/routers/notice.vue
1 <template> 1 <template>
2 <div> 2 <div>
3 <p>带描述信息</p> 3 <p>带描述信息</p>
  4 + <Button @click="normal(false)">普通</Button>
4 <Button @click="info(false)">消息</Button> 5 <Button @click="info(false)">消息</Button>
5 <Button @click="success(false)">成功</Button> 6 <Button @click="success(false)">成功</Button>
6 <Button @click="warning(false)">警告</Button> 7 <Button @click="warning(false)">警告</Button>
@@ -16,15 +17,30 @@ @@ -16,15 +17,30 @@
16 <script> 17 <script>
17 export default { 18 export default {
18 methods: { 19 methods: {
  20 + normal (nodesc) {
  21 + this.$Notice.open({
  22 + title: 'google',
  23 + duration: 0,
  24 + desc: nodesc ? '' : '这里是通知描述这里,是通知描述这里是通知描述这里,是通知描述这里,是通知描述这里是通知描述这里是通知描述',
  25 + render (h) {
  26 + return h('span', {}, 'sdsdfsdf');
  27 + }
  28 + });
  29 + },
19 info (nodesc) { 30 info (nodesc) {
20 this.$Notice.info({ 31 this.$Notice.info({
21 - title: '这是通知标题',  
22 - desc: nodesc ? '' : '这里是通知描述这里,是通知描述这里是通知描述这里,是通知描述这里,是通知描述这里是通知描述这里是通知描述' 32 + // title: '这是通知标题',
  33 + duration: 0,
  34 + desc: nodesc ? '' : '这里是通知描述这里,是通知描述这里是通知描述这里,是通知描述这里,是通知描述这里是通知描述这里是通知描述',
  35 + render (h) {
  36 + return h('span', {}, 'sdsdfsdf');
  37 + }
23 }); 38 });
24 }, 39 },
25 success (nodesc) { 40 success (nodesc) {
26 this.$Notice.success({ 41 this.$Notice.success({
27 title: '这是通知标题', 42 title: '这是通知标题',
  43 + duration: 0,
28 desc: nodesc ? '' : '这里是通知描述这里,是通知描述这里是通知描述这里,是通知描述这里,是通知描述这里是通知描述这里是通知描述' 44 desc: nodesc ? '' : '这里是通知描述这里,是通知描述这里是通知描述这里,是通知描述这里,是通知描述这里是通知描述这里是通知描述'
29 }); 45 });
30 }, 46 },
src/components/base/notification/index.js
@@ -5,7 +5,6 @@ Notification.newInstance = properties =&gt; { @@ -5,7 +5,6 @@ Notification.newInstance = properties =&gt; {
5 const _props = properties || {}; 5 const _props = properties || {};
6 6
7 const Instance = new Vue({ 7 const Instance = new Vue({
8 - data: _props,  
9 render (h) { 8 render (h) {
10 return h(Notification, { 9 return h(Notification, {
11 props: _props 10 props: _props
src/components/base/notification/notice.vue
@@ -2,7 +2,12 @@ @@ -2,7 +2,12 @@
2 <transition :name="transitionName" @enter="handleEnter" @leave="handleLeave"> 2 <transition :name="transitionName" @enter="handleEnter" @leave="handleLeave">
3 <div :class="classes" :style="styles"> 3 <div :class="classes" :style="styles">
4 <template v-if="type === 'notice'"> 4 <template v-if="type === 'notice'">
5 - <div :class="[baseClass + '-content']" ref="content" v-html="content"></div> 5 + <div :class="contentClasses" ref="content" v-html="content"></div>
  6 + <div :class="contentWithIcon">
  7 + <render-cell
  8 + :render="renderFunc"
  9 + ></render-cell>
  10 + </div>
6 <a :class="[baseClass + '-close']" @click="close" v-if="closable"> 11 <a :class="[baseClass + '-close']" @click="close" v-if="closable">
7 <i class="ivu-icon ivu-icon-ios-close-empty"></i> 12 <i class="ivu-icon ivu-icon-ios-close-empty"></i>
8 </a> 13 </a>
@@ -10,6 +15,11 @@ @@ -10,6 +15,11 @@
10 <template v-if="type === 'message'"> 15 <template v-if="type === 'message'">
11 <div :class="[baseClass + '-content']" ref="content"> 16 <div :class="[baseClass + '-content']" ref="content">
12 <div :class="[baseClass + '-content-text']" v-html="content"></div> 17 <div :class="[baseClass + '-content-text']" v-html="content"></div>
  18 + <div :class="[baseClass + '-content-text']">
  19 + <render-cell
  20 + :render="renderFunc"
  21 + ></render-cell>
  22 + </div>
13 <a :class="[baseClass + '-close']" @click="close" v-if="closable"> 23 <a :class="[baseClass + '-close']" @click="close" v-if="closable">
14 <i class="ivu-icon ivu-icon-ios-close-empty"></i> 24 <i class="ivu-icon ivu-icon-ios-close-empty"></i>
15 </a> 25 </a>
@@ -19,7 +29,11 @@ @@ -19,7 +29,11 @@
19 </transition> 29 </transition>
20 </template> 30 </template>
21 <script> 31 <script>
  32 + import RenderCell from '../render';
22 export default { 33 export default {
  34 + components: {
  35 + RenderCell
  36 + },
23 props: { 37 props: {
24 prefixCls: { 38 prefixCls: {
25 type: String, 39 type: String,
@@ -36,6 +50,10 @@ @@ -36,6 +50,10 @@
36 type: String, 50 type: String,
37 default: '' 51 default: ''
38 }, 52 },
  53 + withIcon: Boolean,
  54 + render: {
  55 + type: Function
  56 + },
39 styles: { 57 styles: {
40 type: Object, 58 type: Object,
41 default: function() { 59 default: function() {
@@ -71,6 +89,9 @@ @@ -71,6 +89,9 @@
71 baseClass () { 89 baseClass () {
72 return `${this.prefixCls}-notice`; 90 return `${this.prefixCls}-notice`;
73 }, 91 },
  92 + renderFunc () {
  93 + return this.render || function () {};
  94 + },
74 classes () { 95 classes () {
75 return [ 96 return [
76 this.baseClass, 97 this.baseClass,
@@ -82,7 +103,22 @@ @@ -82,7 +103,22 @@
82 ]; 103 ];
83 }, 104 },
84 contentClasses () { 105 contentClasses () {
85 - return `${this.baseClass}-content`; 106 + return [
  107 + `${this.baseClass}-content`,
  108 + this.render !== undefined ? `${this.baseClass}-content-with-render` : ''
  109 + ];
  110 + },
  111 + contentWithIcon () {
  112 + return [
  113 + this.withIcon ? `${this.prefixCls}-content-with-icon` : '',
  114 + this.render && !this.title && this.withIcon ? `${this.prefixCls}-content-with-render-notitle` : ''
  115 + ];
  116 + },
  117 + messageClasses () {
  118 + return [
  119 + `${this.baseClass}-content`,
  120 + this.render !== undefined ? `${this.baseClass}-content-with-render` : ''
  121 + ];
86 } 122 }
87 }, 123 },
88 methods: { 124 methods: {
@@ -124,7 +160,8 @@ @@ -124,7 +160,8 @@
124 160
125 // check if with desc in Notice component 161 // check if with desc in Notice component
126 if (this.prefixCls === 'ivu-notice') { 162 if (this.prefixCls === 'ivu-notice') {
127 - this.withDesc = this.$refs.content.querySelectorAll(`.${this.prefixCls}-desc`)[0].innerHTML !== ''; 163 + let desc = this.$refs.content.querySelectorAll(`.${this.prefixCls}-desc`)[0];
  164 + this.withDesc = this.render ? true : (desc ? desc.innerHTML !== '' : false);
128 } 165 }
129 }, 166 },
130 beforeDestroy () { 167 beforeDestroy () {
src/components/base/notification/notification.vue
@@ -8,6 +8,8 @@ @@ -8,6 +8,8 @@
8 :type="notice.type" 8 :type="notice.type"
9 :content="notice.content" 9 :content="notice.content"
10 :duration="notice.duration" 10 :duration="notice.duration"
  11 + :render="notice.render"
  12 + :withIcon="notice.withIcon"
11 :closable="notice.closable" 13 :closable="notice.closable"
12 :name="notice.name" 14 :name="notice.name"
13 :transition-name="notice.transitionName" 15 :transition-name="notice.transitionName"
src/components/message/index.js
@@ -31,7 +31,7 @@ function getMessageInstance () { @@ -31,7 +31,7 @@ function getMessageInstance () {
31 return messageInstance; 31 return messageInstance;
32 } 32 }
33 33
34 -function notice (content = '', duration = defaults.duration, type, onClose = function () {}, closable = false) { 34 +function notice (content = '', duration = defaults.duration, type, onClose = function () {}, closable = false, render = function () {}) {
35 const iconType = iconTypes[type]; 35 const iconType = iconTypes[type];
36 36
37 // if loading 37 // if loading
@@ -50,6 +50,7 @@ function notice (content = &#39;&#39;, duration = defaults.duration, type, onClose = fun @@ -50,6 +50,7 @@ function notice (content = &#39;&#39;, duration = defaults.duration, type, onClose = fun
50 <span>${content}</span> 50 <span>${content}</span>
51 </div> 51 </div>
52 `, 52 `,
  53 + render: render,
53 onClose: onClose, 54 onClose: onClose,
54 closable: closable, 55 closable: closable,
55 type: 'message' 56 type: 'message'
@@ -89,7 +90,7 @@ export default { @@ -89,7 +90,7 @@ export default {
89 content: options 90 content: options
90 }; 91 };
91 } 92 }
92 - return notice(options.content, options.duration, type, options.onClose, options.closable); 93 + return notice(options.content, options.duration, type, options.onClose, options.closable, options.render);
93 }, 94 },
94 config (options) { 95 config (options) {
95 if (options.top || options.top === 0) { 96 if (options.top || options.top === 0) {
src/components/notice/index.js
@@ -33,6 +33,7 @@ function notice (type, options) { @@ -33,6 +33,7 @@ function notice (type, options) {
33 const desc = options.desc || ''; 33 const desc = options.desc || '';
34 const noticeKey = options.name || `${prefixKey}${name}`; 34 const noticeKey = options.name || `${prefixKey}${name}`;
35 const onClose = options.onClose || function () {}; 35 const onClose = options.onClose || function () {};
  36 + const render = options.render;
36 // todo const btn = options.btn || null; 37 // todo const btn = options.btn || null;
37 const duration = (options.duration === 0) ? 0 : options.duration || defaultDuration; 38 const duration = (options.duration === 0) ? 0 : options.duration || defaultDuration;
38 39
@@ -42,9 +43,12 @@ function notice (type, options) { @@ -42,9 +43,12 @@ function notice (type, options) {
42 43
43 let content; 44 let content;
44 45
45 - const with_desc = desc === '' ? '' : ` ${prefixCls}-with-desc`; 46 + let withIcon;
  47 +
  48 + const with_desc = (options.render && !title) ? '' : desc === '' ? '' : ` ${prefixCls}-with-desc`;
46 49
47 if (type == 'normal') { 50 if (type == 'normal') {
  51 + withIcon = false;
48 content = ` 52 content = `
49 <div class="${prefixCls}-custom-content ${prefixCls}-with-normal${with_desc}"> 53 <div class="${prefixCls}-custom-content ${prefixCls}-with-normal${with_desc}">
50 <div class="${prefixCls}-title">${title}</div> 54 <div class="${prefixCls}-title">${title}</div>
@@ -53,6 +57,7 @@ function notice (type, options) { @@ -53,6 +57,7 @@ function notice (type, options) {
53 `; 57 `;
54 } else { 58 } else {
55 const iconType = iconTypes[type]; 59 const iconType = iconTypes[type];
  60 + withIcon = true;
56 content = ` 61 content = `
57 <div class="${prefixCls}-custom-content ${prefixCls}-with-icon ${prefixCls}-with-${type}${with_desc}"> 62 <div class="${prefixCls}-custom-content ${prefixCls}-with-icon ${prefixCls}-with-${type}${with_desc}">
58 <span class="${prefixCls}-icon ${prefixCls}-icon-${type}"> 63 <span class="${prefixCls}-icon ${prefixCls}-icon-${type}">
@@ -63,13 +68,14 @@ function notice (type, options) { @@ -63,13 +68,14 @@ function notice (type, options) {
63 </div> 68 </div>
64 `; 69 `;
65 } 70 }
66 -  
67 instance.notice({ 71 instance.notice({
68 name: noticeKey.toString(), 72 name: noticeKey.toString(),
69 duration: duration, 73 duration: duration,
70 styles: {}, 74 styles: {},
71 transitionName: 'move-notice', 75 transitionName: 'move-notice',
72 content: content, 76 content: content,
  77 + withIcon: withIcon,
  78 + render: render,
73 onClose: onClose, 79 onClose: onClose,
74 closable: true, 80 closable: true,
75 type: 'notice' 81 type: 'notice'
src/styles/components/notice.less
@@ -11,10 +11,17 @@ @@ -11,10 +11,17 @@
11 position: fixed; 11 position: fixed;
12 z-index: @zindex-notification; 12 z-index: @zindex-notification;
13 13
  14 + &-content-with-icon{
  15 + margin-left: 51px;
  16 + }
  17 + &-with-desc&-with-icon &-title{
  18 + margin-left: 51px;
  19 + }
  20 +
14 &-notice { 21 &-notice {
15 margin-bottom: @notice-margin-bottom; 22 margin-bottom: @notice-margin-bottom;
16 padding: @notice-padding; 23 padding: @notice-padding;
17 - //border: 1px solid @border-color-split; 24 + border: 1px solid @border-color-split;
18 border-radius: @border-radius-small; 25 border-radius: @border-radius-small;
19 box-shadow: @shadow-base; 26 box-shadow: @shadow-base;
20 background: #fff; 27 background: #fff;
@@ -34,6 +41,12 @@ @@ -34,6 +41,12 @@
34 } 41 }
35 } 42 }
36 43
  44 + &-content-with-render{
  45 + .ivu-notice-desc{
  46 + display: none;
  47 + }
  48 + }
  49 +
37 &-with-desc{ 50 &-with-desc{
38 .@{notice-prefix-cls}-notice-close{ 51 .@{notice-prefix-cls}-notice-close{
39 top: 11px; 52 top: 11px;
@@ -41,8 +54,13 @@ @@ -41,8 +54,13 @@
41 } 54 }
42 } 55 }
43 56
  57 + &-content-with-render-notitle{
  58 + margin-left: 26px;
  59 + }
  60 +
44 &-title { 61 &-title {
45 font-size: @font-size-base; 62 font-size: @font-size-base;
  63 + line-height: @font-size-base + 3; //fixed the bug that the bottom of some letters were hidden just like 'g'
46 color: @title-color; 64 color: @title-color;
47 padding-right: 10px; 65 padding-right: 10px;
48 overflow: hidden; 66 overflow: hidden;
@@ -53,9 +71,6 @@ @@ -53,9 +71,6 @@
53 font-weight: bold; 71 font-weight: bold;
54 margin-bottom: 8px; 72 margin-bottom: 8px;
55 } 73 }
56 - &-with-desc&-with-icon &-title{  
57 - margin-left: 51px;  
58 - }  
59 74
60 &-desc { 75 &-desc {
61 font-size: 12px; 76 font-size: 12px;