Каждый раз, когда я удаляю человека, я получаю сообщение об ошибке. P.name.toLowerCase не является функцией. Но не только это. Также, когда axios пытается удалить его, он также создает пустое имя с номером, оставленным в поле ввода. После того, как я удаляю это, я также получаю пустой массив в файле db.json.
https://prnt.sc/ptrfh6 - поэтому после того, как я создаю нового пользователя и удаляю его, он автоматически создает пустого пользователя с прежним номером. И после того, как я удаляю это число, он создает пустой файл с этим идентификатором в db.json. После того, как я пытаюсь удалить этот файл empry с помощью кнопки удаления, я получаю это - https://prnt.sc/ptrghn
Необработанный отказ (TypeError): p.name.toLocaleLowerCase не является функцией
App.js
import React, {useState, useEffect, useCallback, useRef} from 'react'
import './App.css';
import Person from './components/Person'
import Filter from './components/Filter'
import personService from './services/persons'
const App = () => {
const [persons, setPersons] = useState([])
const [newName, setNewName] = useState([])
const [newNumber, setNewNumber] = useState([])
const [filter, setNewFilter] = useState([])
// delete person by his ID using axios
const deletePersonId = (id) => {
const person = persons.find(p => p.id === id)
personService
.delPerson(id)
.then(response => {
setPersons(persons.filter(p => p.id !== id))
console.log(person)
})
.catch(error => {
if (error.response) {
console.log(error.response.data)
}
})
}
// effect hook for getting json data
useEffect(() => {
personService
.getAll()
.then(response => {
setPersons(response.data)
})
}, [])
// adding new names using json data with axios
const addName = (e) => {
e.preventDefault()
const nameObject = {
name: newName,
number: newNumber,
id: persons.length + 1
}
personService
.create(nameObject)
.then(response => {
setPersons(persons.concat(response.data))
setNewName('')
})
}
// maping persons and getting a list of persons
const rows = () => persons.map(person =>
<Person
key={person.id}
person={person}
number={person.number}
onSubmit={addName}
deletePerson={() => window.confirm(`are you sure u want to delete '${person.name}'`, deletePersonId(person.id))}
/>
)
// add button event
const handleAdd = (event) => {
setNewName(event.target.value)
}
// add number event
const addNumber = (event) => {
setNewNumber(event.target.value)
}
// filter persons with input element
let filteredPersons = persons;
if (filter) {
filteredPersons = persons.filter(
p => p.name.toLocaleLowerCase().indexOf(filter.concat('')) !== -1
);
}
return (
<div>
<h2>Phonebook</h2>
<Filter onChange={setNewFilter} value={filter} />
<form onSubmit={addName}>
<div>
name: <input onChange={handleAdd} value={newName}/>
</div>
<div>
number: <input onChange={addNumber} value={newNumber}/>
</div>
<div>{rows()}</div>
<div>
<button type="submit">Add</button>
</div>
</form>
<h2>Numbers</h2>
{ <div>{filteredPersons.map(person => <div key={person.id}>
{person.id}.
{person.name} /
{person.number}
</div>)}
</div> }
<p></p>
</div>
);
}
export default App;
db.json
{
"persons": [
{
"name": "Veljko Kukic",
"number": "31-42-6614672",
"id": 1
},
{
"name": "Teodora Jovanovic",
"number": "34-65-14441",
"id": 2
},
{
"name": "Milica Aleksic",
"number": "94-65-419949",
"id": 3
},
{
"name": [],
"number": [],
"id": 5
}
]
}
services / person.js
import axios from 'axios'
const baseUrl = 'http://localhost:3001/persons'
const getAll = () => {
return axios.get(baseUrl)
}
const create = newPerson => {
return axios.post(baseUrl, newPerson)
}
const update = (id, newPerson) => {
return axios.put(`${baseUrl}/${id}`, newPerson)
}
const delPerson = id => {
return axios.delete(`${baseUrl}/${id}`)
}
export default {getAll, create, update, delPerson}
Персональный компонент
import React from 'react';
const Person = ({person, id, number, deletePerson }) => {
return (
<div key={person.id}>
{person.id} {person.name} {person.number}
<button onClick={deletePerson}>Delete</button>
</div>
)
}
export default Person
Я не включил ФильтрКомпонент его просто. Но если вы хотите проверить весь код и клонировать его, чтобы проверить проблему на git, уже.
https://github.com/Ljove87/phonebook
Спасибо вперед
РЕДАКТИРОВАТЬ: JSON сервер работает напорт 3001 и вы можете запустить его через запустив сервер npm run
EDIT: Filter.js
import React from "react";
const Filter = ({ value, onChange }) => {
const handleFilterChange = event => {
onChange(event.target.value);
};
return (
<div>
filter shown with: <input value={value} onChange={handleFilterChange} />
</div>
);
};
export default Filter;