【组件2】对话框 - Dialog

确定API

  • 要确保你的API和同行的API没有太大不同,否则用户学习成本变高,不利于我们的UI使用;所以我们就可以去copy下同行的API;
  • 提供两种风格:一是标签风格,二是API风格
  • 创建dialog目录;

搭建Dialog 基本架子

  • <Fragment></Fragment>用于把多个div包起来,但是在页面中却不会渲染出来(有点像<template>),所以经常使用<Fragment></Fragment>来代替<div></div>
  • 我们需要在每个className上都写一遍dui-dialog-,岂不是很麻烦?!所以我们写个函数来统一它吧~
  • 返回函数的函数叫做高阶函数;

添加CSS

  • 这里一个小问题,index.scss要引入到example.tsx中样式才有效!!!!只引入到index.tsx中在预览例子的时候样式不起作用!!!!(应该跟生产开发环境文件设置的入口有关)
  • 想要svg受外面字体颜色的控制,加上fill: currentColor;
  • 跟字体相关可以用px、em,跟布局宽度相关可以用min-width结合em;
  • 属性选择器[class^=xx]代表所有以xx开头的类;

添加事件

1、可以自定义按钮
  • 给dialog一个buttons Props,它是个数组;
  • 所以这时又有个小警告了,因为是个数组,需要给每一项设置key,就用到了React.cloneElement
  • 为什么用React.cloneElement,而不是直接button['key'] = index这样添加属性呢,因为报错啊!!!说不能给只读属性key赋值啊!!!
2、给组件的props设置默认值
Dialog.defaultProps = {
  closeonClickMask: false
}
  • 一般设置过默认值后,这个props就是可选的,interface属性那里加上?
3、ReactDOM.createPortal
  • ReactDOM.createPortal,这是由于层级问题引起的,给dialog的层级越小越好,这样也方便用户自己去改;
  • 一般网站架构师会设定好层级
  • 可以在文档中告诉开发者,你如何写可以覆盖我的层级;


    image.png

注意:为了禁止遮罩层来回滑动,在对话框出现的时候document.body.style.overflow='hidden'document.body.style.paddingRight = '17px',关闭的时候恢复document.body.style.overflow='auto'document.body.style.paddingRight = '0'

给Dialog提供便利的API——alert

  • 动态创建组件,即用ReactDOM.render()把组件渲染进div;
  • 关闭组件呢,即还是用ReactDOM.render()渲染组件,只不过是把组件的visible属性变成false;
  • ReactDOM.unmountComponentAtNode()文档
//创建组件和节点
 const div = document.createElement("div");
  document.body.appendChild(div);
  document.body.style.overflow = 'hidden'
  ReactDOM.render(component, div);
//消除组件和节点
//第一句:把这个组件的visible改成false
ReactDOM.render(React.cloneElement(component, {visible: false}), div)
//第二句:把这个组件从div上卸载下来
ReactDOM.unmountComponentAtNode(div)
 document.body.style.overflow = 'auto'
//第三句:清除这个div
div.remove()

comfirm

modal

  • ReactElement和ReactNode区别:ReactElement只能是标签元素,ReactNode还可以是字符串;
  • modal return一个函数出来,有点类似于闭包的形式;
  • 下面代码中button调用函数的形式,要写一个箭头函数去调用close(这个close函数是modal()return出来的函数),直接onClick={close}的话是不可以的,因为解析器是从右往左执行的,这样直接写,它找不到你声明的close在哪里,放在箭头函数中就可以的原因是,函数是延迟执行的,只有点击按钮时才调用函数; 所以在声明函数的时候不要直接去调用它本身!!!
const openModal = () => {
    const close = modal(
      <div>
        <h1>你好</h1>
        <button style={{ color: "purple" }} onClick={() => close()}>
          close
        </button>
      </div>
    );
  };

三者之前的区别

1、是否有按钮
  • alert只有一个【确认】按钮,按钮没有回调函数;
  • comfirm有【取消】、【确认】按钮,且按钮有各自的回调函数;
  • modal没有按钮;
2、传的内容
  • alert和comfirm传的内容仅仅是字符串;
  • modal不仅可以传字符串,还可以传元素,但要保证只有一个根元素;

重构

image.png
  • 写完代码请立即重构,消除重复的代码;
  • 看上图,抽出每个API中的part,可以看出它们的组成很相近,所以可以把它们写成一个公共的函数;

总结

  • scopedClass 高阶函数;
  • React.Fragment
  • 使用&&或者三元表达式来做条件判断,一般不用if...else...来写条件判断,有点麻烦;
  • ReactDOM.createPortal传送门,可以使元素脱离当前位置到达你指定的节点位置;
  • 如何动态去生成一个组件;
  • 闭包传API;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容