每天进步一点点〜

Ant Design of React //蚂蚁金服设计平台。需要应用何种类型组件可参考API

React + mobx + nornj 开发模式文件说明:

【1】。A.t.html (.html / .scss / .js  /  文件包路径:src/web/pages)

-->html代码 (页面设计,各种标签。标签有哪些属性及用法参考“Ant Design of React”) /

【2】。A.m.scss

-->样式 (页面显示样式统一管理)  /

【3】。A.js

--> javascript代码,事件操作。  /

【4】。AStore.js  (src/stores/pages包下面)

-->路由页面 (用于与后端交互,获取数据,并将数据返回给A.js,render渲染到页面)/

(一)。Modal对话框:

项目需求:注册一个用户,当用户点击“注册”按钮时,会将之前注册的数据替换掉。因此,需要提示两次,以警示用户“确定要注册!”

该代码实现:较验文本数据必填 & 正则 |  比较密码输入是否一致 | 弹出提示框

实现代码/html :

 <!--注册用户-->
<template name="registUser">
<ant-Modal width={} visible="{certificateregistList.showRegistUser}" footer={null} onCancel={onAddModalCancel}>
<ant-Tabs>
<ant-TabPane tab="注册用户" />
</ant-Tabs>
<fj-Row class="{styles.btn}">
<fj-Col offset="" l="" >
<ant-Form onSubmit={handleRegister}>
<ant-FormItem label="用户名" {...formItemParams()}>
<#userID>
<ant-input class="{styles.input}" placeholder="请输入用户名!"/>
</#userID>
</ant-FormItem>
<ant-FormItem label="密码" {...formItemParams()}>
<#userPwd>
<ant-input type="password" class="{styles.input}" placeholder="请输入用户密码!"/>
</#userPwd>
</ant-FormItem>
<ant-FormItem label="确认密码" {...formItemParams()}>
<#userConfirmPwd>
<ant-input type="password" class="{styles.input}" placeholder="请再次输入密码!"/>
</#userConfirmPwd>
</ant-FormItem>
<ant-FormItem label="最大次数" {...formItemParams()}>
<#maxNum>
<ant-input class="{styles.input}" placeholder="可以重复申请的最大次数!"/>
</#maxNum>
</ant-FormItem>
<div class="{styles.deploy_button}">
<ant-Button style="margin-left:168px;" type="primary" class="btn" htmlType="submit" disabled="{certificateregistList.showRegistBtn}">注册</ant-Button>
</div>
</ant-Form>
</fj-Col>
</fj-Row>
</ant-Modal>
</template>

实现代码/js :

 //注册用户
@registerTmpl('RegistUser')
@inject('store')
@Form.create()
@observer
export class RegistUser extends Component{
// 用户名
userID(options) {
return this.props.form.getFieldDecorator('userID', {
rules: [{ required: true, message: '请填写用户名!' }],
})(options.result());
} // 用户密码
userPwd(options) {
return this.props.form.getFieldDecorator('userPwd', {
rules: [{ required: true, message: '请填写用户密码!' },
{pattern:/^[a-zA-Z]\w{,}$/,message: '密码只能以字母开头,长度在6~20,只能包含字母、数字和下划线!' },],
})(options.result());
} // 重复用户密码
userConfirmPwd(options) {
return this.props.form.getFieldDecorator('userConfirmPwd', {
rules: [{ required: true, message: '请确认用户密码!' },
{pattern:/^[a-zA-Z]\w{,}$/,message: '密码只能以字母开头,长度在6~20,只能包含字母、数字和下划线!' },
{validator: this.verifyPassword,}],
})(options.result());
} //重复申请证书的最大次数
maxNum(options){
return this.props.form.getFieldDecorator('maxNum', {
rules: [{ required: true, message: '请填写申请证书最大次数!' },
{pattern:/^([-]|)$/,message: '请输入>0且<=10的正整数数字!' }],
})(options.result());
} //较验两次输入密码是否一致
verifyPassword = (rule, value, callback) => {
const form = this.props.form;
if (value && value !== form.getFieldValue('userPwd')) {
callback('两次输入密码不一致!');
} else {
callback();
}
} //取消【遮罩】
@autobind
onAddModalCancel() {
this.props.store.certificateregistList.setShowRegistUser(false);
} //注册提交
@autobind
handleRegister(e){
const { store: { certificateregistList } } = this.props;
e.preventDefault(); //阻止未填项
this.props.form.validateFields((err, values) => {
if (!err) {
var attrs=[{
"Name":"hf.Revoker",
"Value":"true",
}] let param={
"ID": values.userID,
"Type": "user", //用户类型,要求固定值为user
} //弹出框警告提示
Modal.confirm({
title: '注册后,已有用户将会被覆盖!!!',
content: '',
onOk() { //确认后再提示。。
Modal.confirm({
title: '确认注册新用户!!!',
content: '已有用户将会被覆盖...',
onOk() { //确认后注册
const closeLoading = Message.loading('正在保存数据...', );
certificateregistList.setShowRegistBtn(true); //控制注册按钮显示
Promise.all([
certificateregistList.getRegister(param), //注册用户
]).then(()=> {
certificateregistList.setShowRegistBtn(false);
closeLoading();
});
},
onCancel() {},
});
},
onCancel() {},
});
}
});
} render() {
const { store: { certificateregistList } } = this.props;
return tmpls.registUser(this.props, this, {
styles,
certificateregistList,
});
}
}

(二)。Tag标签:

业务需求:数据动态加载,每行后追加一个Tag标签,点击Tag标签后,对应显示文本框,可以录入值并将值进行显示。。。

效果:

代码如下所示:

【1】。html

 <template name="storageExpand">
<ant-Form onSubmit={handleSubmit} layout="vertical">
<p><b>存储名称:</b>{xx.xx.name}</p>
<#each {{nodeList}}>
<p>
<b>Node{{@index | +()}}:</b><br/>
<#each {{xx}}>
{{this}},
</#each>
</b>&nbsp;&nbsp;IP:
<#each {{xx}}>
{{this}},
</#each>
</b>&nbsp;&nbsp;设备:
<#each {{xx}}>
{{this}},
</#each> <!--tag标签值-->
<#each {{tags}}>
<#if {{isLongTag}}>
<ant-Tooltip title={@item} key={@item}>
{tagItem(@item,@index)}
</ant-Tooltip>
<#else>
{tagItem(@item,@index)}
</#else>
</#if>
</#each> <!--控制显示tag标签还是文本框,初始显示tag标签-->
<#if {{inputVisible}}>
{inputItem(@index)}
<#else>
{addItem(@index)}
</#else>
</#if>
</p>
</#each>
<p><b>存储:</b>{xx || "空"}</p>
<p><b>Master:</b>{{xx ? ('是', '否') }}</p>
<div class="{styles.btnArea}">
<ant-Button class="{styles.btn}" type="primary" htmlType="submit" disabled="{showExpand}">扩容</ant-Button>
</div>
</ant-Form>
</template>

【2】。js

 import React, { Component } from 'react';
import { findDOMNode } from 'react-dom';
import { observable, computed, toJS } from 'mobx';
import { observer, inject } from 'mobx-react';
import nj from 'nornj';
import { registerTmpl } from 'nornj-react';
import { autobind } from 'core-decorators';
import Input from 'flarej/lib/components/antd/input';
import Icon from 'flarej/lib/components/antd/icon';
import Tag from 'flarej/lib/components/antd/tag';
import Message from 'flarej/lib/components/antd/message';
import Form from 'flarej/lib/components/antd/form';
import Notification from '../../../utils/notification';
import styles from './storageManager.m.scss';
import tmpls from './storageManager.t.html'; //存储扩容功能
@registerTmpl('StorageExpand')
@inject('store')
@Form.create()
@observer
export default class StorageExpand extends Component{
@observable nodeList=[]; //获取设备信息,组成新数组对象。
@observable obj = {
inputVisible: false,
tags: [],
}
@observable inputVisible=false; //控制显示tag标签 OR 文本框
@observable inputValue=''; //文本框输入值
@observable isLongTag = false; //是否是长字符,控制是否显示Tooltip
@observable showExpand=false; //控制显示【扩容】按钮 componentWillMount() {
const { store: { storageManager } } = this.props;
this.nodeList = storageManager && storageManager.xx && storageManager.xx.xx;
this.nodeList = this.nodeList.map((value, key)=>{
return value = {...value, ...this.obj};
});
} componentDidUpdate() { } //当inputVisible=false时,显示tag标签.(即初始进入显示tag标签)
addItem = (index) => (
<Tag
onClick={()=>this.showInput(index)}><Icon type="plus" />添加
</Tag>
) //点击tag标签,添加时,显示文本框。
showInput = (index) => {
this.nodeList[index].inputVisible=true;
} //点击tag标签,显示文本框供用户录入数据
inputItem = (index) => (
<Input
type="text"
size="small"
style={{"width": }}
value={this.inputValue}
onChange={this.handleInputChange}
onBlur={()=>this.handleInputConfirm(index)}
onPressEnter={()=>this.handleInputConfirm(index)}
/>
) handleInputChange = (e) => {
this.inputValue=e.target.value;
this.isLongTag = this.inputValue.length >= ? true : false;
} handleInputConfirm = (index) => {
const inputValues = this.inputValue;
let newTags = this.nodeList[index].tags ? [...this.nodeList[index].tags] : []
if (inputValues && newTags.indexOf(inputValues) === -) {
newTags = [...newTags, inputValues];
}
this.nodeList[index].tags=newTags;
this.inputValue='';
this.nodeList[index].inputVisible=false;
} //文本框失去焦点后,将值赋给tag标签,用于在页面显示。
tagItem = (tag, index) => {
return (
<Tag
key = {tag}
closable = {index !== -}
afterClose = {() => this.handleClose(tag, index)}
>
{this.isLongTag ? `${tag.slice(, )}...` : tag}
</Tag>
)
}; //移出添加的标签内容
handleClose = (removedTag, index) => {
const newTags = this.nodeList[index].tags.filter(tag => tag !== removedTag);
this.nodeList[index].tags=newTags;
} //扩容触发事件
@autobind
handleSubmit(e){
const { store: { storageManager } } = this.props;
e.preventDefault();
var storageContent=[];
this.nodeList.map((value, key)=>{
var option = {
"manage":[],
"storage":[],
"devices":[],
"zone":
};
option.manage.push(this.nodeList[key].manage[]); //节点名
option.storage.push(this.nodeList[key].storage[]); //IP
option.devices.push(this.nodeList[key].devices[]);
for(let i=;i<this.nodeList[key].tags.length;i++){
option.devices.push(this.nodeList[key].tags[i]); //设备-新添加
}
storageContent.push(option);
});
let param={
"xx":xx
};
this.showExpand=true; //控制按钮不可用
const closeLoading = Message.loading('正在保存数据...', );
Promise.all([
storageManager.getSaveStorage(param), //保存数据
]).then(() => {
this.showExpand=false;
closeLoading();
});
} render() {
const { store: { storageManager } } = this.props;
return tmpls.storageExpand(this.state, this.props, this, {
styles,
storageManager,
});
}
}

前端004/React常用UI组件的更多相关文章

  1. 五、vue常用UI组件

    下面简单的总结下vue常用的一些UI 组件,有一些我也没怎么用过,这里先罗列出来,便于自己后面使用的时候查找方便,大家有更好的可以给我推荐哦~ vuex: vux github ui demo:htt ...

  2. 「前端」尚妆 UI 组件库工程实践(weex vue)

    本文来自尚妆前端团队南洋 发表于尚妆github博客,欢迎订阅! 前言 尚妆大前端团队使用 weex 进行三端统一开发有一段时间了,截止本文发表「达人店」APP大部分页面都已经用 weex 进行了重构 ...

  3. VUE常用UI组件插件及框架

    UI组件及框架 element - 饿了么出品的Vue2的web UI工具套件 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开源 UI 组件库 Keen-UI - ...

  4. 前端如何搭建vue UI组件库/封装插件(从零到有)

    需求 因之前是做外包项目居多,经常用到相同的组件,之前的办法是在一个项目中写一个组件,其他项目直接将compents下的组件复制,粘贴到项目中使用,缺点是维护起来,改一个项目,其他项目也需要修改,所以 ...

  5. [闲的蛋疼系列]从零开始用TypeScript写React的UI组件(0)-先写一个Button??

    0.咸鱼要说的 一入前端深似海,咸鱼入海更加咸. 最近闲的蛋疼,手上年前的事也完成了7788了,借助[PG1]的话来说,我们要keep real. 咸鱼肯定不real 了,因为我们都活在梦里,所以咱们 ...

  6. vue常用UI组件

    Mint UI 项目主页:http://mint-ui.github.io/#!/zh-cn demo:http://elemefe.github.io/mint-ui/#/ github地址:htt ...

  7. 《转》vue 常用ui组件

    vux github ui demo:https://github.com/airyland/vux Mint UI 项目主页:http://mint-ui.github.io/#!/zh-cndem ...

  8. 使用CRA开发的基于React的UI组件发布到内网NPM上去

    前言:构建的ES组件使用CNPM发布内网上过程 1. 使用Create-React-APP开的组件 如果直接上传到NPM,你引用的时候会报: You may need an appropriate l ...

  9. vue 常用ui组件库

    vux github ui demo:https://github.com/airyland/vux Mint UI 项目主页:http://mint-ui.github.io/#!/zh-cn de ...

随机推荐

  1. NNIE(待尝试)

    马克 https://blog.csdn.net/ywcpig/article/details/85260752 https://blog.csdn.net/u011728480/article/de ...

  2. linux添加头文件路径

    gcc demo.c -o demo  -I/tools/libevent/include -L/tools/libevent/lib -levent -I:头文件目录 -L:静态库目录 -l:静态库 ...

  3. DevExpress v18.2版本亮点——Analytics Dashboard篇(一)

    行业领先的.NET界面控件——DevExpress v18.2版本亮点详解,本文将介绍了DevExpress Analytics Dashboard v18.2 的版本亮点,新版30天免费试用!点击下 ...

  4. SpringCloud创建Eureka

    Eureka是什么 Eureka是Netflix的一 个子模块,也是核心模块之一- .Eureka是一 个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务 ...

  5. postman实现Base64加密

    1.新建一个Collection 2.新建一个request 3.新增一个环境变量(全局变量也可以) 4.在variable中填入需要加密的变量名称,比如password 5.在body中填好参数,需 ...

  6. 关于sword框架浏览器上方小图标的修改

    sword框架默认有一个document.ejs文件,可以导出html模板(找了很久没找到index.html,哈哈哈),里面有一行代码 这个href就是代表着浏览器上方图标的路径. 在public文 ...

  7. 运行biggan demo

    http://www.zhuanzhi.ai/document/8705953a704e1bf8e051c161d1587d88

  8. 封装插件并发布到npm的历程

    1.封装插件 2.使用webpack打包的时候发生了很多问题 3.过程很反复 4.但最终还是发布成功了

  9. git的初步研究1

    工作中很多项目再往git上迁移,所以打算研究下git git是个版本控制系统 理解git工作区.暂存区.版本库的概念 工作区:在电脑中能看到的目录 暂存区:index即索引 即首先add加入暂存区 c ...

  10. 如何用 Jmeter 获取 Cookie

    如何用 Jmeter 获取 Cookie 1.Jmeter 安装目录bin文件加下jmeter.properties文件修改,搜索CookieManager.save.cookies= 将Cookie ...