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?

Jeff P Chacko
źródło

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

Julien Deniau
źródło
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>
Wysoki chłopak
źródło
<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.

eyal83
źródło
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>
Anja Ishmukhametova
źródło
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>
Duński Hassan
źródło
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
}
})
Cory McAboy
źródło
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.

Xdabier
źródło
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>
keerthi c
źródło
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
  }
Ammar Ismaeel
źródło