Обновление данных в состоянии с помощью формы реагирования - PullRequest
0 голосов
/ 29 марта 2020

Как я могу обновить данные, полученные в форму, в ответ? После нажатия на (индексную) ссылку я go перехожу на новое представление с формой. React извлекает данные из состояния, но я не могу редактировать данные в форме.

Список. js

import React, { Component } from "react";
import { Switch, Route, BrowserRouter as Router, Link } from "react-router-dom";

import SingleUser from "./SingleUser";

class List extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: [],
      login: "",
      pass: ""
    };

    this.add = this.add.bind(this);
    this.show = this.show.bind(this);
    this.del = this.del.bind(this);
  }

  add(e) {
    e.preventDefault();
    this.setState({
      [e.target.name]: e.target.value
    });
  }

  show(e) {
    e.preventDefault();

    if (!this.state.login.length || !this.state.pass.length) {
      return;
    } else {
      const newUser = {
        login: this.state.login,
        pass: this.state.pass
      };

      this.setState(state => ({
        data: state.data.concat(newUser)
      }));
    }
  }

  del(index) {
    let { data } = this.state;
    data.splice(index, 1);
    this.setState({
      data
    });
  }

  render() {
    return (
      <div>
        <form onSubmit={this.show}>
          <label>Login</label>
          <br />
          <input type="text" name="login" onChange={e => this.add(e)} />
          <br />
          <label>Password</label>
          <br />
          <input type="text" name="pass" onChange={e => this.add(e)} />
          <br />
          <input type="submit" value="Add" />
        </form>{" "}
        <table>
          <Router>
            <div>
              <Switch>
                <Route exact path="/">
                  {this.state.data.map((val, index) => (
                    <>
                      <td>{val.login}</td>

                      <td>{val.pass}</td>

                      <br />

                      <div>
                        <div>
                          <Link to={`/${index}`}>{index}</Link>
                        </div>
                      </div>

                      <input
                        type="submit"
                        value="X"
                        onClick={() => this.del(index)}
                      />
                    </>
                  ))}
                </Route>
                <Route exact path="/:userID">
                  <SingleUser sData={this.state.data} />
                </Route>
              </Switch>
            </div>
          </Router>
        </table>
      </div>
    );
  }
}

export default List;

SingleUser. js

import React, { useState } from "react";
import { useParams, Link } from "react-router-dom";

function SingleUser(props) {
  let { userID } = useParams();

  const [temp, setCount] = useState("");

  return (
    <p>
      <>
        <div>{userID}</div>
        Password: <input type="text" value={props.sData[userID].pass} />
        <br />
        Login: <input type="text" value={props.sData[userID].login} />
        <br />
      </>
      <button onClick={() => setCount((props.sData[userID].pass = "password"))}>
        Change
      </button>
      <br />
      <Link to="/">Return</Link>
    </p>
  );
}

export default SingleUser;

Нужно ли здесь использовать реактивный крюк?

Ссылка на проект: https://codesandbox.io/s/crud-wtl9k

...