mirror of
https://github.com/10h30/fullstackopen.git
synced 2026-07-16 13:13:10 +09:00
Completed 2.10 (phonebook step 5)
This commit is contained in:
+11
-19
@@ -1,4 +1,7 @@
|
|||||||
import React, { useState } from 'react'
|
import React, { useState } from 'react'
|
||||||
|
import Filter from './components/Filter'
|
||||||
|
import PersonForm from './components/PersonForm'
|
||||||
|
import Person from './components/Person'
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
const [ persons, setPersons ] = useState([
|
const [ persons, setPersons ] = useState([
|
||||||
@@ -26,7 +29,6 @@ const App = () => {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const submitChange = (event) => {
|
const submitChange = (event) => {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
const newPerson = {
|
const newPerson = {
|
||||||
@@ -41,32 +43,22 @@ const App = () => {
|
|||||||
|
|
||||||
setNewNumber('')
|
setNewNumber('')
|
||||||
setNewName('')
|
setNewName('')
|
||||||
|
setNewSearch('')
|
||||||
}
|
}
|
||||||
|
|
||||||
const search = persons.filter(person => person.name.includes(newSearch))
|
const search = persons.filter(person => person.name.toLowerCase().includes(newSearch.toLowerCase()))
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h2>Phonebook</h2>
|
<h2>Phonebook</h2>
|
||||||
<div>Serach <input value={newSearch} onChange={handleSearchChange}/>
|
<Filter value={newSearch} onChange={handleSearchChange} />
|
||||||
</div>
|
|
||||||
<h2>Add new contact</h2>
|
<h2>Add new contact</h2>
|
||||||
<form onSubmit={submitChange}>
|
<PersonForm onSubmit={submitChange} name={newName} number={newNumber} handleNumberChange={handleNumberChange} handleNameChange={handleNameChange}/>
|
||||||
<div>
|
|
||||||
name: <input value={newName} onChange={handleNameChange}/>
|
|
||||||
</div>
|
|
||||||
<div>number: <input type="tel" value={newNumber} onChange={handleNumberChange}/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<button type="submit">add</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<h2>Numbers</h2>
|
<h2>Numbers</h2>
|
||||||
<ul>
|
<Person data={search} />
|
||||||
{search.map(person => <li key={person.name}>{person.name}: {person.number}</li>)}
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
const Filter = ({value, onChange}) => {
|
||||||
|
return (
|
||||||
|
<div>Search <input value={value} onChange={onChange}/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Filter
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
const Person = ({data}) => {
|
||||||
|
return (
|
||||||
|
<ul>
|
||||||
|
{data.map(person => <li key={person.name}>{person.name}: {person.number}</li>)}
|
||||||
|
</ul>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Person
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
const PersonForm = ({onSubmit, name, number, handleNumberChange, handleNameChange }) => {
|
||||||
|
return (
|
||||||
|
<form onSubmit={onSubmit}>
|
||||||
|
<div>
|
||||||
|
name: <input value={name} onChange={handleNameChange}/>
|
||||||
|
</div>
|
||||||
|
<div>number: <input type="tel" value={number} onChange={handleNumberChange}/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="submit">add</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PersonForm
|
||||||
Reference in New Issue
Block a user