Modal

Modal 组件,用于弹出内容,实现 alert、confirm、prompt、loading、actions、popup 等效果。

组件

Modal

<Modal> 组件,渲染模态窗内容。

Props

role
PropType: enum('alert', 'confirm', 'prompt', 'loading', 'actions', 'popup')

Modal 形式,不设置时为普通的模态窗口。

isOpen
PropType: bool

Modal 是否为打开状态。

title
PropType: node

Modal 标题。

confirmText
PropType: string

确定按钮文字,默认为「确定」。

cancelText
PropType: string

取消按钮文字,默认为「取消」。

closeBtn
PropType: bool

是否显示关闭按钮,默认为 true

closeViaBackdrop
PropType: bool

点击遮罩层是否关闭 Modal。

onAction
PropType: func

用户点击「确定」或「取消」按钮时的处理函数。

roleprompt 时,通过该函数的返回值可以控制按钮点击时是否关闭 Modal。

onOpen
PropType: func

Modal 打开时的回调函数。

onClosed
PropType: func

Modal 关闭以后的回调函数。

onDismiss
PropType: func

用户请求关闭操作时的处理函数。

方法

调用方式见示例代码。

Modal 实现方式调整,请勿直接调用其方法。

.open()

打开 Modal。

.close()

关闭 Modal。

示例

  1. import React from 'react';
  2. import {
  3. Container,
  4. Group,
  5. Button,
  6. ButtonGroup,
  7. Modal,
  8. Field,
  9. List,
  10. Icon,
  11. } from 'amazeui-touch';
  12. const ModalExample = React.createClass({
  13. getInitialState() {
  14. return {
  15. isModalOpen: false,
  16. };
  17. },
  18. openModal() {
  19. this.setState({
  20. isModalOpen: true,
  21. })
  22. },
  23. closeModal() {
  24. this.setState({
  25. isModalOpen: false,
  26. });
  27. },
  28. onOpen() {
  29. console.log('modal open....');
  30. },
  31. onClosed() {
  32. console.log('modal closed....');
  33. },
  34. handleAction(data) {
  35. let role = this.getModalRole();
  36. // 确定和取消放在一起处理
  37. // data 为 true 时为 `确定`
  38. if (role === 'confirm') {
  39. console.log('你的选择是:「' + (data ? '确定' : '取消') + '」')
  40. } else if (role === 'prompt') {
  41. // `prompt` 类型支持通过返回值控制是否关闭 Modal
  42. // 点击取消时 data 的值为 null
  43. // 简单的验证逻辑
  44. // 仅适用于一个输入框的场景,多个输入框的 data 值为 `['', '', ...]`
  45. if (data === '') {
  46. console.error('赶紧交出来啊,不然...你懂的...');
  47. return false; // 点击确定时不关闭 Modal
  48. }
  49. console.log('输入的数据是:', data);
  50. return true; // 点击确定时关闭 Modal
  51. }
  52. },
  53. getModalRole() {
  54. return this.props.modalProps.role;
  55. },
  56. render() {
  57. return (
  58. <div>
  59. <Button
  60. amStyle='primary'
  61. onClick={this.openModal}
  62. >
  63. {this.props.title}
  64. </Button>
  65. <Modal
  66. ref="modal"
  67. isOpen={this.state.isModalOpen}
  68. onDismiss={this.closeModal}
  69. onOpen={this.onOpen}
  70. onClosed={this.onClosed}
  71. onAction={this.handleAction}
  72. {...this.props.modalProps}
  73. >
  74. {this.getModalRole() !== 'loading' && this.props.children}
  75. </Modal>
  76. </div>
  77. );
  78. }
  79. });
  80. const LoginModal = React.createClass({
  81. getInitialState() {
  82. return {
  83. isOpen: false,
  84. };
  85. },
  86. open() {
  87. this.setState({
  88. isOpen: true,
  89. })
  90. },
  91. close() {
  92. this.setState({
  93. isOpen: false,
  94. });
  95. },
  96. handleLogin(e) {
  97. let userName = this.refs.userName;
  98. let pwd = this.refs.pwd;
  99. if (!userName.getValue() || !pwd.getValue()) {
  100. this.setState({
  101. invalid: true
  102. });
  103. userName.getFieldDOMNode().focus();
  104. return;
  105. }
  106. this.setState({
  107. invalid: false
  108. }, () => {
  109. console.info('Valid, do something else.');
  110. this.close();
  111. });
  112. },
  113. render() {
  114. return (
  115. <Group
  116. header="Login Modal"
  117. >
  118. <Button
  119. amStyle="success"
  120. onClick={this.open}
  121. >
  122. Login
  123. </Button>
  124. <Modal
  125. isOpen={this.state.isOpen}
  126. title="Login"
  127. onDismiss={this.close}
  128. >
  129. <List
  130. className="margin-v-sm"
  131. >
  132. <List.Item
  133. media={<Icon name="person" />}
  134. nested="input"
  135. >
  136. <Field
  137. ref="userName"
  138. placeholder='User Name'
  139. />
  140. </List.Item>
  141. <List.Item
  142. media={<Icon name="info" />}
  143. nested="input"
  144. >
  145. <Field
  146. ref="pwd"
  147. type="password"
  148. placeholder='PassWord'
  149. />
  150. </List.Item>
  151. </List>
  152. {this.state.invalid ? <p style={{color: 'red'}}>请填写相关信息</p> : null}
  153. <ButtonGroup justify>
  154. <Button
  155. onClick={this.close}
  156. >
  157. Cancel
  158. </Button>
  159. <Button
  160. amStyle="primary"
  161. onClick={this.handleLogin}
  162. >
  163. Login
  164. </Button>
  165. </ButtonGroup>
  166. </Modal>
  167. </Group>
  168. );
  169. }
  170. });
  171. const ModalExamples = React.createClass({
  172. render() {
  173. return (
  174. <Container {...this.props}>
  175. <Group
  176. header="默认 Modal"
  177. >
  178. <ModalExample
  179. title="普通 Modal"
  180. modalProps={{
  181. title: 'Modal 标题',
  182. }}
  183. >
  184. Hello, Modal 内容
  185. </ModalExample>
  186. </Group>
  187. <Group
  188. header="Alert"
  189. >
  190. <ModalExample
  191. title="Alert Modal"
  192. modalProps={{
  193. role: 'alert',
  194. title: 'Amaze UI',
  195. }}
  196. >
  197. 这一个 Alert 窗口。
  198. </ModalExample>
  199. </Group>
  200. <Group
  201. header="Confirm"
  202. >
  203. <ModalExample
  204. title="Confirm Modal"
  205. modalProps={{
  206. role: 'confirm',
  207. title: 'Amaze UI',
  208. }}
  209. >
  210. 这一个 Confirm 窗口。
  211. </ModalExample>
  212. </Group>
  213. <Group
  214. header="Prompt"
  215. >
  216. <ModalExample
  217. title="Prompt Modal"
  218. modalProps={{
  219. role: 'prompt',
  220. title: 'Amaze UI',
  221. }}
  222. >
  223. 输入你的 IQ 卡密码:
  224. <Field placeholder=" IQ 卡密码交出来" />
  225. </ModalExample>
  226. </Group>
  227. <Group
  228. header="多个输入框"
  229. >
  230. <ModalExample
  231. title="Prompt Modal"
  232. modalProps={{
  233. role: 'prompt',
  234. title: 'Login',
  235. }}
  236. >
  237. <div className="form-set">
  238. <Field placeholder="Name." />
  239. <Field placeholder="Password." />
  240. </div>
  241. </ModalExample>
  242. </Group>
  243. <Group
  244. header="Loading"
  245. >
  246. <ModalExample
  247. title="Loading Modal"
  248. modalProps={{
  249. title: '使劲加载中...',
  250. role: 'loading'
  251. }}
  252. />
  253. </Group>
  254. <Group
  255. header="Actions"
  256. >
  257. <ModalExample
  258. title="Actions Modal"
  259. modalProps={{
  260. role: 'actions'
  261. }}
  262. >
  263. <div className="modal-actions-group">
  264. <List>
  265. <List.Item className="modal-actions-header">分享到</List.Item>
  266. <List.Item>微信</List.Item>
  267. <List.Item className="modal-actions-alert">
  268. Twitter</List.Item>
  269. </List>
  270. </div>
  271. </ModalExample>
  272. </Group>
  273. <Group
  274. header="Popup"
  275. >
  276. <ModalExample
  277. title="Popup Modal"
  278. modalProps={{
  279. role: 'popup',
  280. title: '爱过什么女爵的滋味',
  281. }}
  282. >
  283. <p>为你封了国境<br />为你赦了罪<br />为你撤了历史记载<br />为你涂了装扮<br />为你喝了醉<br />为你建了城池围墙<br />一颗热的心穿着冰冷外衣<br />一张白的脸漆上多少褪色的情节<br />在我的空虚身体里面<br />爱上哪个肤浅的王位<br />在你的空虚宝座里面<br />爱过什麽女爵的滋味<br />为你封了国境
  284. </p><p>为你赦了罪<br />为你撤了历史记载<br />一颗热的心<br />穿着冰冷外衣<br />一张白的脸<br />漆上多少褪色的情节<br />在我的空虚身体里面<br />爱上哪个肤浅的王位<br />在你的空虚宝座里面<br />爱过什麽女爵的滋味<br />在我的空虚身体里面<br />爱上哪个肤浅的王位<br />在你的空虚宝座里面<br />爱过什麽女爵的滋味
  285. </p>
  286. </ModalExample>
  287. </Group>
  288. <LoginModal />
  289. </Container>
  290. );
  291. }
  292. });
  293. export default ModalExamples;

DemoCopy

Version: 1.0.0

原文: http://t.amazeui.org/#/docs/modal