I had the same issue with an HTML table in which I have text input lines in a column. inside the loop, I read the json object and create the rows, in particular, I have a column with inputtext.
http://reactkungfu.com/2015/09/react-js-loses-input-focus-on-typing/
I managed to solve it as follows
import { InputTextComponent } from './InputTextComponent'; //import my inputTextComponent ... var trElementList = (function (list, tableComponent) { var trList = [], trElement = undefined, trElementCreator = trElementCreator, employeeElement = undefined; // iterating through employee list and // creating row for each employee for (var x = 0; x < list.length; x++) { employeeElement = list[x]; var trNomeImpatto = React.createElement('tr', null, <td rowSpan="4"><strong>{employeeElement['NomeTipologiaImpatto'].toUpperCase()}</strong></td>); trList.push(trNomeImpatto); trList.push(trElementCreator(employeeElement, 0, x)); trList.push(trElementCreator(employeeElement, 1, x)); trList.push(trElementCreator(employeeElement, 2, x)); } // end of for return trList; // returns row list function trElementCreator(obj, field, index) { var tdList = [], tdElement = undefined; //my input text var inputTextarea = <InputTextComponent idImpatto={obj['TipologiaImpattoId']}//index value={obj[columns[field].nota]}//initial value of the input I read from my json data source noteType={columns[field].nota} impattiComposite={tableComponent.state.impattiComposite} //updateImpactCompositeNote={tableComponent.updateImpactCompositeNote} /> tdElement = React.createElement('td', { style: null }, inputTextarea); tdList.push(tdElement); var trComponent = createClass({ render: function () { return React.createElement('tr', null, tdList); } }); return React.createElement(trComponent); } // end of trElementCreator }); ... //my tableComponent var tableComponent = createClass({ // initial component states will be here // initialize values getInitialState: function () { return { impattiComposite: [], serviceId: window.sessionStorage.getItem('serviceId'), serviceName: window.sessionStorage.getItem('serviceName'), form_data: [], successCreation: null, }; }, //read a json data soure of the web api url componentDidMount: function () { this.serverRequest = $.ajax({ url: Url, type: 'GET', contentType: 'application/json', data: JSON.stringify({ id: this.state.serviceId }), cache: false, success: function (response) { this.setState({ impattiComposite: response.data }); }.bind(this), error: function (xhr, resp, text) { // show error to console console.error('Error', xhr, resp, text) alert(xhr, resp, text); } }); }, render: function () { ... React.createElement('table', {style:null}, React.createElement('tbody', null,trElementList(this.state.impattiComposite, this),)) ... } //my input text var inputTextarea = <InputTextComponent idImpatto={obj['TipologiaImpattoId']}//index value={obj[columns[field].nota]}//initial value of the input I read //from my json data source noteType={columns[field].nota} impattiComposite={tableComponent.state.impattiComposite}//impattiComposite = my json data source />//end my input text tdElement = React.createElement('td', { style: null }, inputTextarea); tdList.push(tdElement);//add a component //./InputTextComponent.js import React from 'react'; export class InputTextComponent extends React.Component { constructor(props) { super(props); this.state = { idImpatto: props.idImpatto, value: props.value, noteType: props.noteType, _impattiComposite: props.impattiComposite, }; this.updateNote = this.updateNote.bind(this); } //Update a inpute text with new value insert of the user updateNote(event) { this.setState({ value: event.target.value });//update a state of the local componet inputText var impattiComposite = this.state._impattiComposite; var index = this.state.idImpatto - 1; var impatto = impattiComposite[index]; impatto[this.state.noteType] = event.target.value; this.setState({ _impattiComposite: impattiComposite });//update of the state of the father component (tableComponet) } render() { return ( <input className="Form-input" type='text' value={this.state.value} onChange={this.updateNote}> </input> ); } }