Wyłączanie przycisków na reagowaniu natywnym


155

Tworzę aplikację na Androida przy użyciu React Native i do tworzenia przycisków użyłem komponentu TouchableOpacity.
Używam komponentu do wprowadzania tekstu, aby akceptować tekst od użytkownika, a przycisk powinien być włączony tylko wtedy, gdy wprowadzony tekst pasuje do określonego ciągu.
Mogę wymyślić sposób, aby to zrobić, początkowo renderując przycisk bez opakowania TouchableOpactiy i ponownie renderując go z opakowaniem po dopasowaniu ciągu wejściowego.
Ale zgaduję, że jest o wiele lepszy sposób na zrobienie tego. Czy ktoś może pomóc?

Odpowiedzi:


307

TouchableOpacityextents TouchableWithoutFeedback, więc możesz po prostu użyć disabledwłaściwości:

<TouchableOpacity disabled={true}>
  <Text>I'm disabled</Text>
</TouchableOpacity>

React Native TouchableWithoutFeedback #disabled dokumentacja


Cóż, czy masz coś, co może dać wskazówkę, co to nie działa? Jakiej wersji RN używasz? Czy możesz pokazać nam kod? Tylko link do dokumentacji RN, aby ci pomóc: facebook.github.io/react-native/docs/…
Julien Deniau

9
Zauważ, że disabledstan nie zmienia potomnych stylów renderowania, więc aby stan wyłączony był widoczny dla użytkowników, musisz zastosować styl do Textelementu, taki jak <Text style={{ opacity: 0.5 }}>I'm disabled</Text>- tylko do Twojej wiadomości
Peter Theill

46

Po prostu zrób to

<TouchableOpacity activeOpacity={disabled ? 1 : 0.7} onPress={!disabled && onPress}>
  <View>
    <Text>{text}</Text>
  </View>
</TouchableOpacity>

<Text>{text}</FontText>? FontText?
jcollum

11
onPress nie spodziewa się wartości logicznej
Fábio Paiva


3

TouchableOpacity odbiera activeOpacity. Możesz zrobić coś takiego

<TouchableOpacity activeOpacity={enabled ? 0.5 : 1}>
</TouchableOpacity>

Więc jeśli jest włączony, będzie wyglądał normalnie, w przeciwnym razie będzie wyglądał jak dotykowy bez informacji zwrotnej.


1
Ale to nadal go nie wyłącza. Po prostu nie zmienia krycia w dotyku.
Jeff P Chacko

1
Możesz zrobić coś takiego jak onPress = {@ someMethod, jeśli jest włączony}. W ten sposób nie będziesz musiał zawijać widoku różnymi widokami lub elementami dotykowymi.
eyal83

3

ta natywna baza jest rozwiązaniem:

<Button
    block
    disabled={!learnedWordsByUser.length}
    style={{ marginTop: 10 }}
    onPress={learnedWordsByUser.length && () => {
      onFlipCardsGenerateNewWords(learnedWordsByUser)
      onFlipCardsBtnPress()
    }}
>
    <Text>Let's Review</Text>
</Button>

2

Aby wyłączyć tekst, musisz ustawić krycie: 0 w stylu tekstu w następujący sposób:

<TouchableOpacity style={{opacity:0}}>
  <Text>I'm disabled</Text>
</TouchableOpacity>


0

Udało mi się to naprawić, umieszczając warunek we właściwości stylu.

const startQuizDisabled = () => props.deck.cards.length === 0;

<TouchableOpacity
  style={startQuizDisabled() ? styles.androidStartQuizDisable : styles.androidStartQuiz}
  onPress={startQuiz}
  disabled={startQuizDisabled()}
>
  <Text 
    style={styles.androidStartQuizBtn} 
  >Start Quiz</Text>
</TouchableOpacity>

const styles = StyleSheet.create({
androidStartQuiz: {
    marginTop:25,
    backgroundColor: "green",
    padding: 10,
    borderRadius: 5,
    borderWidth: 1
},
androidStartQuizDisable: {
    marginTop:25,
    backgroundColor: "green",
    padding: 10,
    borderRadius: 5,
    borderWidth: 1,
    opacity: 0.4
},
androidStartQuizBtn: {
    color: "white",
    fontSize: 24
}
})

0

Oto moja praca, mam nadzieję, że to pomoże:

<TouchableOpacity
    onPress={() => {
        this.onSubmit()
    }}
    disabled={this.state.validity}
    style={this.state.validity ?
          SignUpStyleSheet.inputStyle :
          [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}>
    <Text style={SignUpStyleSheet.buttonsText}>Sign-Up</Text>
</TouchableOpacity>

in SignUpStyleSheet.inputStyleprzechowuje styl przycisku, gdy jest wyłączony lub nie, a następnie style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}dodaję właściwość krycia, jeśli przycisk jest wyłączony.


0

Możesz włączać i wyłączać przycisk lub używając warunku lub bezpośrednio, domyślnie zostanie on wyłączony: true

 // in calling function of button 
    handledisableenable()
        {
         // set the state for disabling or enabling the button
           if(ifSomeConditionReturnsTrue)
            {
                this.setState({ Isbuttonenable : true })
            }
          else
          {
             this.setState({ Isbuttonenable : false})
          }
        }

<TouchableOpacity onPress ={this.handledisableenable} disabled= 
     {this.state.Isbuttonenable}>

    <Text> Button </Text>
</TouchableOpacity>

0

Myślę, że najbardziej wydajnym sposobem jest owinięcie elementu touchableOpacity widokiem i dodanie elementu pointerEvents z warunkiem stylu.

<View style={this.state.disabled && commonStyles.buttonDisabled}        
      pointerEvents={this.state.disabled ? "none" : "auto"}>
  <TouchableOpacity
    style={styles.connectButton}>
  <Text style={styles.connectButtonText}">CONNECT </Text>
  </TouchableOpacity>
</View>

CSS:

buttonDisabled: {
    opacity: 0.7
  }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.