2015-06-05 2 views
1

Я не был уверен, относится ли этот вопрос к программистам или ТАК, так что простите меня, если я выбрал неразумно.В приложении React/Flux, где находится тайм-аут отложенного действия?

Это мое первое приложение React/Flux, поэтому я все еще изучаю веревки.

У меня есть приложение с компонентом ввода текста. Я не хочу распространять изменения каждый раз, когда пользователь вводит символ во вход (по соображениям производительности). Поэтому в обработчике ввода onChange я установил состояние компонента для нового значения, проверьте, не превышает ли время ожидания (если это так, очистите его), а затем запустите новый тайм-аут 500 мс, который вызывает действие изменения стоимости который обновляет магазин.

import React from 'react'; 
import { Input } from 'react-bootstrap'; 

import TableStore from '../stores/table-store'; 
import TableActions from '../actions/table-actions'; 

export default class TableEditorDescription extends React.Component { 
    constructor(props) { 
     super(props); 

     this.handleChange = this.handleChange.bind(this); 

     this.state = { 
      description: TableStore.getLoadedTable().description 
     }; 
    } 

    handleChange(e) { 
     let description = e.target.value; // new value of the input 
     this.setState({ 
      description: description 
     }); 

     if (this._timeout) { 
      clearTimeout(this._timeout); 
     } 

     this._timeout = setTimeout(function() { 
      TableActions.setLoadedTableDesc(description); 
     }, 500); 
    } 

    render() { 
     return <Input ref='desc' 
        {...this.props} 
        type='textarea' 
        placeholder='description' 
        value={this.state.description} 
        onChange={this.handleChange} />; 
    } 
} 

Однако кнопка моей сохранить (родной брат компонент) отключается, если нет отложенных изменений, чтобы сохранить, и загорается, когда были внесены изменения. В моем текущем коде, так как действие задерживается, кнопка не включается до половины секунды после того, как пользователь перестает печатать. Более того, поскольку действие ждет полсекунды, чтобы вступить в силу, если кнопка сохранения уже включена и пользователь нажимает ее в течение этой половины секунды, то неправильное значение сохраняется - значение ввода перед тем, как пользователь начал вводить текст ,

Итак, моя следующая мысль заключалась в том, чтобы вызвать два действия - задержанное, и одно, которое в конечном итоге приводит к другому событию, которое испускается, что-то вроде 'queuedChange', причем единственным компонентом, слушающим его, является кнопка. Затем, когда нажата кнопка, либо действие сохранения будет ждать, пока произойдет другое действие, либо магазин начнет его искусственно, и сообщит, что входной сигнал очистит тайм-аут или что-то в этом роде.

Тогда я подумал, что подходящим местом для этой задержки может быть магазин, и поэтому хранилище будет поддерживать тайм-ауты для каждого из действий, которые должны быть отложены (зная, следует ли делать задержка или просто сделать изменение сразу на основе по параметру действия).

Есть ли у кого-нибудь, кто сделал что-то подобное, какой-нибудь неопровержимый совет?

+3

Честно говоря, Реакция действительно быстрая. Я бы не стал беспокоиться об обновлении хранилища каждый раз при нажатии клавиши. – gcedo

+2

Фактически, документация React явно скрывает это. Команда React потратила больше времени, чем разумно, убедившись, что React молниеносно, не тратьте свое время на это. Распространяйте все изменения и надейтесь, что React и Virtual DOM справятся с этим эффективно. Особенно, если это ваше первое приложение React, у вас есть * ничего *, чтобы основывать свое мнение на других, кроме показателей, поэтому не пытайтесь оптимизировать, прежде чем у вас будет статистика, показывающая, что React работает медленно. Просто напишите правильный код React и следуйте соответствующим методам React. –

ответ

0

По комментариям я покончил с этим, потому что React работает быстро.

1

Почему бы просто не использовать _.debounce (или подобную версию из вашей любимой библиотеки).

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