Javascript 删除react中的子组件
首先,这个web应用程序是我第一个使用react的web应用程序之一,我使用JavaScript和C#net内核完成了它 我想做的是,点击一个按钮,我想创建一个出现在屏幕上的组件。 到目前为止,这一部分运作良好Javascript 删除react中的子组件,javascript,reactjs,Javascript,Reactjs,首先,这个web应用程序是我第一个使用react的web应用程序之一,我使用JavaScript和C#net内核完成了它 我想做的是,点击一个按钮,我想创建一个出现在屏幕上的组件。 到目前为止,这一部分运作良好 import FusePageSimple from '@fuse/core/FusePageSimple'; import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material
import FusePageSimple from '@fuse/core/FusePageSimple';
import { makeStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';
import React, {ParentComponent, useEffect, useRef,useState } from 'react';
import { useDispatch } from 'react-redux';
import LeftSideBar from './components/SideBarComp';
import RightSideComp from './components/RightSideComp';
import Hidden from '@material-ui/core/Hidden';
import Icon from '@material-ui/core/Icon';
import Button from '@material-ui/core/Button';
import IconButton from '@material-ui/core/IconButton';
import { tokensToRegExp } from 'path-to-regexp';
const useStyles = makeStyles(theme => ({
layoutRoot: {}
}));
function Dashboard(props) {
const [compCount, setCompCount] = useState(0);
const [component, setComponent] = useState('');
const eventhandler = data => {
if(data.eliminar === 1){
setComponent(component.filter((item) => item.props.RowNum !== data.RowNum));
}
};
const classes = useStyles(props);
const pageLayout = useRef(null);
const onAddChild = () => {
setCompCount(compCount + 1);
}
useEffect(() => {
const compArry = [...component];
if(compCount > 0 ){
compArry.push(<RightSideComp key={compCount} RowNum={compCount} onChange={eventhandler}/>)
}
setComponent(compArry);
}, [compCount]);
return (
<FusePageSimple
classes={{
root: classes.layoutRoot
}}
header={
<div className="flex flex-col flex-1">
<div className="flex items-center p-24 px-12">
<Hidden lgUp>
<IconButton
onClick={ev => pageLayout.current.toggleLeftSidebar()}
aria-label="open left sidebar"
>
<Icon>menu</Icon>
</IconButton>
</Hidden>
<div className="flex-1 lg:px-12">
<h4>Header</h4>
</div>
</div>
</div>
}
contentToolbar={
<div className="px-24">
<h4>Content Toolbar</h4>
</div>
}
content={
<div className="p-24">
<h4>Content</h4>
<br />
{component}
</div>
}
leftSidebarHeader={
<div className="p-24">
<h4>Sidebar Header</h4>
</div>
}
leftSidebarContent={
<div className="p-24">
<Button variant="contained" color="primary"
onClick={ev => onAddChild()}>
Novo
</Button>
{/* <Button variant="contained" color="primary">Copiar</Button> */}
<br />
<LeftSideBar />
</div>
}
innerScroll
ref={pageLayout}
/>
);
}
export default Dashboard;
从'@fuse/core/FusePageSimple'导入FusePageSimple';
从'@material ui/core/styles'导入{makeStyles};
从“@material ui/core/Typography”导入排版;
从'React'导入React,{ParentComponent,useffect,useRef,useState};
从'react redux'导入{useDispatch};
从“/components/SideBarComp”导入左侧边栏;
从“./components/RightSideComp”导入RightSideComp;
从“@material ui/core/Hidden”导入隐藏项;
从“@material ui/core/Icon”导入图标;
从“@material ui/core/Button”导入按钮;
从“@material ui/core/IconButton”导入IconButton;
从'path to regexp'导入{tokensToRegExp};
const useStyles=makeStyles(主题=>({
layoutRoot:{}
}));
功能仪表板(道具){
const[compCount,setCompCount]=useState(0);
const[component,setComponent]=useState(“”);
const eventhandler=data=>{
如果(data.eliminar==1){
setComponent(component.filter((item)=>item.props.RowNum!==data.RowNum));
}
};
常量类=使用样式(道具);
const pageLayout=useRef(null);
const onAddChild=()=>{
setCompCount(compCount+1);
}
useffect(()=>{
常量比较=[…组件];
如果(compCount>0){
compary.push()
}
设置组件(比较);
},[compCount]);
返回(
菜单
标题
}
内容工具栏={
内容工具栏
}
内容={
内容
{component}
}
左侧边栏标题={
边栏标题
}
左侧边栏内容={
onAddChild()}>
诺沃
{/*Copiar*/}
}
内卷轴
ref={pageLayout}
/>
);
}
导出默认仪表板;
这是家长的代码。
因此,通过单击按钮“Novo”(英语中的意思是“New”),我调用onAddChild(),将其添加到compCount中,然后使用useffect添加子组件。我将2个道具传递给该子级RowNum、我正在创建的组件数量以及状态更改时触发的事件
import React,{ useEffect, useState } from 'react';
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import TextField from '@material-ui/core/TextField';
import { makeStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
import Divider from '@material-ui/core/Divider';
const useStyles = makeStyles(theme => ({
root: {
'& .MuiTextField-root': {
margin: theme.spacing(2),
width: '25ch'
}
}
}));
function RightSideComp(props) {
const classes = useStyles();
const [component, setComponent] = useState({
dataInicio: (!(props.datastate) ? '' : props.datastate.dataInicio),
dataFim: (!(props.datastate) ? '' : props.datastate.dataFim),
descricao: (!(props.datastate) ? '' : props.datastate.descricao),
RowNum: props.RowNum,
eliminar: 0,
copiar: 0
});
console.log(component);
const handleChangeInput = event => {
const { name, value } = event.target;
setComponent(prevState => ({
...prevState,
[name]: value
}));
};
const handleChangeButtonCopiar = event => {
setComponent(preState => ({ ...preState, copiar: 1 }));
};
const handleChangeButtonEliminar = event => {
setComponent(preState => ({ ...preState, eliminar: 1 }));
};
useEffect(() => {
props.onChange(component);
}, [component]);
return (
<div>
<div className={classes.root}>
<TextField
id="dataInicio"
label="Data Inicio"
name="dataInicio"
type="datetime-local"
className={classes.textField}
value={component.dataInicio}
onChange={ev => handleChangeInput(ev)}
InputLabelProps={{
shrink: true
}}
/>
<TextField
id="dataFim"
name="dataFim"
label="Data do Fim"
type="datetime-local"
className={classes.textField}
value={component.dataFim}
onChange={ev => handleChangeInput(ev)}
InputLabelProps={{
shrink: true
}}
/>
<TextField
id="outlined-multiline-flexible"
label="Multiline"
name="descricao"
multiline
rowsMax={5}
value={component.descricao}
onChange={ev => handleChangeInput(ev)}
variant="outlined"
/>
<div>
<Button variant="contained" color="primary" onClick={ev => handleChangeButtonCopiar(ev)}>
Copiar
</Button>
<Button variant="contained" color="secondary" onClick={ev => handleChangeButtonEliminar(ev)}>
Eliminar
</Button>
</div>
</div>
<Divider />
</div>
);
}
export default React.memo(RightSideComp);
import React,{useffect,useState}来自“React”;
从'@reduxjs/toolkit'导入{createSlice,createAsyncThunk};
从“@material ui/core/TextField”导入TextField;
从'@material ui/core/styles'导入{makeStyles};
从“@material ui/core/Button”导入按钮;
从“@material ui/core/Divider”导入分隔器;
const useStyles=makeStyles(主题=>({
根目录:{
“&.MuiTextField根”:{
边距:主题。间距(2),
宽度:25厘米
}
}
}));
功能RightSideComp(道具){
const classes=useStyles();
const[component,setComponent]=useState({
dataInicio:(!(props.datastate)?“”:props.datastate.dataInicio),
dataFim:(!(props.datastate)?“”:props.datastate.dataFim),
descripcao:(!(props.datastate)?“”:props.datastate.descripcao),
RowNum:props.RowNum,
eliminar:0,
复印机:0
});
控制台日志(组件);
const handleChangeInput=事件=>{
常量{name,value}=event.target;
setComponent(prevState=>({
…国家,
[名称]:值
}));
};
const handleChangeButtonCopiar=事件=>{
setComponent(preState=>({…preState,copiar:1}));
};
const handleChangeButtonEliminar=事件=>{
setComponent(preState=>({…preState,eliminar:1}));
};
useffect(()=>{
道具更换(组件);
},[组成部分];
返回(
handleChangeInput(ev)}
输入道具={{
心理医生:是的
}}
/>
handleChangeInput(ev)}
输入道具={{
心理医生:是的
}}
/>
handleChangeInput(ev)}
variant=“概述”
/>
HandleChangeButtonCopaiar(ev)}>
副驾驶
handleChangeButtonEliminar(ev)}>
Eliminar
);
}
导出默认反应备忘录(RightSideComp);
这就是我的孩子。
因此,我的错误是当我更改eliminar(英语中的“delete”)时,该组件被删除。对于我的代码,如果它是最后一行,它会很好地删除,但是如果它是中间的一行,它会删除该行以及我单击的那一行下面的所有其他行。我试过用slice,但效果不太好。我错过了什么,但是什么
谢谢您的时间我想您需要使用“useRef”
const refsList = React.useRef([]);
然后当你创造一些东西的时候
compArry.push(<RightSideComp ref={refsList[compCount]} key={compCount} RowNum={compCount} onChange={eventhandler}/>)
所以byt使用“UseRef”可以访问组件本身?我无法访问它,数组始终为0,我需要填充它吗?
refsList[0].current.remove()