Reactのテーブルごとに簡単な名前とメーリングリストを作成しています。サーバーからデータを取得したいのですが、次に人を動的に追加または削除できます。これがReactの最初のステップなので、問題があります。
import React, { Component } from 'react';
import Form from "./Form";
class App extends Component {
constructor(props) {
super(props);
this.state = {
people: [],
};
this.addPerson = this.addPerson.bind(this);
}
addPerson(name, email) {
this.state.people.push({name: name, email: email});
}
componentDidMount() {
this.getPeople();
}
getPeople() {
fetch('https://jsonplaceholder.typicode.com/users')
.then(response => response.json())
.then(response => this.setState({people: response}))
.catch(error => console.log(error));
}
render() {
return (
<div className='App'>
<Form/>
<table>
<thead>
<tr>
<th>LP</th>
<th>USER</th>
<th>EMAIL</th>
</tr>
</thead>
<tbody>
{this.state.people.map((person, index) => {
return (
<tr key={person.email}>
<th>{index + 1}</th>
<td>{person.name}</td>
<td>{person.email}</td>
</tr>
)
})}
</tbody>
</table>
</div>
)
}
}
export default App;
およびフォームコンポーネント:
import React, { Component } from 'react';
class Form extends Component {
constructor() {
super();
this.state = {
name: this.props.name,
email: this.props.email
};
this.handleChange = this.handleChange.bind(this);
this.addPerson = this.addPerson.bind(this);
/* this.formSubmit = this.formSubmit.bind(this); */
}
handleChange(e) {
this.setState({[e.target.id]: e.target.value})
}
addPerson(name, email) {
this.props.addPerson(name, email);
this.setState({name: '', email: ''});
}
render() {
return (
<form>
<input id='name' type='text' name={this.state.name} placeholder='Name...'/>
<input id='email' type='text' email={this.state.email} placeholder='Email...'/>
<input onClick={() => this.addPerson(this.state.name, this.state.email)} type='submit' value='submit'/>
</form>
)
}
}
export default Form;
そして今、フォーム送信のためにテーブルにデータを追加したい、または必要に応じてテーブルのデータを削除したい。私はこの瞬間に立ち往生しました...
私はあなたのコードを次のように書き直します。
Form
コンポーネントを制御されていないコンポーネントとして作成します。つまり、フォーム入力は、変更しても独自の内部状態を維持します。2つの異なるデータソースを維持する必要はありません。したがって、親コンポーネントのApp
状態に依存します。また、送信時に入力値を取得するフォーム送信ハンドラーを追加し、addPerson
からメソッドを呼び出して、ルートコンポーネントによって維持されApp
ているpeople
状態に名前を追加しますApp
。
deletePerson
リストから人を削除するメソッドを追加しました。これが2つのコンポーネントのようです。
deletePerson
ここでの方法は、人のリストに一意の電子メールを持つ人が含まれるという事実に依存しています。あなたもkey
小道具としてそれを選ぶように。ただし、この基準はいつでも変更できます。これは、コードの現在のフローを理解していれば簡単です。
import React, { Component } from "react";
import Form from "./Form";
class App extends Component {
constructor(props) {
super(props);
this.state = {
people: []
};
this.addPerson = this.addPerson.bind(this);
this.deletePerson = this.deletePerson.bind(this);
}
addPerson(name, email) {
this.setState(prevState => ({
people: [...prevState.people, { name, email }]
}));
}
componentDidMount() {
this.getPeople();
}
getPeople() {
fetch("https://jsonplaceholder.typicode.com/users")
.then(response => response.json())
.then(response => this.setState({ people: response }))
.catch(error => console.log(error));
}
deletePerson(email) {
return () => {
this.setState(prevState => ({
people: prevState.people.filter(person => person.email !== email)
}));
};
}
render() {
console.log(this.state);
return (
<div className="App">
<Form addPerson={this.addPerson} />
<table>
<thead>
<tr>
<th>LP</th>
<th>USER</th>
<th>EMAIL</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{this.state.people.map((person, index) => {
return (
<tr key={person.email}>
<th>{index + 1}</th>
<td>{person.name}</td>
<td>{person.email}</td>
<td>
<button onClick={this.deletePerson(person.email)}>
Delete
</button>
</td>
</tr>
);
})}
</tbody>
</table>
</div>
);
}
}
import React, { Component } from "react";
class Form extends Component {
constructor() {
super();
this.formSubmit = this.formSubmit.bind(this);
}
formSubmit(event) {
event.preventDefault();
const form = event.target;
const email = form.elements["email"].value;
const name = form.elements["name"].value;
this.props.addPerson(name, email);
form.reset();
}
render() {
return (
<form onSubmit={this.formSubmit}>
<input
id="name"
type="text"
defaultValue=""
placeholder="Name..."
/>
<input
id="email"
type="text"
defaultValue=""
placeholder="Email..."
/>
<input type="submit" value="submit" />
</form>
);
}
}
export default Form;
Codesandboxデモを確認してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加