前端那些事之react篇---Ant Design后台管理系统

react + Ant Design后台管理系统

Step 1:安装脚手架工具 (Node.js 需要 v4.x 或以上)

$ npm install antd-init -g

step 2:创建项目&初始化

$ mkdir ant-design-demo && cd ant-design-demo

运行 $ antd-init

这时候会出现下面的提示

? Please select boilerplate type (Use arrow keys) ❯ plain react - for simple project redux - for complex project 这里可以手动选择 plain-react 。

或者在刚才初始化时候直接加上类型

$ antd-init --type plain-react

通过以上的命令,antd-init 就开始自动安装 npm 依赖了。耐心等待装完 ~ ~

安装完之后,整个项目的基本框架就搭建起来了。

脚手架会生成一个 Todo 应用实例。

运行 $ npm start 后访问 http://127.0.0.1:8989 查看效果。

模仿 ant design 表格的实现

  • 目录结构app下的 js引用ant-study组件:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import AntStudy from './ant-study/index'
ReactDOM.render(
    <AntStudy />,document.getElementById('root')
);
  • ant-study组件文件下的index
import React from 'react';
import Button from './button/index';
import Table from './table/index';
import Input from './input/input';
import Cards from './card/index';
const dataSource = [{
   key: '1',name: '胡彦斌',age: 32,address: '西湖区湖底公园1号'
},{
   key: '2',name: '胡彦祖',age: 42,address: '西湖区湖底公园1号'
}];

const columns = [{
   title: '姓名',dataIndex: 'name',key: 'name',},{
   title: '年龄',dataIndex: 'age',key: 'age',{
   title: '住址',dataIndex: 'address',key: 'address',}];
var AntStudy=React.createClass({
   getInitialState:function () {
      return{
          value:'小样',error:'亲,错了'
      }
   },render:function () {
       return(
          <div>
              <h3>jsx</h3>
              <Button>dkdkd</Button>
              <h3>表格</h3>
              {/*把表头和要传输的数据传到子组件*/}
              <Table dataSource={dataSource} columns={columns}/>
              <h3>输入框</h3>
              <Input
                  value={this.state.value}
                  onChange={(e)=>this.setState({value:e.target.value})}
                  onPressEnter={this.enter}
              />
              <h3>选项卡</h3>
              <Cards></Cards>
          </div>
       )
   }
})
export default AntStudy;

ant-study文件下的table组件

import React from 'react';

var Table=React.createClass({
    render:function () {
        var that=this;
        //接收父组件传进来的参数
        var header=this.props.columns,data=this.props.dataSource;
        var arr=[];
        var headerNodes=header.map(function (obj,i) {
            arr.push(obj.dataIndex);
            return(
                <td key={obj.key}>{obj.title}</td>
            )
        })
        var nodes=data.map(function (obj,i) {
            var tr=arr.map(function(h,j){
                return(
                    <td key={'td-'+obj[h]+'-'+j}>{obj[h]}</td>
                )
            })
            return(
                <tr>{tr}</tr>
            )
        })
        return(
            <div>
                <table>
                    <thead>
                        <tr>{headerNodes}</tr>
                    </thead>
                    <tbody>
                    {nodes}
                    </tbody>
                </table>
            </div>
        )
    }
})
export default Table;

模仿ant design实现tab栏切换

  • 需求:得到最外层的组件的数据?
// 1
// card
//设置子组件的上下文
// getChildContext(){
//     return {
//         current:this.props.current
//     }
// },//子组件的上下文类型
// childContextTypes:{
//     current:React.PropTypes.number
// }


//2
//启用上下文
// contextTypes:{
//     current:React.PropTypes.number
// },

完整代码演示

  • ant study组件下的index.js
import React from 'react';
import Card from './card';
const TitleBar=Card.TitleBar;
const Title=Card.Title;
const ContentBar=Card.ContentBar;
const Content=Card.Content;
var AntStudy=React.createClass({
    getInitialState:function(){
      return{
          current:2
      }
    },render:function () {
        return(
           <div>
               <h3>tab栏切换</h3>
               <Card current={this.state.current}>
                   <TitleBar>
                        {/*Title组件如何拿到Card组件传递的值*/}
                       <Title index={1} onClick={(e)=>this.setState({current:1})}>title-111</Title>
                       <Title index={2} onClick={(e)=>this.setState({current:2})}>title-222</Title>
                       <Title index={3} onClick={(e)=>this.setState({current:3})}>title-333</Title>
                   </TitleBar>
                   <ContentBar>
                       <Content index={1}>content-111</Content>
                       <Content index={2}>content-222</Content>
                       <Content index={3}>content-333</Content>
                   </ContentBar>
               </Card>
           </div>
        )
    },handClick:function (index) {
        this.setState({
            current:index
        })
    }
})
export default AntStudy;

card组件下的index.js

import React from 'react'
import './index.css'
var Card = React.createClass({
    render(){
        return (
            <div>
                {this.props.children}
            </div>
        )
    },//设置子组件的上下文
    getChildContext(){
        return {
            current:this.props.current
        }
    },//子组件的上下文类型
    childContextTypes:{
        current:React.PropTypes.number
    }
})

var Title = React.createClass({
    //启用上下文
    contextTypes:{
        current:React.PropTypes.number
    },render(){
        var active = ''
        if(this.props.index === this.context.current){
            active = 'active'
        }

        return (
            <div className={active} onClick={this.props.onClick}>{this.props.children}</div>
        )
    }
})
var TitleBar = React.createClass({
    render(){
        return (
            <div className="title-bar">
                {this.props.children}
            </div>
        )
    }
})
var ContentBar = React.createClass({
    render(){
        return (
            <div className="content-bar">
                {this.props.children}
            </div>
        )
    }
})
var Content = React.createClass({
    contextTypes:{
        current:React.PropTypes.number
    },render(){
        var display = ''
        if(this.props.index === this.context.current){
            display = 'block'
        }else {
            display = 'none'
        }
        return (
            <div style={{display:display}}>{this.props.children}</div>
        )
    }
})

Card.Title=Title
Card.TitleBar = TitleBar
Card.ContentBar= ContentBar
Card.Content =Content


export default Card

card组件下面的index.css

.title-bar .active{
    color: red;
}

.content-bar .active{
    color: red;
}

/***********************************************************************************/

react+ant design 实现表格渲染

  • ajax请求用插件superagent来实现

  • 简介:SuperAgent 是一个轻量的Ajax API,服务器端(Node.js)客户端(浏览器端)均可使用,SuperAgent具有学习曲线低、使用简单、可读性好的特点,可作为客户端请求代理模块使用,当你想处理get,post,put,delete,head请求时,可以考虑使用SuperAgent。

  • 下载命令:npm install superagent --save

i/**
 * Created by Auser on 2017/4/6.
 */
import React from 'react';
import  './index.css';
import {Button,Row,Col,Table,Modal,Form,Input,Radio,message} from 'antd';
import 'antd/dist/antd.css';
import request from 'superagent';
const FormItem = Form.Item;
const RadioGroup = Radio.Group;
const RadioButton = Radio.Button;
const head = [
    {title: 'id',dataIndex: 'id'},{title: 'name',dataIndex: 'name'},{title: 'age',dataIndex: 'age'},{title: 'sex',dataIndex: 'sex'},//设置表头时,除了设置title,dataIndex属性,还可以设置render方法
    /***第一种方法**/
    // {
    //     title: 'single',//     dataIndex: 'single',//singe是一个布尔值
    //     render: function (single,obj) {
    //         return (
    //             <div>{ single ? '小样还好吗' : '不好'}</div>
    //         )
    //     }
    // }
    /******第二种方法箭头涵数*************/
    {
        title: 'single',dataIndex: 'single',render: (single,obj) => (
            <div>
                {obj.name} 这只 {single ? '单身狗' : '恩爱狗'}
                是个{obj.sex} 他今年{obj.age}岁了
            </div>
        )
    }
]
const url = "http://101.200.129.112:9527"
const Api = {
    //渲染表格的接口
    listApi: '' + url + '/react1/student/'
}
var AntTest = React.createClass({
    getInitialState(){
        return {
            loading: false,//默认放一个空数组
            item: [],//    判断是否要显示弹出层
            showAdd: false,name:'',age:'',sex:'',single:true,selectedRowKeys: [],}
    },//选中的时候获取到的值
    onSelectChange (selectedRowKeys) {
        var id=selectedRowKeys[0];
        if(!id){
            this.setState({ selectedRowKeys:selectedRowKeys });
            return;
        }
        var items=this.state.item;
        var obj;
        for (var i = 0; i < items.length; i++) {
            if (items[i].id==id){
                obj=items[i];
            };
        }
        this.setState({
            selectedRowKeys:selectedRowKeys,name:obj.name,age:obj.age,sex:obj.sex,single:obj.single
        })
    },render: function () {
        const { loading,selectedRowKeys } = this.state;
        const rowSelection = {
            selectedRowKeys,onChange: this.onSelectChange,};
        const hasSelected = selectedRowKeys.length != 1;
        return (
            <div >
                <h3 className="center">react+ant design后台系统</h3>
                {/*设置loading效果*/}
                <Button icon="plus" type="primary" className="move"
                        onClick={(e) => this.setState({showAdd: true})}>增加</Button>
                <Button icon='edit' disabled={hasSelected} type=""
                        onClick={(e)=>this.setState({showAdd: true})}
                        className="move">编辑</Button>
                <Button icon='delete' disabled={hasSelected} type="danger" className="move" onClick={this.handDelete}>删除</Button>
                <Table  rowSelection={rowSelection} className='table' loading={this.state.loading} columns={head} dataSource={this.state.item}/>
                {/*点击出现弹出层组件Modal*/}
                <Modal
                    // 是否显示弹出层,true显示,false为不显示
                    visible={this.state.showAdd}
                    //标题名
                    title='新增'
                    //是否要关闭
                    onCancel={() => this.setState({showAdd: false})}
                    //点击确定的时候执行的涵数
                    onOk={this.handSave}
                >
                    {/*在弹出层中增加表单*/}
                    <Form>
                        <FormItem
                            label="姓名:"
                            //一共可以分为24
                            labelCol={{span: 4}}//label占的份数

                            wrapperCol={{span: 18}}//label下面占的份数
                        >
                            <Input value={this.state.name} onChange={(e)=>this.handChange(e,'name')}/>
                        </FormItem>
                        <FormItem
                            label="年龄:"
                            labelCol={{span: 4}}
                            wrapperCol={{span: 18}}
                        >
                            <Input value={this.state.age} onChange={(e)=>this.handChange(e,'age')} />
                        </FormItem>
                        <FormItem
                            label="性别:"
                            labelCol={{span: 4}}
                            wrapperCol={{span: 20}}
                        >
                            <RadioGroup value={this.state.sex} onChange={(e)=>this.handChange(e,'sex')}>
                                <Radio key='boy' value={'boy'}>男</Radio>
                                <Radio key='girl' value={'girl'}>女</Radio>
                            </RadioGroup>
                        </FormItem>
                        <FormItem
                            label="单身狗:"
                            labelCol={{span: 4}}
                            wrapperCol={{span: 20}}
                        >
                            <RadioGroup value={this.state.single} onChange={(e)=>this.handChange(e,'single')}>
                                <RadioButton key='true' value={true}>单身狗</RadioButton>
                                <RadioButton key='false' value={false}>恩爱狗</RadioButton>
                            </RadioGroup>
                        </FormItem>
                    </Form>
                </Modal>


                <Modal
                    // 是否显示弹出层,true显示,false为不显示
                    visible={this.state.showAdd}
                    //标题名
                    title='编辑'
                    //是否要关闭
                    onCancel={() => this.setState({showAdd: false})}
                    //点击确定的时候执行的涵数
                    onOk={this.handEdit}
                >
                    {/*在弹出层中增加表单*/}
                    <Form>
                        <FormItem
                            label="姓名:"
                            //一共可以分为24
                            labelCol={{span: 4}}//label占的份数

                            wrapperCol={{span: 18}}//label下面占的份数
                        >
                            <Input value={this.state.name} onChange={(e)=>this.handChange(e,'single')}>
                                <RadioButton key='true' value={true}>单身狗</RadioButton>
                                <RadioButton key='false' value={false}>恩爱狗</RadioButton>
                            </RadioGroup>
                        </FormItem>
                    </Form>
                </Modal>
            </div>
        )
    },//es6的语法
    handChange(e,type) {
        var value=e.target.value;
        var obj={};
        //把type加入到obj中,并设置值
        obj[type]=value;
        this.setState(obj);
        // console.log(type);
        // console.log(obj);
    },//    点击确定的时候执行的涵数,发送ajax请求
    handSave(){
        var that=this;
        var data={
            name:this.state.name,age:this.state.age,sex:this.state.sex,single:this.state.single
        }
      request
          .post(Api.listApi)
          .send(data)
          .end(function(err,res){
              // console.log(res.body);
              if (err) {
                  return console.log(err)
              }
              var item=res.body;
              item.key=res.id;
              var items=that.state.item;
              items.unshift(res.body);//把新增的数据加到最前面
              that.setState({
                  item:items,showAdd:false
              })
              //新增成功以后给一个提示信息
              message.success('新增成功!'+item.name);
          })
    },//编辑以后点击确定发送ajax请求
    handEdit(){
        var that=this;
        var data={
            name:this.state.name,single:this.state.single
        }
        var id=that.state.selectedRowKeys[0];
        var ApiEdit=Api.listApi+id+'/';
        request
            .patch(ApiEdit)
            .send(data)
            .end(function(err,res){
                // console.log(res.body);
                if (err) {
                    return console.log(err)
                }
                var items=that.state.item;
              items=items.map(function(o){
                  if(o.id==id){
                      o=data;
                  }
                  return o;
              })
                that.setState({
                    item:items,showAdd:false
                })
                //新增成功以后给一个提示信息
                message.success('编辑成功!'+id);
            })
    },// 点击删除的时候执行的涵数
    handDelete(){
        var that=this;
        Modal.confirm({
            title: '你确定要删除吗?',content: '是的',onOk:function () {
                var id=that.state.selectedRowKeys[0];
                var ApiDele=Api.listApi+id+'/';
                request
                    .delete(ApiDele)
                    .end(function(err,res){
                        if(err){
                            console.log(err);
                        }
                        console.log(id);
                        var items=[];
                        //在state里拿到所有的项目
                         var student=that.state.item;
                        for (var i = 0; i < student.length; i++) {
                            //如果所有项目里的Id,不等于传进来的id,重新放到一个数组中
                            if(student[i].id!=id){
                                items.push(student[i]);
                            }
                        }
                        that.setState({
                            item:items
                        })

                        message.success('删除成功!'+id);
                    })

            },// okText: 'OK',// cancelText: 'Cancel',});
    },//    当组件渲染完以后用请求ajax
    componentDidMount () {
        var that = this;
        //刚开始发请求的时候,loading为true
        this.setState({
            loading: true
        })
        request
        //get请求方式
            .get(Api.listApi)
            .end(function (err,res) {
                if (err) {
                    return console.log(err)
                }
                console.log(res.body);
                res.body = res.body.map(function (obj,i) {
                    //必须要加一个key值
                    //用map方法循环,返回一个新的数组
                    obj.key = obj.id;
                    return obj;
                })
                that.setState({
                    //把每一项目放到数组里
                    item: res.body,//请求结束后loading为false
                    loading: false
                })
            })

    }
})
export  default  AntTest;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


过滤器:就是筛选filters: [ { text: '全部', value: '' }, { text: '通过', value: '通过' }, { text: '拒绝', value: '拒绝' }, { text: '待处理', value: '待处理' }, ], onFilter: (value, record) =&gt; record.c...
好处: 就是可以实现 响应式 拉伸行(row) 列(col)col要直接在row下基本理解:span="多少" //最大24格子 一行是24格子 一个 row 里面的col 的span加起来24就占满了&lt;a-row&gt; &lt;a-col :span="12"&gt;col-12&lt;/a-col&gt; &lt;a-col :span="12"&gt;col-12&lt;/a-col&gt; &lt;a-col :sp...
创好vue 项目npm 下载antnpm i --save ant-design-vue@next完整引入main文件下添加import Antd from 'ant-design-vue';import 'ant-design-vue/dist/antd.css';.use(Antd)这样就ok了使用的时候就是正常复制代码使用按需引用...
外面套个from 标签就好了。
antDesign表单函数配置分析用getFieldDecorator包起来的高阶组件进行扩展getFieldDecorator(name,options)(component)对组件进行name注册,传入opotions配置以及回调里传入底层组件component自定义表单验证思路:用装饰器来扩展底部组件在装饰器里写入对事件的处理
之前在vue页面中引入axios使用,本篇在mainjs中引入1、mainjs中引入axios,设置基础urlimportaxiosfrom'axios'axios.defaults.baseURL='https://localhost:8080/'Vue.prototype.axios=axios2、在vue页面中,注意axios前需要加this.methods:{login(){letthat
先直接上核心代码:this.goToHomePage换成自己逻辑自己写的时候直接把this.goToHmoPage()换成自己的逻辑就行了,还有注意一点的是: 需要传个空函数,不然会报错在componentWillMount移除事件监听是防止浪费内存影响性能。最后在antdesign实现enter回车的方式如下: htmlT
Jeecg-Boot是一款基于SpringBoot+代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Ant-Design-Vue,Mybatis,Shiro,JWT。强大的代码生成器让前端和后台代码一键生成,不需要写任何代码,保持jeecg一贯的强大,绝对是全栈开发福音!!JeecgBoot在提高UI能力的同时,降低了前后分离的开发
&lt;template&gt; &lt;div&gt; &lt;a-pagination show-quick-jumper v-model:current=&quot;current1&quot;
表单验证详解 &lt;template&gt; &lt;!-- 第一个坑 :model=&quot;formState.youForm&quot; 一定要写成这样 不要写成:model=&quot;f
&lt;template&gt; &lt;a-table :columns=&quot;columns&quot; :data-source=&quot;data&quot; :row-selecti
下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab
表单验证遇见的坑 01 如果你受控数据是这样写的话 const formState= reactive({ youForm:{ youNaNe:&#39;&#39;, useSlectValue: &
Ant Design Vue中Table对齐方式显示省略号 &lt;template&gt; &lt;!-- bordered 表示表格中的边框 pagination=&quot;false&quot
&lt;a-drawer :title=&quot;myTitle&quot; placement=&quot;right&quot; :visible=&quot;visible&quot; @cl
InputNumber 有值但是验证却不能够通过 今天遇见这样一个问题,InputNumber 输入框中有值 但是却却提示验证不能够通过 后来经过分析,怀疑是数据类型不正确, 后面经过验证,果然是数据
Select 选择器进行搜索 &lt;template&gt; &lt;div&gt; &lt;a-form-item label=&quot;分类:&quot;&gt; &lt;a-select p
&lt;template&gt; &lt;a-tree-select v-model:value=&quot;value&quot; &quot;width: 320px&quot; :t
1.创建子组件 &lt;template&gt; &lt;a-drawer :title=&quot;drawerInfo.customTitle&quot; :placement=&quot;pla
&lt;template&gt; &lt;div class=&quot;clearfix&quot;&gt; {{ fileList }} &lt;a-upload list-type=&quot;