禁用React Native上的按钮


155

我正在使用react native开发一个Android应用程序,并且使用了TouchableOpacity组件来创建按钮。
我使用文本输入组件来接受来自用户的文本,并且当文本输入与特定字符串匹配时才应启用按钮。
我可以想到一种方法,方法是先在没有TouchableOpactiy包装器的情况下呈现按钮,然后在输入字符串匹配后用包装器重新呈现。
但是我猜想有更好的方法来做到这一点。有人可以帮忙吗?

Answers:


305

TouchableOpacity范围TouchableWithoutFeedback,因此您可以使用disabled属性:

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

React Native TouchableWithoutFeedback #disabled文档


那么,您是否有任何东西可能会暗示它对您不起作用?您使用什么版本的RN?你能给我们看一些代码吗?刚到RN文档的链接,以帮助您:facebook.github.io/react-native/docs/...
朱利安DENIAU

9
请注意,disabled状态不会更改子渲染样式,因此,要使禁用状态对用户可见,您需要将样式应用于Text元素,例如<Text style={{ opacity: 0.5 }}>I'm disabled</Text>-仅供参考
Peter Theill,

46

做这个

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

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

11
onPress并不期望一个布尔
法比奥·派瓦


3

TouchableOpacity接收activeOpacity。你可以做这样的事情

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

因此,如果启用它,它将看起来很正常,否则它将看起来像touchablewithoutfeedback。


1
但这仍然不能禁用它。只是不会改变触摸的不透明度。
Jeff P Chacko 2015年

1
您可以执行类似onPress = {@ someMethod如果已启用}的操作。这样,您就不必将视图包装在其他视图或可触摸对象中。
eyal83

3

这个基于本地的解决方案:

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

2

要禁用文本,您必须像这样在文本样式中设置opacity:0:

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


0

我可以通过在style属性中添加条件来解决此问题。

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

这是我的工作,希望对您有所帮助:

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

SignUpStyleSheet.inputStyle的按钮是否禁用则保留按钮的样式,然后style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}如果按钮被禁用,则添加opacity属性。


0

您可以启用和禁用按钮,也可以使用条件或默认情况下直接将其禁用: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

我认为最有效的方法是用视图包装touchableOpacity并添加带有样式条件的proppointerEvents。

<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
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.