• react typescript FunctionComponent antd crud


    这个界面跟之前VUE做的一样。并无任何不同之处,只是用react重复实现了一遍。

    import React, { useState, useEffect } from 'react';
    import { Row, Col, Table, Form, Cascader, Input, Button, Modal, message } from 'antd';
    import { FormComponentProps } from 'antd/lib/form';
    import http from '../../service';
    
    import './post_category.css'
    import { PostCategoryTo } from '../../models/PostCategoryTo';
    interface PostCategoryProps extends FormComponentProps {
    
    }
    
    const PostCategory: React.FC<PostCategoryProps> = (props) =>  {
      
      const scroll = { y: window.innerHeight - 200 };
      const columns = [
        { title: '名称', dataIndex: 'name' },
        { title: '路径', dataIndex: 'code' }
      ];
      const rowSelection = {
        onChange: (selectedRowKeys: any, rows: any) => {
          setSelectedRows(rows)
        }
      }
    
      const { getFieldDecorator } = props.form;
      const [loading, setLoading] = useState(false)
      const [dataSource, setDataSource] = useState([])
      let  [selectedRows, setSelectedRows] = useState([])
      let [formModel, setFormModel] = useState(new PostCategoryTo())
      const fieldNames = { label: 'name', value: 'uid', children: 'children'}
    
      useEffect(() => {
        loadData()
      }, [])
    
    
      function loadData() {
        http.url('v1/post-category')
        .get()
        .json(res => {
          setDataSource(Object.assign([], res))
        })
      }
    
      function handleAdd () {
        setFormModel(new PostCategoryTo())
        props.form.resetFields()
      }
    
      function handleModify () {
        if (selectedRows.length !== 1) {
          message.warn('请选择一行数据进行操作')
          return
        }
    
        setFormModel(PostCategoryTo.fromObject(selectedRows[0]))
      }
      
      function handleDelete () {
        if (selectedRows.length === 0) {
          message.warn('请选择一行数据进行操作')
          return
        }
    
        Modal.confirm({
          title: '请确认你要删除这些项目',
          onOk() {
            const list = selectedRows.map((it:any) => it.uid)
            http.url(`v1/post-category/${list.join(',')}`).delete()
              .text(() => {
                loadData()
                message.success('删除成功')
              }).catch(err => message.error(err.message))
          },
          onCancel() {},
        });
      }
      
      function handleSave() {
        props.form.validateFields((err, values) => {
          if (!err) {
            const param = Object.assign({}, formModel, values)
            console.log(param, formModel, values)
            if (Array.isArray(values.parentUid)) {
              param.parentUid = values.parentUid[values.parentUid.length - 1]
            }
            setLoading(true)
    
            let resp: any = null
            if (param.uid) {
              resp = http.url(`v1/post-category/${param.uid}`).put(param)
            } else {
              resp = http.url('v1/post-category').post(param)
            }
    
            resp.json(res => {
              setFormModel(PostCategoryTo.fromObject(res))
              loadData()
              message.success('保存成功')
            })
            .finally(() => {
              setLoading(false)
            })
          }
        });
      }
    
    
      return (
        <Row gutter={32}>
          <Col span={6}>
            <h3>新增分类</h3>
            <Form>
              <Form.Item label='名称' help='名称是它显示在网页上。'>
                {getFieldDecorator('name', {initialValue: formModel.name, rules: [{ required: true, message: '请输入账号' }]})(
                  <Input id='name' placeholder='请输入名称'></Input>
                )}
              </Form.Item>
              <Form.Item label='路径' help='它通常是地址栏里面的路径,它通常都是小写的,只包含字母、数字和连字符。'>
                {getFieldDecorator('code', {initialValue: formModel.code})(
                  <Input id="code"></Input>
                )}
              </Form.Item>
              <Form.Item label='父分类'>
                {getFieldDecorator('parentUid', {initialValue: formModel.parentUid})(
                  <Cascader fieldNames={fieldNames}  options={dataSource} placeholder='选择父分类'/>
                )}
              </Form.Item>
              <Form.Item label='描述' help='默认情况下描述不显示;一些主题可能会显示这一点。'>
                {getFieldDecorator('description', {initialValue: formModel.description})(
                  <Input.TextArea id="description"></Input.TextArea>
                )}
              </Form.Item>
              <div className="button-save">
                <Button type='primary' loading={loading} onClick={handleSave}>保存</Button>
              </div>
            </Form>
          </Col>
          <Col span={18}>
            <div className='toolbar'>
              <Button size='small' onClick={handleAdd}>新增</Button>
              <Button type='primary' size='small' onClick={handleModify}>修改</Button>
              <Button type='danger' size='small' onClick={handleDelete}>删除</Button>
            </div>
            <Table columns={columns} size="small" rowKey="uid" rowSelection={rowSelection} dataSource={dataSource} pagination={false} scroll={scroll}></Table>
          </Col>
        </Row>
      )
    
    }
    
    export default Form.create()(PostCategory)
    
  • 相关阅读:
    [干货向]用Javascript获取页面元素的位置
    从 JavaScript 数组去重谈性能优化
    《悟透javascript》中的知识点
    深入理解javascript闭包
    深入理解Javascript之执行上下文(Execution Context)
    CSS Sprites的原理
    深入理解JavaScript定时机制
    防范sql注入式攻击的比较有见地的代码(PHP)
    PHP(authcode)加密解密
    预防数据库攻击
  • 原文地址:https://www.cnblogs.com/warrior/p/12041222.html
Copyright © 2020-2023  润新知