Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在数据更改时触发react render_Javascript_Reactjs - Fatal编程技术网

Javascript 如何在数据更改时触发react render

Javascript 如何在数据更改时触发react render,javascript,reactjs,Javascript,Reactjs,我有以下数据: var data = [ ["The Lord of the Rings", "J. R. R. Tolkien", "English", "1954-1955", "150 million"], ["Le Petit Prince (The Little Prince)", "Antoine de Saint-Exupéry", "French", "1943", "140 million"], ["Harry Potter

我有以下数据:

var data = [
        ["The Lord of the Rings", "J. R. R. Tolkien", "English", "1954-1955", "150 million"], 
        ["Le Petit Prince (The Little Prince)", "Antoine de Saint-Exupéry", "French", "1943", "140 million"], 
        ["Harry Potter and the Philosopher's Stone", "J. K. Rowling", "English", "1997", "107 million"], 
        ["And Then There Were None", "Agatha Christie", "English", "1939", "100 million"], 
        ["Dream of the Red Chamber", "Cao Xueqin", "Chinese", "1754-1791", "100 million"], 
        ["The Hobbit", "J. R. R. Tolkien", "English", "1937", "100 million"], 
        ["She: A History of Adventure", "H. Rider Haggard", "English", "1887", "100 million"],
      ];
我使用它们来呈现一个表,每个表项都有一行(包含数据的书籍)。 出于学习目的,我想向数组中添加一个新项,并使用以下代码:

  var valueToPush = new Array();
  valueToPush[0]="Frodi societarie";
  valueToPush[1]="Lelio Faieta";
  valueToPush[2]="Italiano";
  valueToPush[3]="2004";
  valueToPush[4]="10";

  var myTimer = setTimeout(function() {data.push(valueToPush); console.log(data);}, 5000);
  var Ex = ReactDOM.render(
    React.createElement(Excel, {
      headers: headers,
      initialData: data,
    }),
    document.getElementById("app")
  );
我的目标是将新行添加到表中。该表使用以下代码呈现:

  var valueToPush = new Array();
  valueToPush[0]="Frodi societarie";
  valueToPush[1]="Lelio Faieta";
  valueToPush[2]="Italiano";
  valueToPush[3]="2004";
  valueToPush[4]="10";

  var myTimer = setTimeout(function() {data.push(valueToPush); console.log(data);}, 5000);
  var Ex = ReactDOM.render(
    React.createElement(Excel, {
      headers: headers,
      initialData: data,
    }),
    document.getElementById("app")
  );
重新呈现表格的下一步是什么? 以下是我迄今为止的完整代码:

  var Excel = React.createClass({
    displayName: 'Excel',

    propTypes: {
      headers: React.PropTypes.arrayOf(
        React.PropTypes.string
      ),
      initialData: React.PropTypes.arrayOf(
        React.PropTypes.arrayOf(
          React.PropTypes.string
        )
      ),
    },

    getInitialState: function() {
      return {
        data: this.props.initialData,
        sortby: null,
        descending: false,
        edit: null, // [row index, cell index],
        search: false,
      };
    },

    _sort: function(e) {
      var column = e.target.cellIndex;
      var data = this.state.data.slice();
      var descending = this.state.sortby === column && !this.state.descending;
      data.sort(function(a, b) {
        return descending 
          ? (a[column] < b[column] ? 1 : -1)
          : (a[column] > b[column] ? 1 : -1);
      });
      this.setState({
        data: data,
        sortby: column,
        descending: descending,
      });
    },

    _showEditor: function(e) {
      this.setState({edit: {
        row: parseInt(e.target.dataset.row, 10),
        cell: e.target.cellIndex,
      }});
    },

    _save: function(e) {
      e.preventDefault();
      var input = e.target.firstChild;
      var data = this.state.data.slice();
      data[this.state.edit.row][this.state.edit.cell] = input.value;
      this.setState({
        edit: null,
        data: data,
      });
    },

    _preSearchData: null,

    _toggleSearch: function() {
      if (this.state.search) {
        this.setState({
          data: this._preSearchData,
          search: false,
        });
        this._preSearchData = null;
      } else {
        this._preSearchData = this.state.data;
        this.setState({
          search: true,
        });
      }
    },

    _search: function(e) {
      var needle = e.target.value.toLowerCase();
      if (!needle) {
        this.setState({data: this._preSearchData});
        return;
      }
      var idx = e.target.dataset.idx;
      var searchdata = this._preSearchData.filter(function(row) {
        return row[idx].toString().toLowerCase().indexOf(needle) > -1;
      });
      this.setState({data: searchdata});
    },

    _download: function(format, ev) {
      var contents = format === 'json'
        ? JSON.stringify(this.state.data)
        : this.state.data.reduce(function(result, row) {
            return result
              + row.reduce(function(rowresult, cell, idx) {
                  return rowresult 
                    + '"' 
                    + cell.replace(/"/g, '""')
                    + '"'
                    + (idx < row.length - 1 ? ',' : '');
                }, '')
              + "\n";
          }, '');

      var URL = window.URL || window.webkitURL;
      var blob = new Blob([contents], {type: 'text/' + format});
      ev.target.href = URL.createObjectURL(blob);
      ev.target.download = 'data.' + format;
    },

    render: function() {
      return (
        React.DOM.div(null,
          this._renderToolbar(),
          this._renderTable()
        )
      );
    },

    _renderToolbar: function() {
      return  React.DOM.div({className: 'toolbar'},
        React.DOM.button({
          onClick: this._toggleSearch,
        }, 'Search'),
        React.DOM.a({
          onClick: this._download.bind(this, 'json'),
          href: 'data.json',
        }, 'Export JSON'),
        React.DOM.a({
          onClick: this._download.bind(this, 'csv'),
          href: 'data.csv',
        }, 'Export CSV')
      );
    },

    _renderSearch: function() {
      if (!this.state.search) {
        return null;
      }
      return (
        React.DOM.tr({onChange: this._search},
          this.props.headers.map(function(_ignore, idx) {
            return React.DOM.td({key: idx},
              React.DOM.input({
                type: 'text',
                'data-idx': idx,
              })
            );
          })
        )
      );
    },

    _renderTable: function() {
      return (
        React.DOM.table(null,
          React.DOM.thead({onClick: this._sort},
            React.DOM.tr(null,
              this.props.headers.map(function(title, idx) {
                if (this.state.sortby === idx) {
                  title += this.state.descending ? ' \u2191' : ' \u2193';
                }
                return React.DOM.th({key: idx}, title);
              }, this)
            )
          ),
          React.DOM.tbody({onDoubleClick: this._showEditor},
            this._renderSearch(),
            this.state.data.map(function(row, rowidx) {
              return (
                React.DOM.tr({key: rowidx},
                  row.map(function(cell, idx) {
                    var content = cell;
                    var edit = this.state.edit;
                    if (edit && edit.row === rowidx && edit.cell === idx) {
                      content = React.DOM.form({onSubmit: this._save},
                        React.DOM.input({
                          type: 'text',
                          defaultValue: cell,
                        })
                      );
                    }

                    return React.DOM.td({
                      key: idx,
                      'data-row': rowidx,
                    }, content);
                  }, this)
                )
              );
            }, this)
          )
        )
      );
    }
  });

  var headers = [
    "Book", "Author", "Language", "Published", "Sales"
  ];

  var data = [
    ["The Lord of the Rings", "J. R. R. Tolkien", "English", "1954-1955", "150 million"], 
    ["Le Petit Prince (The Little Prince)", "Antoine de Saint-Exupéry", "French", "1943", "140 million"], 
    ["Harry Potter and the Philosopher's Stone", "J. K. Rowling", "English", "1997", "107 million"], 
    ["And Then There Were None", "Agatha Christie", "English", "1939", "100 million"], 
    ["Dream of the Red Chamber", "Cao Xueqin", "Chinese", "1754-1791", "100 million"], 
    ["The Hobbit", "J. R. R. Tolkien", "English", "1937", "100 million"], 
    ["She: A History of Adventure", "H. Rider Haggard", "English", "1887", "100 million"],
  ];
  this.state(data);

  var myTimer = setTimeout(function() {this.setState([this.state,["Frodi","Lelio","Italiano","2004","10"]]); console.log(data);}, 5000);
  var Ex = ReactDOM.render(
    React.createElement(Excel, {
      headers: headers,
      initialData: data,
    }),
    document.getElementById("app")
  );
var Excel=React.createClass({
displayName:“Excel”,
道具类型:{
标题:React.PropTypes.arrayOf(
React.PropTypes.string
),
initialData:React.PropTypes.arrayOf(
React.PropTypes.arrayOf(
React.PropTypes.string
)
),
},
getInitialState:函数(){
返回{
数据:this.props.initialData,
sortby:null,
下降:错,
编辑:null,//[行索引,单元格索引],
搜索:假,
};
},
_排序:函数(e){
var列=e.target.cellIndex;
var data=this.state.data.slice();
var descending=this.state.sortby==列&&!this.state.descending;
数据排序(函数(a,b){
返回下降
?(a[列]b[列]?1:-1);
});
这是我的国家({
数据:数据,
排序:列,
下降:下降,
});
},
_showEditor:函数(e){
此.setState({编辑:{
行:parseInt(e.target.dataset.row,10),
单元格:e.target.cellIndex,
}});
},
_保存:功能(e){
e、 预防默认值();
var输入=e.target.firstChild;
var data=this.state.data.slice();
数据[this.state.edit.row][this.state.edit.cell]=input.value;
这是我的国家({
编辑:空,
数据:数据,
});
},
_preSearchData:null,
_toggleSearch:function(){
if(this.state.search){
这是我的国家({
数据:这是数据,
搜索:假,
});
这是。_preSearchData=null;
}否则{
this.\u preSearchData=this.state.data;
这是我的国家({
搜索:对,
});
}
},
_搜索:功能(e){
var指针=e.target.value.toLowerCase();
如果(!针){
this.setState({data:this.\u preSearchData});
返回;
}
var idx=e.target.dataset.idx;
var searchdata=this.\u preSearchData.filter(函数(行){
返回行[idx].toString().toLowerCase().indexOf(指针)>-1;
});
this.setState({data:searchdata});
},
_下载:功能(格式,ev){
var contents=格式==='json'
?JSON.stringify(this.state.data)
:this.state.data.reduce(函数(结果,行){
返回结果
+reduce(函数(rowresult、cell、idx){
返回行结果
+ '"' 
+单元格。替换(/“/g,”))
+ '"'
+(idximport React from "react";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      books: [
        [
          "The Lord of the Rings",
          "J. R. R. Tolkien",
          "English",
          "1954-1955",
          "150 million"
        ],
        [
          "Le Petit Prince (The Little Prince)",
          "Antoine de Saint-Exupéry",
          "French",
          "1943",
          "140 million"
        ],
        [
          "Harry Potter and the Philosopher's Stone",
          "J. K. Rowling",
          "English",
          "1997",
          "107 million"
        ],
        [
          "And Then There Were None",
          "Agatha Christie",
          "English",
          "1939",
          "100 million"
        ],
        [
          "Dream of the Red Chamber",
          "Cao Xueqin",
          "Chinese",
          "1754-1791",
          "100 million"
        ],
        ["The Hobbit", "J. R. R. Tolkien", "English", "1937", "100 million"],
        [
          "She: A History of Adventure",
          "H. Rider Haggard",
          "English",
          "1887",
          "100 million"
        ]
      ]
    };
  }

  componentDidMount() {
    setTimeout(() => {
      this.setState({
        books: [
          ...this.state.books,
          ["Frodi societarie", "Lelio Faieta", "Italiano", "2004", "10"]
        ]
      });
    }, 5000);
  }

  render() {
    return (
      <ul>
        {this.state.books.map((book, index) => (
          <li key={index}>{book[0]}</li>
        ))}
      </ul>
    );
  }
}

export default App;
this.setState({
    tableData: [
        ...data,
        valueToPush 
    ] 
})