Javascript 从数据删除行不刷新的反应表
我有一个表,根据这些数据呈现Javascript 从数据删除行不刷新的反应表,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我有一个表,根据这些数据呈现 { key: 1, model: "11111111", sn: "TERR5RRTR555465", fv: "FV/12344/2019" }, { key: 2, model: "2222222", sn: "TERR5RRTR555465", fv: "FV/12344/2019" }, { key: 3, model: "33333", sn: "TERR5RRTR555465", fv: "FV/1234
{
key: 1,
model: "11111111",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{
key: 2,
model: "2222222",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{
key: 3,
model: "33333",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{
key: 4,
model: "44444444",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
}
行具有从表中删除行的按钮。双击后,将从数据中删除行,但在第页上,仅删除表中的最后一行。若我删除另一个随机行,页面上的“删除总是最后一行”表
问题在哪里?我不明白的地方在哪里
我的例子是:
和代码:
import React from "react";
import { Button, Form, Input, Message, Table } from "semantic-ui-react";
import "./styles.css";
import "semantic-ui-css/semantic.min.css";
export default class App extends React.Component {
constructor() {
super();
this.state = {
lista: [
{
key: 1,
model: "11111111",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{
key: 2,
model: "2222222",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{ key: 3, model: "33333", sn: "TERR5RRTR555465", fv: "FV/12344/2019" },
{
key: 4,
model: "44444444",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{ key: 5, model: "5555555", sn: "TERR5RRTR555465", fv: "FV/12344/2019" }
]
};
this.toDoChangeValues = this.toDoChangeValues.bind(this);
this.removeListIndex = this.removeListIndex.bind(this);
}
toDoChangeValues(n, v) {
var nam = n.split("_");
var list = this.state.lista;
var indx = list.findIndex(x => x.key == nam[1]);
list[indx][nam[0]] = v;
this.setState({ lista: list });
}
removeListIndex(n) {
this.setState(prevState => ({
lista: prevState.lista.filter(row => row.key != n)
}));
}
render() {
if (
this.state.lista.find(function(x) {
return x.model === "" && x.sn === "" && x.fv === "";
}) === undefined
) {
var new_id = Math.max.apply(null, [
...this.state.lista.map(function(o) {
return o.key;
}),
0
]);
this.setState({
lista: [
...this.state.lista,
{ key: new_id + 1, model: "", sn: "", fv: "" }
]
});
}
const { lista } = this.state;
return (
<>
<div className="segm_space">
<Message attached header="Table list" />
<Form className="attached fluid segment">
<Table
basic="very"
celled
compact
className="list_hardwares"
unstackable
>
<Table.Header>
<Table.Row>
<Table.HeaderCell>Data</Table.HeaderCell>
<Table.HeaderCell>Number</Table.HeaderCell>
<Table.HeaderCell>Type</Table.HeaderCell>
<Table.HeaderCell style={{ width: "1%" }} />
</Table.Row>
</Table.Header>
<Table.Body>
{lista.map(
function(object) {
return (
<RowData
obj={object}
rmveIndx={this.removeListIndex}
chVal={this.toDoChangeValues}
/>
);
}.bind(this)
)}
</Table.Body>
</Table>
</Form>
</div>
</>
);
}
}
export class RowData extends React.Component {
constructor() {
super();
this.state = {
trash: false
};
this.onTodoChange = this.onTodoChange.bind(this);
this.onTrash = this.onTrash.bind(this);
}
onTodoChange(e) {
const { name, value } = e.target;
this.props.chVal(name, value);
}
onTrash(e) {
if (!this.state.trash) {
this.setState({ trash: true }, () => {
setTimeout(
function() {
this.setState({ trash: false });
}.bind(this),
2000
);
});
} else {
this.props.rmveIndx(e.target.name || e.target.closest("button").name);
}
}
render() {
return (
<Table.Row id={"id_" + this.props.obj.key}>
<Table.Cell>
<Input
fluid
transparent
onChange={this.onTodoChange}
name={"model_" + this.props.obj.key}
placeholder="00000000000"
defaultValue={this.props.obj.model}
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
onChange={this.onTodoChange}
name={"sn_" + this.props.obj.key}
placeholder="XXXXXXXXXXXXXXX"
defaultValue={this.props.obj.sn}
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
onChange={this.onTodoChange}
defaultValue={this.props.obj.fv}
/>
</Table.Cell>
<Table.Cell>
<Button
name={this.props.obj.key}
onClick={this.onTrash}
color={this.state.trash ? "blue" : undefined}
compact
size="tiny"
icon="trash"
/>
</Table.Cell>
</Table.Row>
);
}
}
从“React”导入React;
从“语义ui react”导入{按钮、表单、输入、消息、表格};
导入“/styles.css”;
导入“语义ui css/semantic.min.css”;
导出默认类App扩展React.Component{
构造函数(){
超级();
此.state={
lista:[
{
重点:1,,
型号:“11111111”,
序号:“TERR5RRTR555465”,
fv:“fv/12344/2019”
},
{
重点:二,,
型号:“2222222”,
序号:“TERR5RRTR555465”,
fv:“fv/12344/2019”
},
{键:3,型号:“33333”,序号:“TERR5RRTR555465”,fv:“fv/12344/2019”},
{
重点:四,,
型号:“4444”,
序号:“TERR5RRTR555465”,
fv:“fv/12344/2019”
},
{键:5,型号:“5555555”,序号:“TERR5RRTR555465”,fv:“fv/12344/2019”}
]
};
this.toDoChangeValues=this.toDoChangeValues.bind(this);
this.removeListIndex=this.removeListIndex.bind(this);
}
TODOCHANGE值(n,v){
var nam=n.split(“”);
var list=this.state.lista;
var indx=list.findIndex(x=>x.key==nam[1]);
列表[indx][nam[0]]=v;
this.setState({lista:list});
}
removeListIndex(n){
this.setState(prevState=>({
lista:prevState.lista.filter(行=>row.key!=n)
}));
}
render(){
如果(
this.state.lista.find(函数(x){
返回x.model===”&&x.sn==”&&x.fv==”;
})==未定义
) {
var new_id=Math.max.apply(null[
…this.state.lista.map(函数(o){
返回o键;
}),
0
]);
这是我的国家({
lista:[
…这个州,lista,
{key:new_id+1,model:,sn:,fv:}
]
});
}
const{lista}=this.state;
返回(
数据
数字
类型
{lista.map(
功能(对象){
返回(
);
}.绑定(此)
)}
);
}
}
导出类RowData扩展React.Component{
构造函数(){
超级();
此.state={
垃圾:错
};
this.onTodoChange=this.onTodoChange.bind(this);
this.onTrash=this.onTrash.bind(this);
}
onTodoChange(东){
常量{name,value}=e.target;
this.props.chVal(名称、值);
}
恩特拉什(e){
如果(!this.state.trash){
this.setState({trash:true},()=>{
设置超时(
函数(){
this.setState({trash:false});
}.绑定(此),
2000
);
});
}否则{
this.props.rmveIndx(e.target.name | | e.target.closest(“button”).name);
}
}
render(){
返回(
);
}
}
代码中几乎没有错误:
1.您不需要在渲染函数中设置状态
//Your Code
this.setState({
lista: [
...this.state.lista,
{ key: new_id + 1, model: "", sn: "", fv: "" }
]
});
以下是工作代码沙盒链接:
注意:我对您的一些代码进行了注释。它只是一种逻辑,用来指导它如何在其中工作。您可以在此处注释并携带代码从“React”导入React;
import React from "react";
import { Button, Form, Input, Message, Table } from "semantic-ui-react";
import "./styles.css";
import "semantic-ui-css/semantic.min.css";
export default class App extends React.Component {
constructor() {
super();
this.state = {
inputFocus: null,
lista: [
{
key: 1,
model: "11111111",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{
key: 2,
model: "2222222",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{ key: 3, model: "33333", sn: "TERR5RRTR555465", fv: "FV/12344/2019" },
{
key: 4,
model: "44444444",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{ key: 5, model: "5555555", sn: "TERR5RRTR555465", fv: "FV/12344/2019" }
]
};
}
handleChange = (value,name,id) => {
const {lista} = this.state;
const newData = [...lista.filter(item => item.key !== id), { ...lista.filter(item => item.key === id)[0], [name]: value}];
this.setState({lista: newData});
}
addData = () => {
const {lista} = this.state;
this.setState({ lista: [...lista, { key: lista[lista.length - 1].key + 1, model: this.model.inputRef.current.value, sn: this.sn.inputRef.current.value, fv: this.fv.inputRef.current.value}]});
this.model.inputRef.current.value = '';
this.sn.inputRef.current.value = '';
this.fv.inputRef.current.value = '';
}
trash = (id) => {
this.setState({lista: this.state.lista.filter(item => item.key !== id)});
}
render() {
const { lista } = this.state;
return (
<>
<div className="segm_space">
<Message attached header="Table list" />
<Form className="attached fluid segment">
<Table
basic="very"
celled
compact
className="list_hardwares"
unstackable
>
<Table.Header>
<Table.Row>
<Table.HeaderCell>Data</Table.HeaderCell>
<Table.HeaderCell>Number</Table.HeaderCell>
<Table.HeaderCell>Type</Table.HeaderCell>
<Table.HeaderCell style={{ width: "1%" }} />
</Table.Row>
</Table.Header>
<Table.Body>
{lista.sort((prev,next) => {
if (prev.key > next.key) return 1;
return -1;
}).map(item => <Table.Row key={item.key}>
<Table.Cell>
<Input
fluid
transparent
name='model'
onChange={(e,data) => this.handleChange(data.value,data.name, item.key)}
placeholder="00000000000"
defaultValue={item.model}
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
name='sn'
onChange={(e, data) => this.handleChange(data.value, data.name, item.key)}
placeholder="XXXXXXXXXXXXXXX"
defaultValue={item.sn}
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
name='fv'
onChange={(e, data) => this.handleChange(data.value, data.name, item.key)}
defaultValue={item.fv}
/>
</Table.Cell>
<Table.Cell>
<Button
onClick={() => this.trash(item.key)}
compact
size="tiny"
icon="trash"
/>
</Table.Cell>
</Table.Row>)}
<Table.Row>
<Table.Cell>
<Input
fluid
transparent
name='model'
ref={n => this.model = n}
placeholder="00000000000"
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
name='sn'
ref={n => this.sn = n}
placeholder="XXXXXXXXXXXXXXX"
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
name='fv'
ref={n => this.fv = n}
/>
</Table.Cell>
<Table.Cell>
<Button
compact
size="tiny"
icon="add"
onClick={this.addData}
/>
</Table.Cell>
</Table.Row>
</Table.Body>
</Table>
</Form>
</div>
</>
);
}
}
从“语义ui react”导入{按钮、表单、输入、消息、表格};
导入“/styles.css”;
导入“语义ui css/semantic.min.css”;
导出默认类App扩展React.Component{
构造函数(){
超级();
此.state={
inputFocus:null,
lista:[
{
重点:1,,
型号:“11111111”,
序号:“TERR5RRTR555465”,
fv:“fv/12344/2019”
},
{
重点:二,,
型号:“2222222”,
序号:“TERR5RRTR555465”,
fv:“fv/12344/2019”
},
{键:3,型号:“33333”,序号:“TERR5RRTR555465”,fv:“fv/12344/2019”},
{
重点:四,,
型号:“4444”,
序号:“TERR5RRTR555465”,
fv:“fv/12344/2019”
},
{键:5,型号:“5555555”,序号:“TERR5RRTR555465”,fv:“fv/12344/2019”}
]
};
}
handleChange=(值、名称、id)=>{
const{lista}=this.state;
const newData=[…lista.filter(item=>item.key!==id),{…lista.filter(item=>item.key==id)[0],[name]:value};
this.setState({lista:newData});
}
addData=()=>{
const{lista}=this.state;
this.setState({lista:[…lista,{key:lista[lista.length-1].key+1,model:this.model.inputRef.current.value,sn:this.sn.inputRef.current.value,fv:this.fv.inputRef.current.value});
this.model.inputRef.current.value='';
this.sn.inputRef.current.value='';
this.fv.inputR
onTrash(e) {
this.props.rmveIndx();
}
{lista.map(object => <RowData
obj={object}
rmveIndx={() => this.removeListIndex(object)} //Note here
chVal={this.toDoChangeValues}
/>)
removeListIndex(n) {
this.setState(prevState => ({
lista: prevState.lista.filter(row => row.key !== n.key)
}));
}
<Table.Row id={"id_" + this.props.obj.key}>
<Table.Cell>
<Input
fluid
transparent
onChange={this.onTodoChange}
name={"model_" + this.props.obj.key}
placeholder="00000000000"
defaultValue={this.props.obj.model}
value={this.props.obj.model}
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
onChange={this.onTodoChange}
name={"sn_" + this.props.obj.key}
placeholder="XXXXXXXXXXXXXXX"
defaultValue={this.props.obj.sn}
value={this.props.obj.sn}
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
onChange={this.onTodoChange}
defaultValue={this.props.obj.fv}
value={this.props.obj.fv}
/>
</Table.Cell>
<Table.Cell>
<Button
name={this.props.obj.key}
onClick={this.onTrash}
color={this.state.trash ? "blue" : undefined}
compact
size="tiny"
icon="trash"
/>
</Table.Cell>
</Table.Row>
import React from "react";
import { Button, Form, Input, Message, Table } from "semantic-ui-react";
import "./styles.css";
import "semantic-ui-css/semantic.min.css";
export default class App extends React.Component {
constructor() {
super();
this.state = {
inputFocus: null,
lista: [
{
key: 1,
model: "11111111",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{
key: 2,
model: "2222222",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{ key: 3, model: "33333", sn: "TERR5RRTR555465", fv: "FV/12344/2019" },
{
key: 4,
model: "44444444",
sn: "TERR5RRTR555465",
fv: "FV/12344/2019"
},
{ key: 5, model: "5555555", sn: "TERR5RRTR555465", fv: "FV/12344/2019" }
]
};
}
handleChange = (value,name,id) => {
const {lista} = this.state;
const newData = [...lista.filter(item => item.key !== id), { ...lista.filter(item => item.key === id)[0], [name]: value}];
this.setState({lista: newData});
}
addData = () => {
const {lista} = this.state;
this.setState({ lista: [...lista, { key: lista[lista.length - 1].key + 1, model: this.model.inputRef.current.value, sn: this.sn.inputRef.current.value, fv: this.fv.inputRef.current.value}]});
this.model.inputRef.current.value = '';
this.sn.inputRef.current.value = '';
this.fv.inputRef.current.value = '';
}
trash = (id) => {
this.setState({lista: this.state.lista.filter(item => item.key !== id)});
}
render() {
const { lista } = this.state;
return (
<>
<div className="segm_space">
<Message attached header="Table list" />
<Form className="attached fluid segment">
<Table
basic="very"
celled
compact
className="list_hardwares"
unstackable
>
<Table.Header>
<Table.Row>
<Table.HeaderCell>Data</Table.HeaderCell>
<Table.HeaderCell>Number</Table.HeaderCell>
<Table.HeaderCell>Type</Table.HeaderCell>
<Table.HeaderCell style={{ width: "1%" }} />
</Table.Row>
</Table.Header>
<Table.Body>
{lista.sort((prev,next) => {
if (prev.key > next.key) return 1;
return -1;
}).map(item => <Table.Row key={item.key}>
<Table.Cell>
<Input
fluid
transparent
name='model'
onChange={(e,data) => this.handleChange(data.value,data.name, item.key)}
placeholder="00000000000"
defaultValue={item.model}
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
name='sn'
onChange={(e, data) => this.handleChange(data.value, data.name, item.key)}
placeholder="XXXXXXXXXXXXXXX"
defaultValue={item.sn}
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
name='fv'
onChange={(e, data) => this.handleChange(data.value, data.name, item.key)}
defaultValue={item.fv}
/>
</Table.Cell>
<Table.Cell>
<Button
onClick={() => this.trash(item.key)}
compact
size="tiny"
icon="trash"
/>
</Table.Cell>
</Table.Row>)}
<Table.Row>
<Table.Cell>
<Input
fluid
transparent
name='model'
ref={n => this.model = n}
placeholder="00000000000"
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
name='sn'
ref={n => this.sn = n}
placeholder="XXXXXXXXXXXXXXX"
/>
</Table.Cell>
<Table.Cell>
<Input
fluid
transparent
name='fv'
ref={n => this.fv = n}
/>
</Table.Cell>
<Table.Cell>
<Button
compact
size="tiny"
icon="add"
onClick={this.addData}
/>
</Table.Cell>
</Table.Row>
</Table.Body>
</Table>
</Form>
</div>
</>
);
}
}