Две вещи: setState является асинхронным, поэтому на следующей строке вы можете получить или не получить последнее значение, поэтому я рекомендую изменить
clickHandler = () => {
this.setState({active: !this.state.active})
this.props.getSelection(this.state.active)
}
на
clickHandler = () => {
this.setState({active: !this.state.active}, () => {
this.props.getSelection(this.state.active)
})
}
Второй Аргументом для setState является функция обратного вызова, которая будет выполнена сразу после завершения setState.
Во-вторых, на getSelection
вы каждый раз определяете новый массив, поэтому он не будет иметь значений из предыдущего запуска. Вы должны хранить это где-нибудь.
Проклятия хотят полностью управлять экраном и оптимизировать записи на экран, особенно по медленным последовательным линиям. Чтобы сделать это, это должно знать то, что находится на экране и единственном разумном способе сделать, это с большинством терминалов должно начать с пустого экрана и отслеживать то, что Вы пишете в терминал.
Таким образом я подозреваю (n), проклятия являются неправильным инструментом для Вашей оболочки. Вероятно, необходимо спуститься по шагу на уровне абстракции и использовать terminfo и неблокирующиеся чтения от терминала (стандартный вход) вместо этого.
(Это не очень полезно. Извините.)
Вы могли просто назвать свою программу от в rlwrap и иметь функциональность без боли...
Могло бы быть более просто использовать интерфейс как readline () вместо того, чтобы обратиться к полноценному ncurses.
Вы полагали, что простое целесообразное из создания пользовательского terminfo или termcap записи, испытывающей недостаток в последовательности, очищает экран и затем переключающий Вашу установку терминала на то право прежде, чем запустить Вашу программу? Вы могли также просто использовать newterm () и set_term () в ncurses. Это раньше было легче с termcap, так как Вы могли включать другой терминал и переопределить некоторые его возможности.
Вот другая дискуссия об этом. Предоставленные решения:
Конечно, существует третья опция получить ncurses исходный код, и изменить его так он больше не очищает экран.