Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数据删除行不刷新的反应表_Javascript_Arrays_Reactjs - Fatal编程技术网

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: "" }
        ]
      });

  • 您不需要在onClick上传递listener,即
  • (你不需要它,你可以这么做)

  • 不要传递e.target.name | | e.target.closest(“按钮”).name只需传递对象(如果将来需要其他数据会更容易),即
  • 最重要的是,您已经将所有输入值设置为defaultValue,因为它是受控组件,所以您需要在值道具中传递值。再次阅读该文档,以明确语义。我可以解释,但要学会自己;-)
    
    
    以下是工作代码沙盒链接:

    注意:我对您的一些代码进行了注释。它只是一种逻辑,用来指导它如何在其中工作。您可以在此处注释并携带代码

    从“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>
          </>
        );
      }
    }