簡體   English   中英

在具有不同道具的容器中多次反應渲染組件?

[英]React render component multiple times in container with different props?

我試圖創建一個可重用的“標簽” 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元素都會被替換。” 這意味着在添加第二個芯片時,第一個被移除。 我希望用戶能夠擁有多個芯片。

我怎樣才能做到這一點?

我不知道您是否有充分的理由不在組件上添加用於創建標簽的表單,但是如果可以的話,它會簡單得多。 然后,您只需要在數組上添加標簽,然后將其與LanguageChip組件一起顯示即可。

我在這里做了一個例子: https//jsfiddle.net/snahedis/69z2wepo/28193/

我不知道您對React的理解水平,所以如果不清楚,請告訴我:)

編輯:先前存在的表單中的相同示例: https : //jsfiddle.net/snahedis/69z2wepo/28217/

您需要使用數組來存儲多個芯片數據。 看一下這個簡化的示例: 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')
    );
  }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM