【问题标题】:Rendering dynamic rows from the input field in REACT从 REACT 中的输入字段呈现动态行
【发布时间】:2020-09-25 17:15:20
【问题描述】:

我是 React 的新手,我的问题很简单,我有一个表单,它有一个输入字段,可以获取一些输入数据,在提交表单时,输入数据应该呈现为一行并删除按钮,我们可以删除它如果 onClicked 的数据。我已经实现了行的呈现,但在删除功能方面存在疑问。

App.js 文件的代码是,

import React, { Component } from "react";

export default class App extends Component {
  state = {
    names: [],
  };

  handleSubmit = (event) => {
    event.preventDefault();
    let value = document.getElementById("namevalue").value;
    const obj = { id: Date.now(), value };
    this.setState({
      names: [obj, ...this.state.names],
    });
    document.getElementById("myform").reset();
    
   
    return;
  };

  renderTable() {
    return (
      this.state.names &&
      this.state.names.map((name) => {
        const { id, value } = name; //destructuring
        return (
          <tr key={id}>
            <td>{value}</td>
            <td>
              <input
                type="button"
                value="Delete"
                onClick={this.deleteName(id)}
              />
            </td>
          </tr>
        );
      })
    );
  }

  deleteName = (id) => {
    console.log(id);
    /* this.setState({
      names: this.setState.names.filter((name) => name.id !== id),
    });*/
  };

  render() {
    return (
      <>
        <form onSubmit={this.handleSubmit} id="myform">
          <label>
            Name:
            <input type="text" name="name" id="namevalue" />
          </label>
          <input type="submit" value="Submit" />
        </form>

        {/* Table */}
        <br />
        <table>
          <tbody>
            <tr>
              <th>Names</th>
              <th>Operation</th>
            </tr>
            {/* Render dynamic rows
             */}
            {this.renderTable()}
          </tbody>
        </table>
      </>
    );
  }
}

你可以看到我已经实现了 delete 方法但是它抛出了错误

我想在单击删除按钮时删除该行,但单击按钮时会引发错误,

【问题讨论】:

  • deleteName(id)} />
  • 嗨@KostyaTresko,感谢您的回复,'this' 关键字是否会出现在方法名称的前面,如 onClick={(id) =>this.deleteName(id)}
  • 我还是不能删除值

标签: javascript html reactjs filter


【解决方案1】:

首先,onClick 值应该是函数引用,否则会引入渲染循环。

onClick={() => this.deleteName(id)}

然后可以使用array.splice函数实现删除功能,如下:

deleteName = (id) => {
    console.log(id);
    const { names } = this.state;
    const index = names.findIndex(name => name.id === id);
    this.setState({
      names: [
        ...names.splice(index, 1),
      ]
    })
  };

【讨论】:

    【解决方案2】:

    对于总是这样使用的 Class 组件, onClick={() => this.deleteName(id)}

    对于功能组件 onClick = {deleteName(id)

    【讨论】:

    • 没关系,但我不能使用过滤器选项来删除行并更新状态,this.setState.names && this.setState({ names: this.setState.names.filter((name) => name.id !== id), });
    • this.setState({ names: this.state.names.filter((name) => name.id !== id) });必须在 setState 中使用 state,不能再使用 setState 函数!
    • 嘿@Veno,你拯救了我的一天,非常感谢,我对 clsas 组件有点困惑,感谢 Hooks?
    【解决方案3】:
    
    export default class App extends Component {
    
      state = {
        names:[]
      };
    
      
      handleSubmit = (event) => {
        event.preventDefault();
        let value = document.getElementById("namevalue").value;
        const obj = { id: Date.now(), value };
        this.setState({
          names: [obj, ...this.state.names],
        });
        document.getElementById("myform").reset();
        
       
        return;
      };
    
      deleteName = (id) => {
        console.log(id);
         this.setState({
          names: this.state.names.filter((name) => name.id !== id) //corrected here
        });
      };
    
    
      renderTable() {
        return (
          this.state.names &&
          this.state.names.map((name) => {
            const { id, value } = name; //destructuring
            return (
              <tr key={id}>
                <td>{value}</td>
                <td>
                  <input
                    type="button"
                    value="Delete"
                    onClick={()=>this.deleteName(id)} //corrected here
                  />
                </td>
              </tr>
            );
          })
        );
      }
    
     
    
      render() {
        return (
          <>
            <form onSubmit={this.handleSubmit} id="myform">
              <label>
                Name:
                <input type="text" name="name" id="namevalue" />
              </label>
              <input type="submit" value="Submit" />
            </form>
    
            {/* Table */}
            <br />
            <table>
              <tbody>
                <tr>
                  <th>Names</th>
                  <th>Operation</th>
                </tr>
                {/* Render dynamic rows
                 */}
                {this.renderTable()}
              </tbody>
            </table>
          </>
        );
      }
    }```
    

    【讨论】:

    • Hey Akshay,感谢您的热情回复,我在这个项目中有一些功能需要增强,希望您能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多