Ant Design 学习记录
遇到的问题:
- 点击列表中的一个字段 , 显示出一条指定id(其他筛选条件的)数据
解决这个问题之前,要先了解 Antd的 Table中的 Column 列描述数据对象,是 columns 中的一项,Column 使用相同的 API。 官网地址
从中我们可以知道 : render 生成复杂数据的渲染函数,参数分别为(当前行的值,当前行数据,行索引),@return 里面可以设置表格行/列合并 类型是函数 (text, record, index) => { }
点击后弹出以下列表
解决:
两种写法 :
- 直接给子组件传 props值, 然后子组件渲染this.props.item
- 给子组件传id值,然后子组件通过URL传给后台,后台筛选出满足条件的数据。
import React, {Component} from 'react';
import { PageHeader, Table, Input, Card } from "antd";
import HttpUtils from "../../utils/HttpUtils";
import moment from "moment";
import FilterForm from "../../components/Filter";
import Team from './StatisticalTeam';
import Share from './StatisticalShare';
import User from './StatisticalUser'; const {TextArea} = Input;
const select = [
{
name: '时间',
type: 'date',
dataIndex: ['start_time', 'end_time'],
// wrap: 24
}
] export default class Hello extends Component {
constructor(props) {
super(props);
this.state = {
form: {
pers: ,
page:
},
loading:false,
values: {},
dataSource: [],
value: '',
count: ''
};
this.columns = [
{
width:,
title: '记录创造时间',
dataIndex: 'first_day',
key: 'first_day',
render: (props) => {
// return this.timestampToTime(props);
const time = this.timestampToTime(props);
return moment(time).format('YYYY-MM-DD hh:mm:ss')
}
},
{
title: '分享',
dataIndex: 'share_award_real_amount',
key: 'share_award_real_amount',
render: (text, record) => {
return (
<div
onClick={() => {
this.setState({
visible_pwd: true,
user_id: record.id
})
}} style={{marginRight: , cursor: "pointer", color: '#40a9ff'}}
>
<Share item={record} loadUserList={()=> {
this._loadUserList()
}}/>
</div>
)
}
}, {
title: '团队',
// dataIndex: 'share_award_real_amount',
// key: 'share_award_real_amount',
render: (text, record) => {
return (
<div
onClick={() => {
this.setState({
visible_pwd: true,
user_id: record.id
})
}} style={{marginRight: , cursor: "pointer", color: '#40a9ff'}}
>
<Team item={record} loadUserList={()=> {
this._loadUserList()
}}/>
</div>
)
}
}, {
width: ,
title: '用户',
render: (text, record) => {
return (
<div
onClick={() => {
this.setState({
visible_pwd: true,
user_id: record.id
})
}} style={{marginRight: , cursor: "pointer", color: '#40a9ff'}}
>
<User happy={record} item={record} loadUserList={()=> {
this._loadUsreList()
}}/>
</div>
)
} },
]
}; componentDidMount() {
this.getUserList()
}
//处理六位小数
toDecimal=(x)=>{
var f = parseFloat(x);
if (isNaN(f)) {
return;
}
f = Math.round(x*)/;
return f;
}
//处理时间戳
timestampToTime = (timestamp) => {
var date = new Date(timestamp * );//时间戳为10位需*1000,时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth()+ < ? ''+(date.getMonth()+) : date.getMonth()+) + '-';
var D = date.getDate() + ' ';
var h = date.getHours() + ':';
var m = date.getMinutes() + ':';
var s = date.getSeconds();
return Y+M+D+h+m+s;
} getUserList() {
this.setState({loading:true})
HttpUtils.postForm('/api/auex/statistics/award/list', {
...this.state.form,
order: "id desc",
...this.state.values
}).then(res => {
this.setState({loading:false})
if (res.status == ) {
this.setState({
dataSource: res.data,
count: res.count
})
}
console.log(res);
}).catch(err => {
this.setState({loading:false})
window.$message.error('通讯失败')
})
} onSubmit = (value) => {
console.log(value)
this.setState({
form: {
page: ,
pers: this.state.form.pers, },
values: value
}, () => {
this.getUserList()
})
}
onReset = () => {
this.setState({
values: {}
}, () => {
this.getUserList();
})
} getCurrent = (page) => {
console.log(page)
this.setState({
form: {
page: page,
pers: this.state.form.pers
}
}, () => this.getUserList())
}
changePers = (current, size) => {
this.setState({
form: {
page: current,
pers: size
}
}, () => this.getUserList())
} render() {
return (
<div>
<PageHeader title="用户列表" subTitle="查看用户信息" style={{marginBottom: }}/>
<FilterForm select={select} onSubmit={this.onSubmit} onReset={this.onReset} />
<Card>
<Table
loading={this.state.loading}
dataSource={this.state.dataSource}
columns={this.columns }
title={() => `记录条数:${this.state.count}条`}
pagination={{
showTotal: (total) => {
return <div style={{display: 'flex'}}>
<div style={{paddingLeft: }}>总共{total}条</div>
</div>
},
showSizeChanger: true,
onShowSizeChange: this.changePers,
pageSizeOptions: ['', '', '', ''],
showQuickJumper: true,
current: this.state.form.page,
total: this.state.count,
onChange: this.getCurrent
}}
/>
</Card>
</div>
)
};
}
列表页面
补充:
0.给子组件传值 : <Share happy={record} loadUserList={()=> {this._loadUserList()}}/> 子组件接收值
1.设置state中值的时候 不要直接赋值 , 要 使用规范写法
this.setState({
visible_father: true
})
2.子组件接到数后不能展示列表?
onClick={() => {
this.setState({
visible_father: true //修改列表展示为true
})
}}
3.dataSource中的数据this.props.item 是对象 所以要再外面加一个[] 使其变为数组
4.const {number, visible_father, data, loading,} = this.state; 解构赋值后 , 就不需要在this.state.xxx了
5.<Modal /> 有个visible属性,表示是否显示对话框。
占位
需要掌握的:
1.Form表单
Form.create 经过
Form.create
包装的组件将会自带this.props.form
属性,this.props.form
常用API : getFieldDecorator 用于和表单进行双向绑定,详见下方描述
class CustomizedForm extends React.Component {} CustomizedForm = Form.create({})(CustomizedForm);
this.props.form.getFieldDecorator(要传的值, options)
经过 getFieldDecorator
包装的控件,表单控件会自动添加 value
(或 valuePropName
指定的其他属性) onChange
(或 trigger
指定的其他属性),数据同步将被 Form 接管,这会导致以下结果:
你不再需要也不应该用
onChange
来做同步,但还是可以继续监听onChange
等事件。你不能用控件的
value
defaultValue
等属性来设置表单域的值,默认值可以用getFieldDecorator
里的initialValue
。你不应该用
setState
,可以使用this.props.form.setFieldsValue
来动态改变表单值(可以设置默认值)。
- validateFields 校验并获取一组输入域的值与 Error,若 fieldNames 参数为空,则校验全部组件 / resetFields 重置一组输入控件的值(为
initialValue
)与状态,如不传入参数,则重置所有组件
handleSubmit = (e) => {
e.preventDefault();
this.props.form.validateFields((err, values) => {
if (err) {
return;
}
values.rate = values.rate / ;
window.$http.postForm('/api/', {...this.state.item,...values}).then(res => {
if (res.status === ) {
window.$message.success('提交成功!');
this.props.form.resetFields();
this.setState({visible: false})
this.getBonusList()
} else {
window.$message.error(res.message);
}
}).catch((err) => {
window.$message.error('通讯失败');
})
});
}
- Form.Item 表单域
2. Affix 固钉 https://ant.design/components/affix-cn/#header
注意:Affix
内的元素不要使用绝对定位,如需要绝对定位的效果,可以直接设置 Affix
为绝对定位:
<Affix style={{ position: 'absolute', top: y, left: x }}>...</Affix>
3.Card 卡片 https://ant.design/components/card-cn/#header
4.父子传值 , 传方法
首先父组件调用子组件,写一个item = { recodr(columns表单所有数据) } 写一个 refreshList方法
然后再子组件调用 (使用this.props.XXX)调用父组件的XXX
调用属性 (这里又把父组件的值传给了子组件CustomForm)
<CustomForm
content={this.state.content} onSubmit={this.onSubmit} url={'/api/backend/distribution/time/category/save'}
value={{ id: this.props.item.id }}
values={this.props.item}
space={}
/> 调用方法 onSubmit = () => {
this.setState({
visible: false
})
this.props.refreshList()
}
5.弹窗 Modal
6.文本域: const { textArea } = Input 去掉右下角调整大小按键 : CSS resize:none;
7.上传图片 Upload
8.修改状态
{
// width: 150,
title: '操作',
dataIndex: 'status', //verified
key: 'status',
render: (text, item) => (
<>
{item.status != ? null :
<Switch
checked={text === }
onChange={() => {
this.changeStatus(text, item.id);
}}
/>}
</>
)
}
9.删除一行记录
{
title: '操作',
render: (text, item) => {
return (
<div>
<Button size={'small'} type={'primary'} onClick={() => {
this.props.history.push('/content/carousel/edit/' + item.id)
}}>
编辑
</Button>
<Popconfirm
title="确定要删除吗?"
okText="确定"
cancelText="取消"
onConfirm={() => {
window.$http.postForm('/api/web/carousel/delete', {id: item.id}).then(res => {
if (res.status === ) {
window.$message.success('删除成功');
this._loadNewsList()
} else if (res.status !== ) {
window.$message.error(res.message);
}
})
}}
>
<Button size={'small'} type={'danger'} style={{marginLeft: }} onClick={() => {
}}>删除</Button>
</Popconfirm>
</div>
);
}
}
10 徽标微
import {Badge} from '@ant-design/react-native'; <Badge dot>
<Touchable style={{position: 'relative'}}>
<Image source={message} />
</Touchable>
</Badge>
import {Badge} from '@ant-design/react-native'; <Badge dot>
<Touchable style={{position: 'relative'}}>
<Image source={message} />
</Touchable>
</Badge>
11. 从接口获取交易对 / 列表数组
getSymobls() {
HttpUtils.postForm('/api/teacher/trade/exchange/symbols', {}).then(res => {
if (res.status === ) {
let arr1 = new Set(res.data.map((item) => item.symbol))
let symbol = Array.from(arr1).map(item => ({id: item, name: item}));
select[].option = symbol; //添加列表
this.setState({
select: this.state.select,
})
}
}).catch((err) => {
console.log(err);
})
}
12.如何看懂ant的文档
这里提供了2中格式化方式
第一种 告诉你了 value是Date值(日期),date是字符串 ,所以 写法如下
format={(value) => moment(value).format('YYYY.MM')}
Ant Design 学习记录的更多相关文章
- Ant Design 错误记录
Ant Design 错误记录 一: 标签页Tabs 1:设置activeKey或defaultActiveKey,绑定默认值不起作用: => 需要同时设置activeKey和defaul ...
- Ant Design项目记录和CSS3的总结和Es6的基本总结
这里主要是介绍自己运用ANT框架的一些小总结,以前写到word里,现在要慢慢传上来, 辅助生殖项目总结:从每个组件的运用的方法和问题来总结项目. 1.项目介绍 辅助生殖项目主要运用的是Ant.desi ...
- 【后台管理系统】—— Ant Design Pro入门学习&项目实践笔记(三)
前言:前一篇记录了[后台管理系统]目前进展开发中遇到的一些应用点,这一篇会梳理一些自己学习Ant Design Pro源码的功能点.附:Ant Design Pro 在线预览地址. Dashboard ...
- Ant Design使用问题记录
公司的测试管理平台前端使用的是Ant Design of React框架,后台使用的是python,数据库用的是mysql.没有参与前期的开发,听说是工作了10年积累下来的一个暂且可用的管理平台,开发 ...
- Vue3学习(二)之集成Ant Design Vue
一.集成Ant Design Vue npm install ant-design-vue@2.0.0-rc.3 --save 兼容性 Ant Design Vue 2.x 支持所有的现代浏览器. 如 ...
- React学习及实例开发(二)——用Ant Design写一个简单页面
本文基于React v16.4.1 初学react,有理解不对的地方,欢迎批评指正^_^ 一.引入Ant Design 1.安装antd yarn add antd 2.引入 react-app-re ...
- Ant Design Pro 学习笔记:数据流向
在讲这个问题之前,有一个问题应当讲一下: Ant Design Pro / umi / dva 是什么关系? 首先是 umi / dva 的关系. umi 是一个基于路由的 react 开发框架. d ...
- 使用express、react、webpack打包、socket.io、mongodb、ant.design、less、es6实现聊天室
拿到一个项目,我们应该如何去完成这个项目呢. 是直接上手? 还是先进行分析,然后再去解决呢?毫无疑问,如果直接上手解决,那么可能会因为知道目标所在,而导致出现各种问题. 所以,我们应该系统的分析这个项 ...
- react 编写 基于ant.design 页面的参考笔记
前言 因为我没有系统的学习 react,是边写边通过搜索引擎找相对的问题,看 ant.design的 中文文档 编写的一个单页面, 以下的笔记都是写 gksvideourlr 时记录的. 重新设定表单 ...
随机推荐
- Linux中的CentOS 7克隆之后修改
1.VMware Workstation软件查看克隆完成后的虚拟机网卡mac地址,记录下来 2.输入[cd /etc/sysconfig/network-scripts/]命令后,再执行[ip add ...
- str = @"abc ""def"" ghi """"jkl"""" mn";
namespace ConsoleQuotes { class Program { static void Main(string[] args) { string str = @"abc ...
- 第6章 初识MyBatis
6.1 什么是MyBatis Mybatis(前身是iBatis)是一个支持普通SQL查询.存储过程以及高级映射的持久层框架.MyBatis框架也被称为ORM(Object/Relational Ma ...
- java.lang.IllegalStateException: Service id not legal hostname (leyou_item_service)
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ...
- WinDbg常用命令系列---sx, sxd, sxe, sxi, sxn, sxr, sx- (设置异常)
简介 sx*命令控制调试器在正在调试的应用程序中发生异常或发生某些事件时采取的操作. 使用形式 sx sx{e|d|i|n} [-c "Cmd1"] [-c2 "Cmd2 ...
- cortex 基本试用
cortext是prometheus的多租户解决方案,目前在cncf 沙箱孵化,以下是一个简单的试用 注意因为golang 包的问题,而且以下依赖的几个项目都是基于go module 的所以使用了go ...
- [Android] Android studio gradle 插件的版本号和 gradle 的版本号 的对应关系
[Android] Android studio gradle 插件的版本号和 gradle 的版本号 的对应关系 本博客地址: wukong1688 本文原文地址:https://www.cnblo ...
- Nginx 优化配置
基本配置优化(优化后配置样例,可以改后直接上生产) 1 #头部配置 2 user nginx nginx; #定义nginx的启动用户,不建议使用root 3 worker_processes 4; ...
- type of的返回值有哪些
typeof 10; // number typeof 'time'; //string typeof undefined; // undefined typeof null; // object t ...
- python实现余弦相似度文本比较
向量空间模型VSM: VSM的介绍: 一个文档可以由文档中的一系列关键词组成,而VSM则是用这些关键词的向量组成一篇文档,其中的每个分量代表词项在文档中的相对重要性. VSM的例子: 比如说,一个文档 ...