Я думаю, вы должны создать отдельные функции из валидации JS и использовать их. Например:
//App.js
hasSpecial(value) {
const special = '!#$%&'()*+,-./:;<=>?@[\]^_{|}~"';
return value.split("").some(char => special.includes(char));
// or with regexp
return /[!#$%&'()*+,-.\/:;<=>?@[\]^_{|}~"]/.test(value);
}
handleInputChange(value) {
this.setState({
value,
conditions: {
special: this.hasSpecial(value)
}
});
}
...
this.handleInputChange(e.target.value)}
value={this.state.value}
/>
У меня есть несколько предложений по улучшению вашего кода и ваших навыков:
Ну, Ваш конкретный случай уже обрабатывается при использовании лексических дескрипторов файлов (в противоположность старому стилю bareword дескрипторы файлов). Для других случаев Вы могли всегда использовать УНИЧТОЖАТЬ метод объекта, который, как гарантируют, пойдет для обнуления ссылок, когда он выходит из объема:
#!/usr/bin/perl
use strict;
use warnings;
for my $i (1 .. 5) {
my $defer = Defer::Sub->new(sub { print "end\n" });
print "start\n$i\n";
}
package Defer::Sub;
use Carp;
sub new {
my $class = shift;
croak "$class requires a function to call\n" unless @_;
my $self = {
func => shift,
};
return bless $self, $class;
}
sub DESTROY {
my $self = shift;
$self->{func}();
}
ETA: Мне нравятся имя brian лучше, Объем:: OnExit является намного более описательным именем.
Вместо того, чтобы использовать связь для этого, я думаю, что просто создал бы объект. Можно также избежать local
это слишком.
{
my $defer = Scope::OnExit->new( @subs );
$defer->push( $other_sub ); # and pop, shift, etc
...
}
Когда переменная выходит из объема, у Вас есть шанс выполнить в вещах УНИЧТОЖАТЬ метод.
Кроме того, в примере Вы отправили, необходимо проверить, что значения, которые Вы храните, являются ссылками кода, и это - вероятно, хорошая идея проверить, что значение VAL является ссылкой на массив:
sub TIESCALAR { bless { VAL => [] }, $_[0] } sub STORE { my( $self, $value ) = @_; carp "Can only store array references!" unless ref $value eq ref []; foreach { @$value } { carp "There should only be code refs in the array" unless ref $_ eq ref sub {} } foreach ( @{ $self->{VAL}} ) { $_->() } $self->{VAL} = $value; }
Можно хотеть испытать B:: Рычаги:: EndOfScope
Я Полагаю, что это работает:
use B::Hooks::EndOfScope;
sub foo {
on_scope_end {
$codehere;
};
$morecode
return 1; # scope end code executes.
}
foo();
Тривиально,
sub OnLeavingScope::DESTROY { ${$_[0]}->() }
используемый как:
{
...
my $onleavingscope = bless \sub { ... }, 'OnLeavingScope';
my $onleavingscope2 = bless \\&whatever, 'OnLeavingScope';
...
}
(Дополнительный уровень наличия ссылки на ссылку на sub необходим только для работы вокруг оптимизации (это - возможно ошибка) при использовании незакрытия анонимная замена),
Я думаю, что Вы хотите что-то как Объем:: Охрана, но это не может быть продвинуто. Хм.
Спасибо.