首页 > 其他分享 >【React+Antd】可编辑表格

【React+Antd】可编辑表格

时间:2023-05-17 12:46:42浏览次数:38  
标签:... return 表格 编辑表格 React item let dataIndex Antd

import React, { useContext, useState, useEffect, useRef } from "react";
import { Table, Input, Button, Popconfirm, Form } from "antd";

const EditableContext = React.createContext(null);
const EditableRow=(props)=> {//编辑表格行
  let [form] = Form.useForm();//定义表单对象
  return (
    <Form form={form} component={false}>
      <EditableContext.Provider value={form}>
        <tr {...props} />
      </EditableContext.Provider>
    </Form>
  );
}
const  EditableCell=({ title, editable, children, dataIndex, record, handleSave, ...restProps })=>{//编辑表格单元格
  let inputRef = useRef(null);
  const [editing, setEditing] = useState(false); //定义编辑状态
  const form = useContext(EditableContext);

  useEffect(() => {//监听编辑状态值的变化
    if (editing) {//如果开启编辑状态
      inputRef.current.focus(); //input输入框聚焦
    }
  }, [editing]);

  function toggleEdit() {//切换编辑状态
    setEditing(!editing);
    form.setFieldsValue({//将表格中的值赋值到表单中
      // name:Easdf
      [dataIndex]: record[dataIndex],
    });
  }

  async function save() {//保存事件
    try {
      const values = await form.validateFields();//获取表单中的数据
      toggleEdit();//切换编辑状态
      handleSave({ ...record, ...values });//调用保存方法
    } catch (errInfo) {
      console.log("保存失败:", errInfo);
    }
  }

  let childNode = children;
  if (editable) {//如果开启了表格编辑属性
    // 是否开启了编辑状态 (开启:显示输入框 关闭:显示div)
    childNode = editing ? (
      <Form.Item
        name={dataIndex}
        rules={[
          {
            required: true,
            message: `${title}是必填的.`,
          },
        ]}
      >
        <Input ref={inputRef} onPressEnter={save} onBlur={save} />
      </Form.Item>
    ) : (
      <div onClick={toggleEdit}>{children}</div>
    );
  }
  return <td {...restProps}>{childNode}</td>;
}
export default  App=()=> {
  let tableColumns = [//定义表格头
    {
      title: "姓名",
      dataIndex: "name",
      with: "30%",
      editable: true,
    },
    {
      title: "年龄",
      dataIndex: "age",
    },
    {
      title: "地址",
      dataIndex: "address",
    }
  ];
  let [tableData, setTableData] = useState([//定义表格数据
    {
      key: "0",
      name: "Edward King 0",
      age: "32",
      address: "London, Park Lane no. 0",
    },
    {
      key: "1",
      name: "Edward King 1",
      age: "32",
      address: "London, Park Lane no. 1",
    },
  ]);

  tableColumns = tableColumns.map((item) => {//遍历表格头数组
    if (item.editable) {//如果表格头列开启了编辑属性
      return {
        ...item,
        onCell: (record) => {
          return {
            record: record,
            editable: item.editable,
            dataIndex: item.dataIndex,
            title: item.title,
            handleSave: (row) => {//这个方法可以获取到行编辑之后的数据
              let findEditIndex = tableData.findIndex((item) => {//找到编辑行的索引
                return item.key === row.key;
              });
              let findEditObj = tableData.find((item) => {//找到编辑行的数据对象
                return item.key === row.key;
              });
              tableData.splice(findEditIndex, 1, { ...findEditObj, ...row });//将最新的数据更新到表格数据中
              setTableData([...tableData]);//设置表格数据
            },
          };
        },
      };
    } else {
      return item;
    }
  });

  return (
    <div>
      <Table
        bordered
        components={{
          body: {
            row: EditableRow,
            cell: EditableCell,
          },
        }}
        columns={tableColumns}
        dataSource={tableData}
      />
    </div>
  );
}

 

标签:...,return,表格,编辑表格,React,item,let,dataIndex,Antd
From: https://www.cnblogs.com/Esai-Z/p/17408271.html

相关文章

  • 【React+Antd】 可展开Table
    在antd基础上进行改造,抛弃之前的靠前面+进行展开的方式,在操作列进行点击展开  import{Table}from'antd';importReact,{useState}from'react';import'antd/dist/antd.css';import'./index.css';constAPP=()=>{const[expandedRowKeys,se......
  • 【React】定时器组件
    鼠标移入关闭定时器并清除,鼠标移出组件的时候打开定时器进行循环consttimer=useRef(null);useEffect(()=>{startLoop();},[]);conststartLoop=()=>{stopLoop();timer.current=window.setInterval(()=>{//要干的事},60*......
  • 【Antd】表格超出隐藏,显示三点,触碰提示
    clumns行设置:1onCell:()=>{2return{3style:{4overflow:'hidden',//控制隐藏5whiteSpace:'nowrap',//控制换行6textO......
  • 【Antd】表单调整输入框对齐方式:
    constformItemLayout={labelCol:{//左边文字xs:{span:24},sm:{span:6},},wrapperCol:{//右边输入框xs:{span:24},sm:{span:16},},};consttailFormItemLayout={wrapperCol:{xs......
  • ReactNative 配置路径别名
    1、安装依赖 babel-plugin-module-resolveryarnaddbabel-plugin-module-resolver-D 2、配置babel.config.jsmodule.exports={presets:['module:metro-react-native-babel-preset'],plugins:[['@babel/plugin-proposal-decorators......
  • AntDeisgn中checkbox group的使用
    <template><!--弹窗类型选择--><div><a-modal:visible="state.modalAttr.visible"title="规选类型"width="680px"@ok="showModal"@cancel="hideModal"><a-checkbox......
  • Vue、React和小程序都是流行的前端开发框架/平台
    Vue、React和小程序都是流行的前端开发框架/平台,它们各有优缺点。Vue的优点:简单易学:Vue的语法简单明了,易于理解和学习。渐进式框架:Vue可以逐渐地集成到现有项目中,也可以作为完整的单页应用程序开发。响应式设计:Vue的响应式设计使得数据变化后UI自动更新,方便快捷。高......
  • React-hooks 父组件通过ref获取子组件数据和方法
    我们知道,对于子组件或者节点,如果是class类,存在实例,可以通过React.createRef()挂载到节点或者组件上,然后通过this获取到该节点或组件。classRefTestextendsReact.Component{constructor(props){super(props);this.myRef=React.createRef();}......
  • react状态管理store用法二: 使用Hooks 配置redux
    react最通用的状态管理方案就是的redux,下面介绍通过Hooks的方式使用reduxnpminstallreact-redux@reduxjs/toolkit-S 创建store1.新建store文件夹,在下面新建index.tsx文件和slices文件夹,其中slices文件夹用来定义需要放进store的数据结构和方法slices文件夹下新建app......
  • react微信扫码登录
    第一步<scriptsrc="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js">第二步//缓存已经加载的资源回调importloadScriptOncefrom'load-script-once'//加载一次functionloadScriptOnceSync(src:string,success:any){loadScriptO......