2016-03-03 3 views
2

Я добавил возможность «понравиться» сообщению. И вдруг реакция-родная ползает по улитки. Im новый, чтобы реагировать, поэтому на самом деле не уверены, где и когда правильно установить состояние.Обновление состояния в реале-нативного принятия навсегда

Как должным образом привязать возможность понравиться строке в таблице listView?

Heres код ...

'как' текст, чтобы нажать на это ....

<Text onPress={this.likePost.bind(this, feeditem.post_id)}>{feeditem.likes} likes</Text> 

Тогда функция 'симпатия' это ...

likePost(id){ 
    if(this.state.feedData!=null){ 
    var d = this.state.feedData; 
    // Find row by post_id 
    var ix = d.findIndex(x => x.post_id===id); 
    // Only set state if user hasn't already liked 
    if(d[ix].you_liked==0){ 

     // Mark as liked, and increment 
     d[ix].you_liked=true; 
     d[ix].likes = parseInt(d[ix].likes)++; 

     // Set the state after liking 
     this.setState({ 
     feedData: d, 
     feedList: this.state.feedList.cloneWithRows(d) 
     }); 
    } 
    } 
} 

Он работает, и он корректно обновляет данные и показывает в инструментах dev просто отлично. Однако визуализация нового состояния визуально занимает минуту.

Я обновляю состояние неправильно? Какова стоимость для setState? Я думал, что реакция должна была просто повторно отобразить изменения, которые он видит в виртуальной DOM. Почему же это похоже на его рендеринг всего моего списка. И почему более 1 минуты времени загрузки? (явная утечка памяти где-то)?

Кроме того, возможно ли просто увеличивать целое число на «DOM» без запуска повторного рендера?

ответ

0

отрендерить ListView прохождение dataSource и renderRow реквизита

render() { 
    return (
    <ListView 
    dataSource={this.state.dataSource} 
    renderRow={this._renderRow}/> 
); 
} 

Создать renderRow функцию, где ваш может получить доступ к данным и индекс щелкнули строки

_renderRow = (rowData, sectionIndex, rowIndex, highlightRow) => { 
    return (
    <TouchableOpacity onPress={() => { 
     //Here you shoud update state 
    }}/> 
); 
}; 

Кроме того, вы всегда должны сделать копию состояние, прежде чем манипулировать им, потому что его неизменный объект. Попробуйте работать с государственными мутировавшими библиотеками, используйте https://facebook.github.io/react/docs/update.html или другие варианты.

+0

Цените ответ, но это не мой вопрос. Это мое плохое, потому что перечитывая мой вопрос, я вижу, как вы это восприняли ... Но я уже знаю, как передать идентификатор строки, и я даже не делаю этого в этом случае. Я нажимаю на текстовый элемент внутри строки. Во всяком случае .... мой вопрос был не в том, как это сделать, так было, как это сделать, чтобы он не занимал так долго рендеринга. Обновления вашего ответа отображаются в том же месте, где я обновляю его. (в функции onPress). Вопрос в том, почему переопределение занимает более 100 кадров. Кроме того, я не делаю копию состояния в моем примере? – KyleK

0

Анимация может занять много времени из-за хром-отладчика. Небольшой способ смягчить это с помощью InteractionManager

likePost(id){ 
    InteractionManager.runAfterInteractions(() => { 
    if(this.state.feedData!=null){ 
     var d = this.state.feedData; 
     // Find row by post_id 
     var ix = d.findIndex(x => x.post_id===id); 
     // Only set state if user hasn't already liked 
     if(d[ix].you_liked==0){ 

     // Mark as liked, and increment 
     d[ix].you_liked=true; 
     d[ix].likes = parseInt(d[ix].likes)++; 

     // Set the state after liking 
     this.setState({ 
      feedData: d, 
      feedList: this.state.feedList.cloneWithRows(d) 
     }); 
     } 
    } 
    }); 

} 

Или отключить хром отладки и использовать андроида монитор, чтобы увидеть отладочные сообщения.

+0

Хмм .... теперь его даже не обновляли после того, как положили его туда. Также, правильно ли я обновляю состояние? Как я делаю это правильно? Скопировав предыдущее состояние, положив новую переменную d в старое состояние? – KyleK

+0

О, да, попробуйте обернуть тэг 'Text' в' TouchableHighlight' и перенести onPress на 'TouchableHighlight' – denixtry

+0

Его не то, что событие touch не работает. Функция срабатывает нормально. Данные обновляются в моем массиве.Это фактическая настройка состояния, поэтому я могу визуально видеть изменения, которые либо сейчас не работают, либо навсегда. Так что это мой реальный вопрос. Как правильно настроить состояние, чтобы все работало. – KyleK

Смежные вопросы