簡體   English   中英

在ReactJS中實現動態onClick和渲染

[英]Dynamic onClick and render in ReactJS

我是React的新手,我需要一些幫助來解決這個問題!

我有一個Json對象:

var exampleJson = {
    title: "title",
    blocks: [
        {
            type: "block1",
            items: [{id: "1", count: 1},
                    {id: "2", count: 1},]
        },
        {
            type: "block2",
            items: [{id: "3", count: 1},
                    {id: "4", count: 1},]
        },
]};

我想獲取對象中的每個塊,並在div中渲染每個塊內的數據(包括遍歷該塊內的項目)。 div應該具有一個動態的onClick事件,該事件注冊了被單擊的塊。

這就是我得到的:

var BlockListClass = React.createClass({
blockClicked: function() {
    // Here I dont know what block I clicked
},
loopBlocks: function(_data, blockClicked) {
         // loop blocks
        {_data.map(function(object, i){
            var result = <div className="block" key={i}> 
                      {[ 
                         <h2 onClick={blockClicked} key={i}> {object.type} </h2>
                      ]}
                  </div>; 
         // Loop items
         for (var key in object.items) {
              if (object.items.hasOwnProperty(key)) {
               result.props.children.push(<h2 key={key+10}> {object.items[key].id} </h2>);
              }
            }
         return result;
         })}
},
render: function() {
  var _data = exampleJson.blocks;
  var blockClicked = this.blockClicked;
  var renderer = this.loopBlocks(_data,blockClicked);
  return(
    <div className="BlockList">
    {renderer}
    </div>
    );
}

});

然后像這樣渲染BlockListClass:

<BlockListClass />

//你可以做這樣的事情

var BlockListClass = React.createClass({
blockClicked: function(e) {
    var id = e.currentTarget.id;
    console.log(id);
},
loopBlocks: function(_data, blockClicked) {
         // loop blocks
        {_data.map(function(object, i){
            var result = <div className="block" key={i}> 
                      {[ 
                         <h2 onClick={blockClicked} id={i} key={i}> {object.type} </h2>
                      ]}
                  </div>; 
         // Loop items
         for (var key in object.items) {
              if (object.items.hasOwnProperty(key)) {
               result.props.children.push(<h2 key={key+10}> {object.items[key].id} </h2>);
              }
            }
         return result;
         })}
},
render: function() {
  var _data = exampleJson.blocks;
  var blockClicked = this.blockClicked;
  var renderer = this.loopBlocks(_data,blockClicked);
  return(
    <div className="BlockList">
    {renderer}
    </div>
    );
}
});

您提出的問題本質上是“如何將參數傳遞給React Elements上的onClick事件”。 這是React中必須遵循的常見模式。 最簡單的方法是將值綁定到函數調用。

<h2 onClick={blockClicked.bind(this, i)} key={i}> {object.type} </h2>

然后您的處理程序將如下所示

blockClicked: function(i) {
    console.log(i);
},

如果仍然需要訪問click事件,則可以首先傳遞索引值,並在觸發onClick事件時返回要調用的函數:

<h2 onClick={blockClicked(i)} key={i}> {object.type} </h2>

使用結果處理程序:

blockClicked: function(i) {
  return function(e) {
    console.log(i);
    // do what you want with 'e' 
  }
}

編輯:我還應該注意,我的回答很籠統。 由於您的元素嵌套在map(function(){...}) ,因此綁定'this'將導致錯誤。 您將需要將其綁定到正確的上下文。 但是,我認為這超出了這個問題的范圍。 只是想讓您知道是否遇到該問題。

暫無
暫無

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

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