Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/10: Рейтинг темы: голосов - 10, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 16.11.2018
Сообщений: 4

В компоненте react не обновляются input

18.01.2019, 12:46. Показов 2180. Ответов 5

Студворк — интернет-сервис помощи студентам

Реализую CRUD приложение. Добавление и удаление реализовал. Возник вопрос с обновлением. Для этого:
1) При нажатии кнопки "Редакт" передаю в компанент `App` `item.id` элемента, который предстоит отредактировать и загрузить снова.
2) Нахожу, фильтрую и пишу в стейт

JavaScript
1
2
3
4
      readItem = (id) => {
        const readItem = this.state.auto.filter((el) => el.id === id)
        this.setState({readItem})
      }
3) Передаю значения в дочерний компонент

JavaScript
1
<Header readItem={this.state.readItem}/>
4) В дочернем элементе меняю стейт, он приходит и в dev tools видно что менятся, но значения в инпутах не отображается

JavaScript
1
2
3
4
5
6
7
8
9
10
11
      constructor(props) {
        super(props);
        this.state = {
          id: this.props.readItem.id,
          name: this.props.readItem.name,
          marka: this.props.readItem.marka,
          country: this.props.readItem.country,
          price: this.props.readItem.price,
          url: this.props.readItem.url
        }
      }
инпут

JavaScript
1
2
3
4
5
<input
          name="name"
          value={name}
          onChange={this.inputName}
          placeholder="Название" />
Ниже представленные компаненты:
App

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 import React, { Component } from 'react';
    import './App.css';
    import Header from './component/Header/Header'
    import ListAuto from './component/ListAuto/ListAuto'
    import EditItems from './component/Edit/EditItems'
    
    class App extends Component {
      state = {
        auto: [
          {
            "id": 1,
            "name": "Авто №1",
            "marka": "Марка машины №1",
            "price": 50,
            "country": "Russia",
            "url": "https://finance.liga.net/images/general/2018/08/29/thumbnail-tw-20180829113845-1826.jpg"
          },
          {
            "id": 2,
            "name": "Авто №2",
            "marka": "Марка машины №2",
            "price": 20,
            "country": "Russia",
            "url": "https://icdn.lenta.ru/images/2017/08/23/14/20170823145604779/pic_b21fd6a6551e45ce4a397c3c2662ec8f.jpg"
          },
        ],
        readItem: [{
          "id": null,
          "name": null,
          "marka": null,
          "price": null,
          "country": null,
          "url": null
        }]
      }
    
      addItem = (item) => {
        const addAuto = {
          id: this.state.auto.length + 1,
          name: item.name,
          marka: item.marka,
          price: item.price,
          country: item.country,
          url: item.url
        }
        this.setState(({ auto }) => {
          const NewArray = [
            ...auto,
            addAuto
          ]
          return {
            auto: NewArray
          }
    
    
        })
      }
      delItem = (id) => {
        const NewArr = this.state.auto.filter((el) => el.id !== id)
        this.setState({
          auto: NewArr
        })
      }
      readItem = (id) => {
        const readItem = this.state.auto.filter((el) => el.id === id)
        this.setState({readItem})
      }
    
      render() {
        const { auto } = this.state;
        return (
          <div className="App">
            <Header addItem={this.addItem}
                    readItem={this.state.readItem}/>
            <EditItems ArrayAutoForRead={auto}
              delItemId={this.delItem}
              readItemId={this.readItem} />
            <ListAuto ArrayAuto={auto} />
          </div>
        );
      }
    }
    
    export default App;
Header

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import React, { Component } from 'react';
    
    class Header extends Component {
      constructor(props) {
        super(props);
        this.state = {
          id: this.props.readItem.id,
          name: this.props.readItem.name,
          marka: this.props.readItem.marka,
          country: this.props.readItem.country,
          price: this.props.readItem.price,
          url: this.props.readItem.url
        }
      }
    
      addItem = () => {
        const { name, marka, country, price, url } = this.state;
        if (name !== "" && marka !== "" && country !== "" && price !== "" && url !== "") {
          const item = {
            name,
            marka,
            country,
            price,
            url
          }
          this.props.addItem(item)
          this.setState({ name: "", marka: "", country: "", price: "", url: "" })
        } else {
          alert('Заполните все поля')
        }
      }
      inputName = (e) => {
        const name = e.target.value;
        this.setState({ name })
      }
      inputMarka = (e) => {
        const marka = e.target.value;
        this.setState({ marka })
      }
      inputCountry = (e) => {
        const country = e.target.value;
        this.setState({ country })
      }
      inputPrice = (e) => {
        const price = e.target.value;
        this.setState({ price })
      }
      inputUrl = (e) => {
        const url = e.target.value;
        this.setState({ url })
      }
      render() {
        const { name, marka, country, price, url } = this.state;
        return (
          <div className="Header">
            Header menu
                  <input
              name="name"
              value={name}
              onChange={this.inputName}
              placeholder="Название" />
            <input
              name="marka"
              value={marka}
              onChange={this.inputMarka}
              placeholder="Марка" />
            <input
              name="country"
              value={country}
              onChange={this.inputCountry}
              placeholder="Производитель" />
            <input
              name="price"
              value={price}
              onChange={this.inputPrice}
              placeholder="Цена" />
            <input
              name="url"
              value={url}
              onChange={this.inputUrl}
              placeholder="url картинки" />
    
            <button onClick={this.addItem}>Добавить</button>
    
          </div>
        );
      }
    }
    
    export default Header;
EditItems

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 import React, { Component } from 'react';
    import './style.css'
    
    class EditItems extends Component {
        delItem = (id) => {
            this.props.delItemId(id)
        }
        readItem = (id) => {
            this.props.readItemId(id)
        }
      render() {
          const {ArrayAutoForRead} = this.props
        return (
          <div className="EditItems">
                Редактирование данных
                <table >
                    <thead>
                    <tr>
                        <th>Id</th>
                        <th>Название</th>
                        <th>Марка</th>
                        <th>Производитель</th>
                        <th className="th">url фото</th>
                        <th>Цена</th>
                        <th>Действие</th>
                    </tr>
                    </thead>
                    <tbody>
                        {
                            ArrayAutoForRead.map( (item,index) => {
                                return (
                                <tr rey={index}>
                                    <th>{item.id}</th>
                                    <th>{item.name}</th>
                                    <th>{item.marka}</th>
                                    <th>{item.country}</th>
                                    <th className="th">{item.url}</th>
                                    <th>{item.price}</th>
                                    <th><button onClick={() => this.readItem(item.id)}>Редакт</button><button onClick={() => this.delItem(item.id)}>X</button></th>
                                </tr>
    
                                )
                            })
                        }
    
    
                    </tbody>
                </table>
    
          </div>
        );
      }
    }
    
    export default EditItems;
ListAuto

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import React, { Component } from 'react';
    import ItemAuto from '../ItemAuto/ItemAuto'
    
    
    class ListAuto extends Component {
        render() {
    
            return (
                <>
                    {
                        this.props.ArrayAuto.map((item, index) => {
                            return (
                                <div className="ListAuto">
                                    <ItemAuto key={index} itemAuto={item} />
                                </div>
                            )
                        })
                    }
                </>
            );
        }
    }
    
    export default ListAuto;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2019, 12:46
Ответы с готовыми решениями:

Посоветуйте пожалуйста! Как мне в компоненте ComboBox2 Организовать смену шрифтов в компоненте Memo1?
Всем заранее спасибо!!!!!!! void __fastcall TForm1::ComboBox2Change(TObject *Sender) { }

"React/React-Native Developer"
MaxyLogic is the small team of dedicated software engineers that was founded with the idea to provide the best-matching quality software...

Одинаковая ширина для полей input text & input password
Никак не получается выровнять ширину двух тектовых полей: input type='text' и input type='password' Помогите, пожалуйста.

5
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
18.01.2019, 12:57
надо в Header добавить
https://reactjs.org/docs/react... nentupdate

потому что, ты перекладываешь props в state в конструкторе, и при последующем обновлении state в App, конструктор в Header не вызывается... вообще лучше прочитай про https://reactjs.org/docs/context.html или используй https://github.com/mobxjs/mobx-react или https://github.com/reduxjs/react-redux или ... )
0
0 / 0 / 0
Регистрация: 16.11.2018
Сообщений: 4
18.01.2019, 14:09  [ТС]
Что должно быть в shouldcomponentupdate, какие параметры? mob-x и redax не изучил, пробую пока без них
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
18.01.2019, 14:42
App.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React, { Component } from 'react';
import Should from './Should'
 
class App extends Component {
  state = {
    app: 'one'
  }
 
  render() {
    return <div>
      <div>App state: {this.state.app}</div>
      <Should app={this.state.app} />
      <button onClick={() => this.setState({ app: parseInt(Math.random() * 10) })}>random</button>
    </div>
  }
}
 
export default App;
Should.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import React from 'react'
 
export default class Should extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      app: this.props.app
    }
  }
 
  // // без этого не будет обновляться state если изменились props
  // // надо помнить если передается объект, и этот объект изменился,
  // // то ссылка всеравно остается на этот же объект, и тогда проверка должна быть 
  // // deepEquals || shallowCompare...
  // static getDerivedStateFromProps(nextProps, prevState) {
  //   if (nextProps.app !== prevState.app) {
  //     return {
  //       app: nextProps.app
  //     }
  //   } else return null
  // }
 
  // // или
  // componentWillReceiveProps(nextProps) {
  //   if (this.props.app !== nextProps.app) {
  //     this.setState({ app: nextProps.app })
  //   }
  // }
 
  render() {
    return <div>Should: {this.state.app} </div>
  }
}
сорри shouldComponentUpdate не для этой задачи %)))
зато есть два метода для этой задачи, я закомментировал два метода...

т.е. в App создадим некий state.app и при клике на кнопку будем его обновлять, также этот state передадим в качестве props в Should компонент, и этот props положим в state в Should компонента... и видим, что если блок закомментирован, то обновление компонента Should не будет происходить...

https://reactjs.org/blog/2018/... state.html
0
0 / 0 / 0
Регистрация: 16.11.2018
Сообщений: 4
18.01.2019, 16:28  [ТС]
Дописал
JavaScript
1
2
3
4
5
  componentWillReceiveProps(nextProps) {
      if (this.props.readItem !== nextProps.readItem) {
        this.setState({ state: nextProps.readItem })
      }
    }
Данные в стейт приходят, но в инпутах не отображаются.
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
18.01.2019, 16:48
ты же в Header в constructor так делаешь:

JavaScript
1
2
3
4
5
6
7
8
this.state = {
          id: this.props.readItem.id,
          name: this.props.readItem.name,
          marka: this.props.readItem.marka,
          country: this.props.readItem.country,
          price: this.props.readItem.price,
          url: this.props.readItem.url
        }
а в componentWillReceiveProps ты устанавливаешь this.setState({ state: nextProps.readItem}) и после этого у тебя в state у Header компонента должен создаться еще один ключ state в котором и будет объект nextProps.readItem... в общем у тебя проблема в этой строке this.setState({ state: nextProps.readItem}) и по идее она должна быть в виде this.setState({...nextProps.readItem}), нет? да! )

Добавлено через 32 секунды
выводи в консоль state и смотри что там...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2019, 16:48
Помогаю со студенческими работами здесь

Одинаковая ширина для полей input text & input password
Никак не получается выровнять ширину двух тектовых полей: input type='text' и input type='password' Помогите, пожалуйста.

Как реализовать на месте input button просто input?
Приветствую всех. Есть кнопка. Помогите реализовать логику. По нажатию на кнопку , появляется текст , а под ним input. Спасибо...

Получить названия файлов из input file в input text
Как переместить названия файла из input type file в input type text с помощью javascript?

Как вставить в input с маской от jQuery Masked Input
Здравствуйте. Создал такую маску для ввода карты $('#card').mask(&quot;9999 9999 9999 9999&quot;); Есть ли какие либо...

Погрешность измерений в режиме input capture/pwm input
Делаю квалификационную работу, где нужно измерять параметры шим-сигнала для квадрокоптера, длительность импульса 1-2 мс, период 10 мс....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru