Управление state в react.js

306
13 марта 2017, 10:49

Привет. Помогите плиз разобраться с состояниями. Нужно реализовать приложение с динамичным добавлением\удалением элементов. С REST получаем JSON, парсим в объект, на базе объекта строится селектор, при выборе добавляется элемент, описанный в объекте. Проблема: не получается реализовать удаление текущего элемента - всегда удаляется последний. Упростил пример:

class Base extends React.Component { 
  constructor(props) { 
    super(props); 
    this.state = { 
      elements: [{ 
        id: 0, 
        name: "Name" 
      }] 
    }; 
    this.add = this.add.bind(this); 
    this.remove = this.remove.bind(this); 
  } 
  add() { 
    let newState = this.state.elements; 
    console.log(newState[newState.length - 1]); 
    newState.push({ 
      id: newState[newState.length - 1].id + 1, 
      name: "Add manual" 
    }); 
    this.setState({ 
      elements: newState 
    }) 
  } 
  remove(item) { 
    let newState = this.state.elements; 
    if (this.state.elements.indexOf(item)) { 
      newState.splice(this.state.elements.indexOf(item), 1); 
      this.setState({ 
        elements: newState 
      }); 
    } 
  } 
  render() { 
    const elements = this.state.elements.map( 
      (item, i) => < div key = { 
        i 
      } > < Select data = { 
        item.id + " - " + item.name 
      } 
      /><button onClick={this.remove.bind(this, item)}>Remove</button > < /div> 
    ) 
    return ( < div className = "Container" > 
      < 
      div className = "Row" > 
      < 
      div > Это содержимое Base <button 
      onClick = { 
        this.add 
      } > Add item < /button> < / 
      div > < div > { 
        elements 
      } < /div> </div > < 
      /div> 
    ) 
  } 
 
} 
 
class Select extends React.Component { 
  constructor(props) { 
    super(props); 
    this.data = props.data; 
  } 
 
  render() { 
    return ( <button> 
      Это оригинал: { 
        this.data 
      } </button> 
    ) 
  } 
} 
         
ReactDOM.render( 
  <Base />, 
  document.getElementById('root') 
);  
        
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
<div id="root"></div>

READ ALSO
Высота div&#39;а в зависимости от контента [требует правки]

Высота div'а в зависимости от контента [требует правки]

Как сделать, чтобы div был по высоте контента? float не используетсяmain находится посреди страницы (margin: auto)

212
Контроллер AngularJS бесконечно запускается

Контроллер AngularJS бесконечно запускается

Моя проблема заключается в том, что при попытке настройки маршрутизации стандартного проекта ASPNET MVC и AngularJS, а именно "Вход/Регистрация", при...

379
Как выделить активную ссылку в меню?

Как выделить активную ссылку в меню?

Сейчас добавляется active, если находишься в категории siteru/closed/,

324