Deshabilitar botones en reaccionar nativo


155

Estoy creando una aplicación de Android usando react native y he usado el componente TouchableOpacity para crear botones.
Utilizo un componente de entrada de texto para aceptar texto del usuario y el botón solo debe habilitarse una vez que la entrada de texto coincida con una cadena determinada.
Puedo pensar en una forma de hacer esto al representar inicialmente el botón sin el contenedor TouchableOpactiy y volver a representar con el contenedor una vez que la cadena de entrada coincide.
Pero supongo que hay una manera mucho mejor de hacer esto. ¿Alguien puede ayudar?

Respuestas:


308

TouchableOpacityextensiones TouchableWithoutFeedback, por lo que puede usar la disabledpropiedad:

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

Reaccionar Native TouchableWithoutFeedback #disabled documentación


Bueno, ¿tienes algo que pueda darte una pista de lo que no está funcionando para ti? ¿Qué versión de RN usas? ¿Nos puede mostrar un código? Solo un enlace a la documentación de RN para ayudarlo: facebook.github.io/react-native/docs/…
Julien Deniau

9
Observe que el disabledEstado no cambia los estilos de reproducción hijo para el fin de hacer que el estado deshabilitado visible para los usuarios que tendría que aplicar un estilo al Textelemento como <Text style={{ opacity: 0.5 }}>I'm disabled</Text>- sólo un FYI
Peter Theill

46

Solo haz esto

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

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

11
onPress no espera un booleano
Fábio Paiva


3

TouchableOpacity recibe activeOpacity. Puedes hacer algo como esto

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

Entonces, si está habilitado, se verá normal, de lo contrario, se verá como tocable sin retroalimentación.


1
Pero eso todavía no lo deshabilita. Simplemente no cambia la opacidad al tacto.
Jeff P Chacko 01 de

1
Podría hacer algo como onPress = {@ someMethod si está habilitado}. De esta manera, no tendrá que ajustar su vista en diferentes vistas o tocables.
eyal83

3

esta base nativa hay solución:

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

2

Para deshabilitar el texto, debe establecer la opacidad: 0 en estilo de texto como este:

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


0

Pude solucionar esto poniendo un condicional en la propiedad de estilo.

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

Aquí está mi trabajo para esto, espero que ayude:

<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>

en SignUpStyleSheet.inputStylecontiene el estilo del botón cuando está deshabilitado o no, luego style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}agrego la propiedad de opacidad si el botón está deshabilitado.


0

Puede habilitar y deshabilitar el botón o mediante la condición o directamente de forma predeterminada, se deshabilitará: verdadero

 // 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

Creo que la forma más eficiente es envolver la TouchchableOpacity con una vista y agregar el puntero PropEvents con una condición de estilo.

<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
  }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.