Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.01.2019, 17:36
Интересующийся
Отправить личное сообщение для dmitry.suhotsky Посмотреть профиль Найти все сообщения от dmitry.suhotsky
 
Регистрация: 16.11.2018
Сообщений: 10

обновление компонента

Реализую CRUD. Требуется отобразить в полях выбранное значение, изменит и сохранить обратно.

Передаю измененное значение в компонент, и если значение предыдущих props отлично от значения текущего стейт, запускаю функцию update


componentDidUpdate(prevProps) {
        if (this.props.selectItem !== prevProps.selectItem) {
            this.update();
        }
    }
    update = () => {
        this.setState({ selectItem: this.props.selectItem  })
        console.log(this.state.selectItem)
    }

Выводу текущий стейт в лог - новый state отображается, но в инпутах значения не изменяются. В предыдущем показали реализацию CreateElementa, вопрос, это единственный метод для реализации? и почему при измененном стейте значения не изменились?

import React, { Component } from 'react';
import './App.css';
import Table from './component/Table'
import ReadItem from './component/read/ReadItem'
import { Provider } from './component/service-contex/service-contex'

class App extends Component {

  state = {
    mobile : [
      {"id": 1, "name": "Dima", "phone": 12345},
      {"id": 2, "name": "Ira", "phone": 67890},
    ],
    selectItem: 
      {"name": null,
    "phone": null}
    
  }
  deleteItem = (id) => {
    console.log(id);
    const newMobile = this.state.mobile.filter((el) => el.id !== id )
    this.setState({
      mobile: newMobile
    })
  }
  updateItem = (id) => {
    console.log(id);
    const selectItem = this.state.mobile.filter((el) => el.id === id )
    this.setState({
      selectItem: selectItem
    })
  }
  render() {
    return (
      <Provider value={this.state}>
        <Table deleteItem={this.deleteItem}
               updateItem={this.updateItem}/>
        <ReadItem  selectItem={this.state.selectItem}/>
      </Provider>
    );
  }
}

export default App;


import React, { Component } from 'react';
import { Consumer } from './service-contex/service-contex'
class Table extends Component {
    delItem = (id) => {
        this.props.deleteItem(id);
    }
    update = (id) => {
        this.props.updateItem(id);
    }

    render() {
        return (
            <table>
                <Consumer>
                    {contex => {
                        return (
                            contex.mobile.map((item, index) => {
                                return (
                                    <tr key={index}>
                                        <th>{item.id}</th>
                                        <th>{item.name}</th>
                                        <th>{item.phone}</th>
                                        <th><button  onClick={() => this.update(item.id)}>P</button><button onClick={() => this.delItem(item.id)}>X</button></th>
                                    </tr>)
                            })
                        )
                    }
                    }
                </Consumer>

            </table>
        );
    }
}

export default Table;


import React, { Component } from 'react';

class ReadItem extends Component {
    constructor(props) {
        super(props);

    this.state = {
        selectItem: 
        {"name": null,
        "phone": null}
    }
    }
    componentDidUpdate(prevProps) {
        if (this.props.selectItem !== prevProps.selectItem) {
            this.update();
        }
    }
    update = () => {
        this.setState({ selectItem: this.props.selectItem  })
        console.log(this.state.selectItem)
    }
    render() {
        return (
            <>
                <div> Name 
                    <input defaultValue={this.state.name}></input>
                </div>
                <div> Phone
                    <input defaultValue={this.state.phone}></input>
                </div>
                <div>
                    <button>Save</button>
                    <button>Cancel</button>
                </div>
            </>
        )
    }
}

export default ReadItem;
Ответить с цитированием
  #2 (permalink)  
Старый 20.01.2019, 19:10
Интересующийся
Отправить личное сообщение для dmitry.suhotsky Посмотреть профиль Найти все сообщения от dmitry.suhotsky
 
Регистрация: 16.11.2018
Сообщений: 10

Пытаюсь через
<div> Name 
                    <input ref="name" ></input>
                </div>
                <div> Phone
                    <input ref="phone" ></input>
                </div>

update = () => {
        this.setState({ selectItem: this.props.selectItem  })
        this.refs.name.value =this.props.selectItem.name
        this.refs.phone.value = this.props.selectItem.phone
       
    }

но тщетно
Ответить с цитированием
  #3 (permalink)  
Старый 20.01.2019, 19:27
Интересующийся
Отправить личное сообщение для dmitry.suhotsky Посмотреть профиль Найти все сообщения от dmitry.suhotsky
 
Регистрация: 16.11.2018
Сообщений: 10

Input стал отображать верные данные выбранных послей, после

this.refs.name.value = this.props.selectItem[0].name
        this.refs.phone.value = this.props.selectItem[0].phone

Объясните почему
Ответить с цитированием
  #4 (permalink)  
Старый 20.01.2019, 22:20
Интересующийся
Отправить личное сообщение для dmitry.suhotsky Посмотреть профиль Найти все сообщения от dmitry.suhotsky
 
Регистрация: 16.11.2018
Сообщений: 10

Вопрос 2.
Пытаюсь обновить данные следующим способом

saveItem = (text,phone,id) => {
    let NewArr = this.state.mobile;
    NewArr = NewArr.map(el => {
      if (el.id === id) {
        el.name = text;
        el.phone = phone
      }
      return NewArr;
    })
    this.setState({
      mobile: NewArr,
      read: false
    })
    // const newItem = {
    //   id: id,
    //   name: text,
    //   phone: phone
    // }
    // let NewArray = this.state.mobile.filter(el => el.id === id);
    // NewArray = newItem;
    // const NewMobile = this.state.mobile;
    // NewMobile[index] = NewArray;
    // this.setState({
    //   mobile: NewMobile
    
    // })
  }

Первым способом ошибка, в масиве NewArr - там появляется в каждом NewArr[i] по два элемента стейта
Во втором закомментированном не знаю как найти индекс NewMobile[index]. Скорее всего в filter, по как передать наружу не получается
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявление компонента в модулях sniffysko Angular.js 1 26.07.2018 12:58
Обновление картинки по таймеру paveltkachev Events/DOM/Window 25 05.09.2016 15:27
Обновление элемента без перезагрузки страницы starhe Общие вопросы Javascript 1 25.12.2015 20:53
Обновление страницы AndreyS AJAX и COMET 6 16.05.2011 15:55
Цикличное обновление страницы Roman_kstu Общие вопросы Javascript 7 29.05.2008 05:55