如何在react js的对话框中自动填充数据?

IT技术 reactjs
2021-05-03 07:05:48

我有一个根组件。从那里我调用欢迎页面,该页面显示已注册的学生的详细信息以及每行中的编辑和删除按钮。删除功能工作正常,用于删除一行,但我的要求是当我单击编辑按钮时,所选学生的详细信息应自动填充在对话框中,更新完成后,最终结果应发布回起始页。应用程序-->Todo.js-->EditDialog.js

App.js


import React, { Component } from 'react';
import FormDialog from './FormDialog'
import Todo from './ToDo'
import EditDialog from './EditDialog'



import './App.css';



class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      mode: false
    };

  }

  showForm()
  {
    this.setState({mode:!this.state.mode})
  }

  render() {
    return (
      <div className="App">        
        <button onClick={this.showForm.bind(this)}>Welcome</button>
        {this.state.mode? <Todo/>:null}


        </div>

    );
  }
}

export default App;

Todo.js

import React, { Component } from 'react';
import './Todo.css'
import EditDialog from './EditDialog'
import FormDialog from './FormDialog'
import Dialog from '@material-ui/core/Dialog';
import { thisExpression } from '@babel/types';

class Todo extends Component {

  state = {    edit: false, id: null,view:false,editview:false,
    students: [
      { id: 1, name: 'Wasif', age: 21, email: 'wasif@email.com' },
      { id: 2, name: 'Ali', age: 19, email: 'ali@email.com' },
      { id: 3, name: 'Saad', age: 16, email: 'saad@email.com' },
      { id: 4, name: 'Asad', age: 25, email: 'asad@email.com' },
      { id: 5, name: 'kiwi', age: 20, email: 'kiwi@email.com' }
   ], }



   onDeleteHandle() {let id = arguments[0];
    this.setState({students:this.state.students.filter(item => {if (item.id !== id)
       {return item;}})});}


  onUpdateHandle(id,name,age,email){

    this.setState({students: this.state.students.map(item => {
      if (item.id === this.state.id){
        item['id'] = id;        
        item['name']=name;
        item['age']=age;
        item['email']=email;
      }return item;})})
      this.setState({edit: false});
  }


  signUpDialog(){
    this.setState({view:!this.state.view})
  }   

  editFormDialog(){
    this.setState({editview:!this.state.editview})
  }


  renderEditForm() {
    if (this.state.edit) {
    return <form onSubmit={this.onUpdateHandle.bind(this)}>
    <input type="text" name="updatedItem" className="item" defaultValue={this.state.id} />
    <input type="text" name="updatedItem1" className="item" defaultValue={this.state.name} />
    <input type="text" name="updatedItem2" className="item" defaultValue={this.state.age} />
    <input type="text" name="updatedItem3" className="item" defaultValue={this.state.email} />
    <button className="update-add-item">Update</button> 
    </form>    }  }


    onEditHandle(event) {
    this.setState({edit: true,id: arguments[0],name:arguments[1],age:arguments[2],email:arguments[3]});}


    onSubmitHandle(id,name,age,email) { 

      this.setState({students: [...this.state.students, {
        id:id,
        name:name,
        age:age,
        email:email
      }]})
    }; 



     render() 

          {    
           return<div style={{width: "500px",background : "beige"}} >     


                  <button onClick={this.signUpDialog.bind(this)}>Sign-UP</button>
                 {this.state.view? <FormDialog details={this.onSubmitHandle.bind(this)}/> :null}

                   <table>{this.state.students.map(abc => (<tr><td>{abc.id}</td><td>{abc.name}</td><td>{abc.age}</td><td>{abc.email}</td><td>
                    <button onClick={this.onDeleteHandle.bind(this, abc.id)}>Delete</button></td>
                    <button onClick={this.editFormDialog.bind(this)}>Edit</button>
                    {this.state.editview? <EditDialog updDetails={this.onUpdateHandle.bind(this)}/>:null}

                    </tr>))}</table> </div>  
              }
            }

              export default Todo;

编辑对话框.js

import React, {Component} from 'react';
import Todo from './ToDo'
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';


class EditDialog extends Component{
    constructor(props){

        super(props);
        this.state={editDetails: true,view:false}
    }
    onUpdateHandle(event){
        event.preventDefault();
        this.setState({students: this.state.students.map(item => {
          if (item.id === this.state.id){
            item['id'] = event.target.updatedItem.value;        
            item['name']=event.target.updatedItem1.value;
            item['age']=event.target.updatedItem2.value;
            item['email']=event.target.updatedItem3.value;
          }return item;})})
          this.setState({edit: false});
      }
    renderEditForm() {
        if (this.state.editDetails) {
        return <form onSubmit={this.onUpdateHandle.bind(this)}>
        <input type="text" name="updatedItem" className="item" defaultValue={this.state.id} />
        <input type="text" name="updatedItem1" className="item" defaultValue={this.state.name} />
        <input type="text" name="updatedItem2" className="item" defaultValue={this.state.age} />
        <input type="text" name="updatedItem3" className="item" defaultValue={this.state.email} />
        <button className="update-add-item">Update</button> 
        </form>    }  }
         handleClose(){
            this.setState({view:!this.state.view})
          }




    render()
    {
     return(
     <div> 


          <Dialog  open>
          <DialogTitle>Edit The Details</DialogTitle>
              <form>
              <label >ID</label>
                   <input type="number"  name="id" className="item"  />
                 <label>Name</label>
                   <input type="text" name="item" className="item"  />
                   <label>age</label>
                   <input type="number" name="xyz" className="item"  />
                   <label>email</label>
                   <input type="text" name="email" className="item"  />  
                   <button className="btn-add-item" >Add</button> 

                  </form>
                  <Button onClick={this.handleClose.bind(this)} color="primary">
            Cancel
          </Button></Dialog>   


     </div> )

    }

}
export default EditDialog;

我使用了回调函数并传递了更新函数。但是对于 EditDialog 框,详细信息不会自动填充,我还需要在对话框中执行更新并将结果发布回来。

1个回答

一个问题:

您将您<EditDialog />的 Array 循环 ( students.map) 放入文件中ToDo.js,因此当您的状态 ( state.editview) 变为true一起显示时,您将有 5 个对话框显示在一起,因此您看不到第一个。

所以让我们把它放在你的循环(地图)之外:

// FROM HERE
</tr>))
}
</table>
// TO HERE
{this.state.editview? <EditDialog updDetails={this.onUpdateHandle.bind(this)}/>:null}
</div>

你的答案:

您应该将当前学生作为props传递给您的对话框,以便您可以查看被单击的学生。类似于您的onDeleteHandle功能的东西执行以下步骤:

1)currentStudent将你的ToDo状态添加到你的状态:

state = {
        edit: false, id: null, view: false, editview: false,
        students: [
            {id: 1, name: 'Wasif', age: 21, email: 'wasif@email.com'},
            {id: 2, name: 'Ali', age: 19, email: 'ali@email.com'},
            {id: 3, name: 'Saad', age: 16, email: 'saad@email.com'},
            {id: 4, name: 'Asad', age: 25, email: 'asad@email.com'},
            {id: 5, name: 'kiwi', age: 20, email: 'kiwi@email.com'}
        ],
        currentStudent: {} // ADD THIS ONE
    }

2)将您的学生证传递给您的功能editFormDialog,就像您的删除功能一样:(abc.id)

<button onClick={this.editFormDialog.bind(this, abc.id)}>Edit</button>

3)在你的editFormDialog函数中找到你的学生,就像你所做的那样,onUpdateHandle但这次你必须找到相同的 ID 并更新你的currentStudent状态:

editFormDialog() {

        let id = arguments[0]; // Or better to pass it as a parameter: editFormDialog(id) { ... }
        this.setState({
            currentStudent: this.state.students.filter(item => {
                if (item.id === id) { // IDs should be Equal
                    return item;
                }
            })
        });

        this.setState({editview: !this.state.editview})
    }

4)现在你有你currentStudent的状态。所以你必须把它放在你的<EditDialog />, 这样你就可以在你的EditDialog类 (EditDialog.js) 中访问它向您的 中添加一个属性<EditDialog />,我将其命名为currentStudent

{
    this.state.editview
        ? <EditDialog
            currentStudent={this.state.currentStudent} // THIS PROPERTY
            updDetails={this.onUpdateHandle.bind(this)}
        />
        : null
}

5)现在你可以EditDialog像这样访问你的 currentStudent类:

// Add a State to EditDialog
this.state = {
      editDetails: true,
      view: false,
      updatedValues: {
           id: null,
           email: null
      }
}

// We use this to Mount it for the first time (Prevent Loop Renders)    
componentDidMount() {
    this.setState({
        updatedValues: {
            id: this.props.currentStudent[0].id,
            email: this.props.currentStudent[0].email
        }
    });
}

// We should do this to update the input value to the state
<input type="text" name="email" className="item" onInput={this.updateStateHandler} value={this.state.updatedValues.email}/>

// And we of course need the updateHandler method
updateStateHandler = (e) => {
    this.setState({
        updatedValues: {
            ...this.state.updatedValues,
            email: e.target.value
        }
    });
};

我刚刚在render()方法中填写了电子邮件输入你也可以填其他的。

6)现在要将数据传递回 ToDo 并使用新值更新表,您必须handleUpdate在对话框中添加方法,如下所示:

handleUpdate(e) {
    e.preventDefault();
    this.props.closeModal();
    this.props.updateStudentHandler(this.state.updatedValues);
}

7)所以你需要传递closeModalupdateStudentHandler离开你的 ToDo 类。你的 EditDialog 应该是这样的:

<EditDialog
      currentStudent={this.state.currentStudent}
      updDetails={this.onUpdateHandle.bind(this)}
      updateStudentHandler={this.updateStudent}
      closeModal={this.closeModal}
/>

和处理程序:

updateStudent = (updatedValues) => {

    let newStudents = [...this.state.students];
    newStudents.map(
        student => {
            if (student.id === updatedValues.id) {
                student.email = updatedValues.email;
            }
        }
    );

    this.setState({
        students: newStudents
    });
}

closeModal = () => {
    this.setState({
        editview: false
    });
}

注意 1:要关闭对话框,我看到您更改了错误的 EditDialog 类的状态。您应该像顶部的 closeModal 方法一样在 ToDo 状态中处理它。

注意 2:this在上述方法中访问,您应该使用 ES6 箭头函数。

最后你的ToDoEditDialog类应该是这样的:

待办事项

import React, {Component} from 'react';
import './Todo.css'
import EditDialog from './EditDialog'
import FormDialog from './FormDialog'
import Dialog from '@material-ui/core/Dialog';
import {thisExpression} from '@babel/types';

class Todo extends Component {

    state = {
        edit: false, id: null, view: false, editview: false,
        students: [
            {id: 1, name: 'Wasif', age: 21, email: 'wasif@email.com'},
            {id: 2, name: 'Ali', age: 19, email: 'ali@email.com'},
            {id: 3, name: 'Saad', age: 16, email: 'saad@email.com'},
            {id: 4, name: 'Asad', age: 25, email: 'asad@email.com'},
            {id: 5, name: 'kiwi', age: 20, email: 'kiwi@email.com'}
        ],
        currentStudent: {}
    }

    onDeleteHandle() {
        let id = arguments[0];
        this.setState({
            students: this.state.students.filter(item => {
                if (item.id !== id) {
                    return item;
                }
            })
        });
    }

    onUpdateHandle(id, name, age, email) {

        this.setState({
            students: this.state.students.map(item => {
                if (item.id === this.state.id) {
                    item['id'] = id;
                    item['name'] = name;
                    item['age'] = age;
                    item['email'] = email;
                }
                return item;
            })
        })
        this.setState({edit: false});
    }

    signUpDialog() {
        this.setState({view: !this.state.view})
    }

    editFormDialog(id) {

        // let id = arguments[0];
        this.setState({
            currentStudent: this.state.students.filter(item => {
                if (item.id === id) {
                    return item;
                }
            })
        });

        this.setState({editview: !this.state.editview})
    }

    updateStudent = (updatedValues) => {

        let newStudents = [...this.state.students];
        newStudents.map(
            student => {
                if (student.id === updatedValues.id) {
                    student.name = updatedValues.name;
                    student.age = updatedValues.age;
                    student.email = updatedValues.email;
                }
            }
        );

        this.setState({
            students: newStudents
        });
    }

    closeModal = () => {
        this.setState({
            editview: false
        });
    }

    renderEditForm() {
        if (this.state.edit) {
            return <form onSubmit={this.onUpdateHandle.bind(this)}>
                <input type="text" name="updatedItem" className="item" defaultValue={this.state.id}/>
                <input type="text" name="updatedItem1" className="item" defaultValue={this.state.name}/>
                <input type="text" name="updatedItem2" className="item" defaultValue={this.state.age}/>
                <input type="text" name="updatedItem3" className="item" defaultValue={this.state.email}/>
                <button className="update-add-item">Update</button>
            </form>
        }
    }

    onEditHandle(event) {
        this.setState({edit: true, id: arguments[0], name: arguments[1], age: arguments[2], email: arguments[3]});
    }

    onSubmitHandle(id, name, age, email) {

        this.setState({
            students: [...this.state.students, {
                id: id,
                name: name,
                age: age,
                email: email
            }]
        })
    };

    render() {
        return <div style={{width: "500px", background: "beige"}}>
            <table>
                <tbody>
                {
                    this.state.students.map(abc => (<tr key={abc.id}>
                        <td>{abc.id}</td>
                        <td>{abc.name}</td>
                        <td>{abc.age}</td>
                        <td>{abc.email}</td>
                        <td>
                            <button onClick={this.onDeleteHandle.bind(this, abc.id)}>Delete</button>
                        </td>
                        <td>
                            <button onClick={this.editFormDialog.bind(this, abc.id)}>Edit</button>
                        </td>
                    </tr>))
                }
                </tbody>
            </table>

            {
                this.state.editview
                    ? <EditDialog
                        currentStudent={this.state.currentStudent}
                        updDetails={this.onUpdateHandle.bind(this)}
                        updateStudentHandler={this.updateStudent}
                        closeModal={this.closeModal}
                    />
                    : null
            }

        </div>
    }
}

export default Todo;

编辑对话框.js

import React, {Component} from 'react';
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';

class EditDialog extends Component {
    constructor(props) {
        super(props);
        this.state = {
            editDetails: true,
            view: false,
            updatedValues: {
                id: null,
                name: null,
                age: null,
                email: null
            }
        }
    }

    onUpdateHandle(event) {
        event.preventDefault();
        this.setState({
            students: this.state.students.map(item => {
                if (item.id === this.state.id) {
                    item['id'] = event.target.updatedItem.value;
                    item['name'] = event.target.updatedItem1.value;
                    item['age'] = event.target.updatedItem2.value;
                    item['email'] = event.target.updatedItem3.value;
                }
                return item;
            })
        })
        this.setState({edit: false});
    }

    renderEditForm() {
        if (this.state.editDetails) {
            return <form onSubmit={this.onUpdateHandle.bind(this)}>
                <input type="text" name="updatedItem" className="item" defaultValue={this.state.id}/>
                <input type="text" name="updatedItem1" className="item" defaultValue={this.state.name}/>
                <input type="text" name="updatedItem2" className="item" defaultValue={this.state.age}/>
                <input type="text" name="updatedItem3" className="item" defaultValue={this.state.email}/>
                <button className="update-add-item">Update</button>
            </form>
        }
    }

    handleClose() {
        this.setState({view: !this.state.view})
    }

    handleUpdate(e) {
        e.preventDefault();
        this.props.closeModal();
        this.props.updateStudentHandler(this.state.updatedValues);
    }

    updateStateHandler = (e) => {
        let newUpdatedValues = {};
        switch (e.target.name) {
            case 'name':
                newUpdatedValues = {
                    ...this.state.updatedValues,
                    name: e.target.value
                };
                break;
            case 'age':
                newUpdatedValues = {
                    ...this.state.updatedValues,
                    age: e.target.value
                };
                break;
            case 'email':
                newUpdatedValues = {
                    ...this.state.updatedValues,
                    email: e.target.value
                };
                break;
            default:
                break;
        }

        this.setState({
            updatedValues: newUpdatedValues
        });
    };

    componentDidMount() {
        this.setState({
            updatedValues: {
                id: this.props.currentStudent[0].id,
                name: this.props.currentStudent[0].name,
                age: this.props.currentStudent[0].age,
                email: this.props.currentStudent[0].email
            }
        });
    }

    render() {
        return (
            <div>
                <Dialog open>
                    <DialogTitle>Edit The Details</DialogTitle>
                    <form>
                        <label>ID</label>
                        <input type="number" name="id" className="item"
                               value={this.state.updatedValues.id} />
                        <label>Name</label>
                        <input type="text" name="name" className="item"
                               onInput={this.updateStateHandler}
                               value={this.state.updatedValues.name} />
                        <label>age</label>
                        <input type="number" name="age" className="item"
                               onInput={this.updateStateHandler}
                               value={this.state.updatedValues.age} />
                        <label>email</label>
                        <input type="text" name="email" className="item"
                               onInput={this.updateStateHandler}
                               value={this.state.updatedValues.email} />
                        <button className="btn-add-item" onClick={this.handleUpdate.bind(this)}>Add</button>

                    </form>
                    <Button onClick={this.handleClose.bind(this)} color="primary">
                        Cancel
                    </Button></Dialog>
            </div>)
    }

}

export default EditDialog;