App (map, key, render prop and so ).js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import React, {useState, useEffect} from 'react';
  2. import logo from './logo.svg';
  3. import './App.css';
  4. const LifeCycle = ({onDelete}) =>{
  5. const [counter, setCounter] = useState(0)
  6. useEffect(() => {
  7. let intervalID = setInterval(() => {
  8. setCounter(c => c +1)
  9. },1000)
  10. console.log(`${intervalID} start`)
  11. return () => (clearInterval(intervalID), console.log(`${intervalID} bye-bye`))
  12. },[])
  13. return (
  14. <div>{counter}</div>
  15. )
  16. }
  17. const LifeStyles = ({render:Render, defaultValue=""}) =>{
  18. const [state, setState] = useState({})
  19. console.log(state)
  20. return (
  21. <div>
  22. {Object.entries(state).map(([key,value]) => <div key={key}>
  23. <Render value={value} onChange={e => {
  24. let value = e;
  25. if (e && e.target && ('value' in e.target)){
  26. value = e.target.value
  27. }
  28. setState({...state, [key]: value})
  29. }} />
  30. <button onClick={() => {
  31. let {[key]:___, ...newState} = state
  32. setState(newState)
  33. }}>x</button>
  34. </div>)}
  35. <button onClick={() => setState({...state, [Math.random()]: defaultValue})}>+</button>
  36. </div>
  37. )
  38. }
  39. const App = () =>
  40. <div className="App">
  41. <LifeStyles render={LifeCycle}/>
  42. <LifeStyles render={"input"}/>
  43. <LifeStyles render={(props) => <input type='color' {...props} />}/>
  44. </div>
  45. export default App;