React+Hooks 实现每次添加或删除一组属性

点击添加后:

import { ModalForm } from '@ant-design/pro-form';
import React, { useEffect, useRef, useState } from 'react';
import { Row, Col, message, Select } from 'antd';
const CreateFormNew = (props) => {
  const formRefNew = useRef();
  const [subArr, setSubArr] = useState([]);//上级单位下拉框
  const [modeList, setModeList] = useState([]);//运行方式下拉框
  const [items, setItems] = useState([]);
  const [modeSubmit, setModeSubmit] = useState([]);

  const addItem = () => {
    let key = new Date().getTime();
    const newItem = {
      id: key,
      value: `Item ${key}`,
    };
    setItems([...items, newItem]);
    const newMode = { key, substationId: '', modeId: '' };
    setModeSubmit([...modeSubmit, newMode]);
  };

  const removeItem = (itemId) => {
    setItems(items.filter((item) => item.id !== itemId));
    setModeSubmit(modeSubmit.filter((item) => item.key !== itemId));
  };
  useEffect(() => {
    //此处可用接口返回下拉框的数据
    setSubArr([{
      label: "上级单位A",
      value: "deptA",
      children: [
        {
          label: "运行方式A",
          value: "deptA_typeA",
        },
        {
          label: "运行方式B",
          value: "deptA_typeB",
        },
        {
          label: "运行方式C",
          value: "deptA_typeC",
        }
      ]
    }, {
      label: "上级单位B",
      value: "deptB",
      children: [
        {
          label: "运行方式A",
          value: "deptB_typeA",
        },
        {
          label: "运行方式B",
          value: "deptB_typeB",
        },
        {
          label: "运行方式C",
          value: "deptB_typeC",
        }
      ]
    }
    ])
  }, [])
  return (
    <ModalForm
      title={"新增"}
      width={800}
      formRef={formRefNew}
      visible={props?.visible}//显示ModalForm
      onVisibleChange={props?.onVisibleChange}//显示控制ModalForm
      onFinish={(value) => {
        console.log(modeSubmit);
      }}
    >
      <Row>
        <Col style={{ width: '20.8%', textAlign: 'right', color: 'white' }}>外电网运行方式:</Col>
        <Col style={{ width: '75%' }}>
          <a style={{
                background: '#1890ff',
                borderRadius: '3px',
                padding: '2px 4px',
                color: '#fff',
              }} onClick={() => { addItem(); }} >
            添加
          </a>
          &nbsp;&nbsp;
          <ul style={{ clear: 'both', padding: '10px 0', margin: 0 }}>
            {items.map((item) => (
              <li key={item.id} style={{ marginBottom: '5px' }}>
                <Select
                  placeholder="请选择上级单位"
                  style={{ width: 180, margin: '0 0 8px' }}
                  onChange={(e) => {
                    setModeList(subArr.find((it) => it.value == e).children);
                    if (JSON.stringify(modeSubmit) == '[]' || !modeSubmit[0]) return;
                    let obj = modeSubmit.find((it) => it.key === item.id);
                    if (obj) {
                      setModeSubmit(
                        modeSubmit.map((it) => {
                          if (it.key === item.id) {
                            return { ...it, substationId: e };
                          } else {
                            return it;
                          }
                        }),
                      );
                    } else {
                      message.warn('请先选择上级单位');
                    }
                  }}
                  options={subArr}
                ></Select>
                <Select
                  style={{ width: 220, margin: '0 8px' }}
                  placeholder="请选择运行方式"
                  options={modeList}
                  onChange={(e) => {
                    if (JSON.stringify(modeSubmit) == '[]' || !modeSubmit[0]) return;
                    let obj = modeSubmit.find((it) => it.key === item.id);
                    if (obj) {
                      setModeSubmit(
                        modeSubmit.map((it) => {
                          if (it.key === item.id) {
                            if (!it.substationId) {
                              message.warning('请先选择上级单位');
                            }
                            return { ...it, modeId: e };
                          } else {
                            return it;
                          }
                        }),
                      );
                    } else {
                      message.warn('请先选择上级单位');
                    }
                  }}
                ></Select>
                <a  style={{
                    background: '#1890ff',
                    borderRadius: '3px',
                    padding: '2px 4px',
                    color: '#fff',
                  }} onClick={() => removeItem(item.id)} >
                  删除
                </a>
              </li>
            ))}
          </ul>
        </Col>
      </Row>
    </ModalForm>
  );
};
export default CreateFormNew;

React中使用Hooks来实现菜单路由可以按照以下步骤进行: 1. 首先,安装并导入React Router库,用于管理路由。使用以下命令进行安装: ```bash npm install react-router-dom ``` 然后,在你的路由组件中,定义路由配置和对应的组件。例如: ```javascript import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; import Home from './components/Home'; import Users from './components/Users'; // 其他组件... const App = () => { return ( <Router> <Switch> <Route exact path="/" component={Home} /> <Route path="/users" component={Users} /> {/* 其他路由配置 */} </Switch> </Router> ); }; export default App; ``` 2. 在菜单组件中,使用`Link`组件来实现菜单项的跳转。例如: ```javascript import { Link } from 'react-router-dom'; const Menu = () => { return ( <ul> <li> <Link to="/">首页</Link> </li> <li> <Link to="/users">用户管理</Link> </li> {/* 其他菜单项 */} </ul> ); }; export default Menu; ``` 3. 在你的应用主组件中,将菜单和路由组件组合在一起。例如: ```javascript import Menu from './Menu'; import App from './App'; const MainApp = () => { return ( <div> <Menu /> <App /> </div> ); }; export default MainApp; ``` 通过以上步骤,你可以在React项目中实现基本的菜单和路由功能。请根据你的项目需求进行相应的调整和扩展。记得在菜单项中使用`Link`组件来实现路由跳转,而在路由组件中使用`Route`组件来定义路由配置和对应的组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值