reactjs - 我是新反应,我想创建人员列表,您可以在其中为人员添加姓名和号码,但我被卡住了
问题描述
我想要的是,每当用户尝试添加新人(姓名,号码)时,程序将首先检查该名称是否存在,如果存在,它会提醒用户该名称已经存在以及是否要替换. 现在,如果用户不存在,程序正在运行,但如果用户存在,程序就会失败。经过这里和谷歌的所有搜索后,我真的不知道如何完成。谢谢你的帮助。
这是我的代码:
应用程序.js
import React, { useState, useEffect } from 'react';
import Person from './components/Person';
import personDetails from './services/person';
const App = (props) => {
const [search, setSearch] = useState('')
const { name, number } = props;
const [persons, setPersons] = useState([]);
const [input, setInput] = useState({
name: "",
number: ""
});
useEffect(() => {
personDetails
.allPersons()
.then(response => {
setPersons(response.data)
})
}, [])
const [ newName ] = useState('')
const addPerson = input => {
setPersons([...persons, { name: input.name, number: input.number }]);
setInput({ name: "", number: "" });
personDetails
.createPerson(input)
.then(response => {
setPersons(persons.concat(response.data))
})
};
const handleSubmit = e => {
e.preventDefault();
persons.forEach(function(s, p) {
if(s.name !== input.name) {
addPerson(input);
} else {
window.alert(`${s.name} is already in the phonebook, replace the old number with a new one?`)
personDetails
.editPerson(s.id)
.then(response => {
persons.filter(person => {
if(person.name !== "" && person.number !== "") {
return person
}
})
})
}
})
};
const handleChange = e => {
setInput({
...input,
[e.target.name]: e.target.value
});
};
const filteredPeople = persons.filter(person => {
return person.name.toLowerCase().includes(search.toLowerCase())
})
return (
<div>
<h2>Phonebook</h2>
<div style={{ display: 'flex' }}>
<div>filter shown with</div>
<input type="text" placeholder="Search..." onChange={e => setSearch(e.target.value)} />
</div>
<h2>add a new</h2>
<form onSubmit={handleSubmit}>
<div>
name:
<input
name="name"
type="text"
value={name}
onChange={handleChange}
/><br />
number:
<input
name="number"
type="text"
value={number}
onChange={handleChange}
/>
</div>
<div>
<button type="submit">add</button>
</div>
</form>
<h2>Numbers</h2>
<li>
{filteredPeople.map(person =>
<Person handleChange={handleChange}
handleSubmit={handleSubmit}
addPerson={addPerson}
input={props} key={person.number}
person={person}
/>
)}
</li><br />
</div>
)
}
export default App;
索引.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(<App />, document.getElementById("root"))
人.js
import axios from 'axios';
const baseUrl = 'http://localhost:3001/persons'
const allPersons = () => {
return axios.get(baseUrl)
}
const createPerson = input => {
return axios.post(baseUrl, input)
}
const deletePerson = (id, persons) => {
return axios.delete(`${baseUrl}/${0}`, persons)
}
const editPerson = (id, persons) => {
return axios.put(`${baseUrl}/${id}`, persons)
}
export default { allPersons, createPerson, deletePerson, editPerson }
db.json
{
"persons": [
{
"name": "Mary Poppendieck",
"number": "39-23-6423122",
"id": 4
},
{
"name": "Dan Abramov",
"number": "1234",
"id": 13
}
]
}
解决方案
我已经整理了一个我认为您正在尝试做的工作示例。我使用您提供的数据作为基础,用虚拟 Promises 替换了您的调用。为了使这项工作正常进行,必须进行许多更改。看一看,如果您有任何问题,请告诉我。axios
import React, { useState, useEffect } from "react";
import Person from "./components/Person";
import personDetails from "./services/person";
const App = ({ name, number }) => {
const [search, setSearch] = useState("");
const [persons, setPersons] = useState([]);
const [input, setInput] = useState({ name, number });
console.log("input", input);
useEffect(() => {
personDetails.allPersons().then((response) => setPersons(response.data));
}, []);
const addPerson = (input) => {
personDetails.createPerson(input).then((response) => {
setInput((prev) => ({ name: "", number: "" }));
setPersons((prev) => [...prev, response.data]);
});
};
const handleSubmit = (e) => {
e.preventDefault();
const existingPerson = persons.find((_) => _.name === input.name);
if (existingPerson) {
if (
window.confirm(
`${existingPerson.name} is already in the phonebook, replace the old number with a new one?`
)
) {
personDetails.editPerson(existingPerson.id, input).then((response) => {
setPersons((prev) => [
...prev.filter((_) => _.id !== response.id),
response
]);
});
}
} else {
addPerson(input);
}
};
const handleChange = (e) => {
setInput((prev) => ({
...input,
[e.target.name]: e.target.value
}));
};
const filteredPeople = persons.filter((person) => {
return person.name.toLowerCase().includes(search.toLowerCase());
});
return (
<div>
<h2>Phonebook</h2>
<div style={{ display: "flex" }}>
<div>filter shown with</div>
<input
type="text"
placeholder="Search..."
onChange={(e) => setSearch(e.target.value)}
/>
</div>
<h2>add a new</h2>
<form onSubmit={handleSubmit}>
<div>
name:
<input
name="name"
type="text"
value={input.name}
onChange={handleChange}
/>
<br />
number:
<input
name="number"
type="text"
value={input.number}
onChange={handleChange}
/>
</div>
<div>
<button type="submit">add</button>
</div>
</form>
<h2>Numbers</h2>
<li>
{filteredPeople.map((person) => (
<Person
handleChange={handleChange}
handleSubmit={handleSubmit}
addPerson={addPerson}
key={person.number}
person={person}
/>
))}
</li>
<br />
</div>
);
};
export default App;
推荐阅读
- typescript - 相当于 elvis “?:return” 运算符的打字稿
- c++ - RegGetValueA 格式/布局
- python - 带有 Python 问题的 Visual Studio 代码:第一行出现 EOF 错误;不在调试控制台中显示输出
- java - 代码没有打印任何东西,我找不到问题
- ios - 我可以访问由 CALayer.shouldRasterize = YES 创建的位图数据吗
- c - 如何从输入文件中打印字符的二进制文件?
- flutter - Flutter 的 provider 包是否支持有序监听器?
- angular - Slickgrid:在分组行标题处聚合
- javascript - 用户输入数据并存储在数组中,以空条目显示数据
- libgdx - 如何在一次击键中获得完整的动画循环?