React native üzerindeki düğmeleri devre dışı bırakma


163

React native kullanarak bir android uygulaması yapıyorum ve düğmeler oluşturmak için TouchableOpacity bileşenini kullandım.
Kullanıcıdan gelen metni kabul etmek için bir metin girişi bileşeni kullanıyorum ve düğme yalnızca metin girişi belirli bir dizeyle eşleştiğinde etkinleştirilmelidir .
Başlangıçta düğmeyi TouchableOpactiy sarmalayıcısı olmadan oluşturarak ve giriş dizesi eşleştiğinde sarmalayıcıyla yeniden oluşturarak bunu yapmanın bir yolunu düşünebilirim.
Ama bunu yapmanın çok daha iyi bir yolu olduğunu tahmin ediyorum. Biri yardım edebilir mi?

Yanıtlar:


327

TouchableOpacitykapsamları TouchableWithoutFeedback, böylece disabledözelliği kullanabilirsiniz :

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

Geribildirim Olmadan Yerel Dokunulabilir React # devre dışı dokümantasyon

Yeni Pressable API'nin de bir disabledseçeneği vardır :

<Pressable disable={true}>
  {({ pressed }) => (
    <Text>I'm disabled</Text>
  )}
</Pressable>

Sizin için neyin işe yaramadığına dair bir ipucu verebilecek herhangi bir şeyiniz var mı? Hangi RN sürümünü kullanıyorsunuz? Bize biraz kod gösterebilir misin? Size yardımcı olacak RN belgelerine bir bağlantı: facebook.github.io/react-native/docs/…
Julien Deniau

9
Durumun disabledalt oluşturma stillerini değiştirmediğine dikkat edin, bu nedenle devre dışı Text<Text style={{ opacity: 0.5 }}>I'm disabled</Text>
bırakma

teşekkürler. çok yardımcı oldu.
Biplov Kumar

50

Sadece bunu yap

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

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

12
onPress bir boole beklemiyor
Fábio Paiva


4

bu yerel tabanda bir çözüm var:

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

3

TouchableOpacity alır activeOpacity. Bunun gibi bir şey yapabilirsin

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

Yani etkinleştirilirse normal görünecek, aksi takdirde geri bildirim olmadan dokunulabilir gibi görünecektir.


1
Ancak bu yine de onu devre dışı bırakmaz. Dokunulduğunda opaklığı değiştirmez.
Jeff P Chacko

1
OnPress = {@ someMethod eğer etkinse} gibi bir şey yapabilirsiniz. Bu şekilde, görünümünüzü farklı görünümlere veya dokunuşlara sığdırmanız gerekmez.
eyal83

2

Metni devre dışı bırakmak için opaklığı şu şekilde ayarlamanız gerekir: Metin stilinde 0:

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

1

Bence en verimli yol touchableOpacity'yi bir görünümle sarmak ve prop pointerEvents'i bir stil koşuluyla eklemek.

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


0

Bunu, stil özelliğine bir koşullu koyarak düzeltebildim.

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

İşte bunun için çalışmam, umarım yardımcı olur:

<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.inputStyle, devre dışı bırakıldığında veya olmadığında düğmenin stilini tutar, ardından style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}düğme devre dışıysa opaklık özelliğini eklerim.


0

Düğmeyi etkinleştirebilir ve devre dışı bırakabilirsiniz veya koşulu kullanarak veya doğrudan varsayılan olarak devre dışı bırakılır: 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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.