App.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import './App.css';
  2. import {useState, useEffect } from 'react';
  3. import React, {useCallback} from 'react'
  4. import {useDropzone} from 'react-dropzone'
  5. const Dots = ({count,active, onChange}) =>{
  6. let arrImg = [];
  7. for (let i = 0; i < count; i++) {
  8. arrImg.push(i)
  9. }
  10. return (
  11. <>
  12. <ul>
  13. {arrImg.map(( _, index) => <li key = {index} className = {`dotBase ${active === index? 'dotActive' : 'dotNotActive'}`} onClick = {() => onChange(index)}></li>)}
  14. </ul>
  15. </>
  16. )
  17. }
  18. const Gallery = ({images = ['https://kot-pes.com/wp-content/uploads/2018/12/post_5c249026dde11.jpg',
  19. 'https://bigpicture.ru/wp-content/uploads/2019/12/DmrVIH7W4AAU_90-800x533.jpg',
  20. 'https://lh3.googleusercontent.com/proxy/NBss1i5HXdYP-YI9ygt53JYbC1CZm1SDRk8o5DGZqp_Nr_LZ6Me47RRn8Rex4_goswBpwPGakuNWO7HIifvorG5Rwm3tSWFbXclY8ANMBMRwlQ18U-wpGbzn8OXfaQX15W7dNdp8']}) => {
  21. const [index, setIndex] = useState(0);
  22. function next () {
  23. if(index === (images.length - 1)) {
  24. setIndex(0);
  25. } else setIndex(index + 1);
  26. }
  27. function back () {
  28. if(index === 0) {
  29. setIndex(images.length - 1);
  30. } else setIndex(index - 1);
  31. }
  32. function change (id) {
  33. setIndex(id)
  34. }
  35. return (
  36. <>
  37. <img className = "carousel-item" src = {images[index]} alt="cat"></img>
  38. <Dots count = {images.length} active = {index} onChange = {change}/>
  39. <button onClick = {next}>Вперед</button>
  40. <button onClick= {back}>Назад</button>
  41. </>
  42. )
  43. }
  44. const countries ={
  45. "AF": "Afghanistan",
  46. "AX": "Åland Islands",
  47. "AL": "Albania",
  48. "DZ": "Algeria",
  49. "AS": "American Samoa",
  50. "AD": "AndorrA",
  51. "AO": "Angola",
  52. "AI": "Anguilla",
  53. "AQ": "Antarctica",
  54. }
  55. const MySelect = ({options=countries, value='AX', onChange }) => {
  56. const newCountry = Object.entries(options);
  57. return (
  58. <select value = {value} onChange = {(e) => onChange(e.target.value)} >
  59. {newCountry.map((item) => <option key = {item[0]} value = {item[0]} > {item[1]}</option>)}
  60. </select>
  61. )
  62. }
  63. const PhoneBookEntry = ({data:{name, phone}={name: '', phone: ''},
  64. onChange, //по изменению
  65. onMoveUp, //сдвинуть вверх
  66. onMoveDown,//сдвинуть вниз
  67. onDelete, //удалить этот
  68. onAddL}) => //добавить под ним еще один
  69. <>
  70. <input value={name} onChange={(e) => onChange({'name': e.target.value, phone })} />
  71. <input value={phone} onChange={(e) =>(onChange({name, 'phone': e.target.value}))} />
  72. <button onClick={onMoveUp}>^</button>
  73. <button onClick={onMoveDown}>v</button>
  74. <button onClick={onDelete}>x</button>
  75. <button onClick={onAddL}>+</button>
  76. </>
  77. const defaultPeople = [{name: 'John', phone: '102'},
  78. {name: 'Paul', phone: '103'}]
  79. const PhoneBook = ({people=defaultPeople,
  80. onSave}) => {
  81. const [ppl, setPpl] = useState(people)
  82. const [keys, setKeys] = useState(people.map(() => Math.random()))
  83. // const keys = useRef(people.map(() => Math.random()))
  84. //должно меняться соответственно элементам списка - сдвигаться удаляться и тп
  85. useEffect(() => {
  86. setPpl(people);
  87. setKeys(people.map(() => Math.random()));//тут и keys обновить
  88. },[people])
  89. //обеспечить для PhoneBookEntry:
  90. // onChange, onMoveUp, onMoveDown, onDelete
  91. const onChange = (newData, i) => { //{name: 'НАМЕ', phone: 'НУМБЕР'}
  92. const newPeople = [...ppl];//создаем новый массив ppl на базе старого, заменяем один элемент и делаем setPpl
  93. newPeople[i] = newData; //ничего НЕ ДЕЛАЕМ с keys
  94. setPpl(newPeople);
  95. }
  96. const onDelete = (i) => { //фильтрует ppl и keys удаляя i-ый элемент
  97. const newPeople = ppl.filter((_, index) => index!==i);
  98. setPpl(newPeople);
  99. const newKeys = keys.filter((_, index) => index!==i);
  100. setKeys(newKeys);
  101. }
  102. const onMoveUp = (data, i) => {
  103. const newPeople = [...ppl];
  104. newPeople.splice(i, 1);
  105. newPeople.splice((i-1), 0, data);
  106. setPpl(newPeople);
  107. const newKeys = [...keys];
  108. newKeys.splice(i, 1);
  109. newKeys.splice(i-1, 0, keys[i]);
  110. setKeys(newKeys);
  111. }
  112. const onMoveDown = (data, i) => {
  113. const newPeople = [...ppl];
  114. newPeople.splice(i, 1);
  115. newPeople.splice((i+1), 0, data);
  116. setPpl(newPeople);
  117. const newkeys = [...keys];
  118. newkeys.splice(i, 1);
  119. newkeys.splice(i+1, 0, keys[i]);
  120. }
  121. const onAddFirst = () => {
  122. const newPeople = [...ppl];
  123. newPeople.unshift({'name': '', 'phone': ''});
  124. setPpl(newPeople);
  125. const newKeys =[...keys];
  126. newKeys.unshift(Math.random());
  127. setKeys(newKeys);
  128. }
  129. const onAddL = () => {
  130. const newPeople = [...ppl];
  131. newPeople.push({'name': '', 'phone': ''});
  132. setPpl(newPeople);
  133. const newKeys =[...keys];
  134. newKeys.push(Math.random());
  135. setKeys(newKeys);
  136. }
  137. console.log(keys, ppl)
  138. return (
  139. <>
  140. <button onClick={onAddFirst}>+</button>
  141. <div className='PhoneBook'>
  142. {ppl.map((data, i) =><div key={keys[i]} > <PhoneBookEntry data={data} //не забудьте keys
  143. onChange={data => onChange(data, i)}
  144. onDelete={() => onDelete(i)}
  145. onMoveDown={() => onMoveDown(data, i)}
  146. onMoveUp={() => onMoveUp(data, i)}
  147. onAddL={onAddL}
  148. />
  149. </div> )}
  150. </div>
  151. <button onClick={() => onSave(ppl)}>Save</button>
  152. </>
  153. )
  154. }
  155. function App() {
  156. const [country, setCountry] = useState('AX')
  157. return (
  158. < >
  159. <div className="App">
  160. {console.log(country)}
  161. <MySelect value={country} onChange = {(w) => setCountry(w)} />
  162. <Gallery/>
  163. </div>
  164. <div>
  165. <PhoneBook/>
  166. </div>
  167. <div>
  168. </div>
  169. </>
  170. );
  171. }
  172. export default App;