2016-01-20 5 views
0

Я пытаюсь создать повторно используемый компонент «tag» React, чтобы пользователи могли создавать теги onclick и видеть информацию, отображаемую в DOM.Повторно обрабатывать компонент несколько раз в контейнере с различными реквизитами?

Вот модуль:

module.exports = React.createClass({ 
    render: function() { 
    return (
     <div className="language chip" data-lang={this.props.language} data-lang-level={this.props.level}> 
     {this.props.language} ({this.props.level}) 
     <i className="material-icons">close</i> 
     </div> 
    ); 
    } 
}); 

И вызов OnClick:

var addLanguage = $('a#add-language'); 
addLanguage.click(function() { 
    var languageLearning = $('#language-learning'); 
    var levelLearning = $('#language-level'); 

    if (languageLearning != null && levelLearning != null) { 

    ReactDOM.render(
     <LanguageChip 
     language={languageLearning.val()} 
     level={levelLearning.val()} 
     />, 
     document.getElementById('language-chips') 
    ); 

    languageLearning.select2('val', ''); 
    levelLearning.select2('val', ''); 

    } 
}) 

Я не понимал, что при использовании React.DOM, «Все существующие элементы DOM внутри заменяются при первом вызове «. Это означает, что при добавлении второго чипа первое удаляется. Я хочу, чтобы пользователи имели несколько фишек.

Как это сделать?

ответ

1

Я не знаю, есть ли у вас веская причина не добавлять форму, используемую для создания тега на вашем компоненте, но было бы намного проще, если бы вы могли. Тогда вам просто нужно добавить свои теги в массив и отобразить их с помощью вашего компонента LanguageChip.

Я сделал пример здесь: https://jsfiddle.net/snahedis/69z2wepo/28193/

Я не знаю, что ваш уровень понимания React, так что если что-то не ясно, дайте мне знать :)

Edit: такой же пример внутри заранее существующей формы: https://jsfiddle.net/snahedis/69z2wepo/28217/

+0

Спасибо, это здорово! Я не хочу делать это с помощью формы, потому что область, в которой я использую это, уже находится внутри формы, поэтому я получаю проблемы с вложенными формами. Любые советы сделать это за пределами формы? –

+0

Я отредактировал свой ответ. Вам просто нужно использовать событие нажатия кнопки вместо события отправки формы. Но если это внутри формы, я думаю, вы захотите отправить теги с формой нет? – Snahedis

+0

Да, мне нужно отправить теги, но через JSON с очень конкретной структурой, поэтому не беспокойтесь. Благодаря! –

0

Вам необходимо использовать массив для хранения нескольких данных микросхем. Взгляните на этот упрощенный пример: http://output.jsbin.com/seficu

var LanguageChips = React.createClass({ 
    render: function() { 
    return (
     <div> 
     {  
      (this.props.chipsArray).map(function(chip, index) { 
      return <LanguageChip 
       key={index} 
       language={chip.languageLearning} 
       level={chip.levelLearning} 
      /> 
      }) 
     } 
     </div> 
    ); 
    } 
}); 

var LanguageChip = React.createClass({ 
    render: function() { 
    return (
     <div className="language chip" data-lang={this.props.language} data-lang-level={this.props.level}> 
     {this.props.language} ({this.props.level}) 
     <i className="material-icons"></i> 
     </div> 
    ); 
    } 
}); 

var chipsArray = []; 

document.getElementById('add-language').addEventListener("click", function() { 
    var languageLearning = 'test1'; 
    var levelLearning = 'test2'; 
    if (languageLearning != null && levelLearning != null) { 
    chipsArray.push({ 
     languageLearning: languageLearning, 
     levelLearning: levelLearning 
    }); 

    ReactDOM.render(
     <LanguageChips chipsArray={chipsArray} />, 
     document.getElementById('language-chips') 
    ); 
    } 
})