禁用反应原生按钮

Posted

技术标签:

【中文标题】禁用反应原生按钮【英文标题】:Disabling buttons on react native 【发布时间】:2016-01-29 04:58:19 【问题描述】:

我正在使用 react native 制作一个 android 应用程序,并且我使用 TouchableOpacity 组件来创建按钮。 我使用文本输入组件来接受来自用户的文本,并且该按钮应该仅在文本输入与某个字符串匹配时才启用。 我可以想办法做到这一点,首先在没有 TouchableOpactiy 包装器的情况下渲染按钮,并在输入字符串匹配后使用包装器重新渲染。 但我猜有更好的方法来做到这一点。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

TouchableOpacity extents TouchableWithoutFeedback,所以你可以只使用disabled 属性:

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

React Native TouchableWithoutFeedback #disabled documentation

新的Pressable API 也有一个disabled 选项:

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

【讨论】:

那么你有什么可以暗示它不适合你的东西吗?你用的是什么版本的 RN?你能给我们看一些代码吗?只需一个指向 RN 文档的链接即可帮助您:facebook.github.io/react-native/docs/… 请注意disabled 状态不会更改子渲染样式,因此为了使禁用状态对用户可见,您需要将样式应用于Text 元素,例如&lt;Text style= opacity: 0.5 &gt;I'm disabled&lt;/Text&gt; -- 仅供参考 除了 Peter 在这里建议的之外,您还可以在触摸处于活动状态时更改按钮的不透明度级别(目前默认为 0.2)。 reactnative.dev/docs/touchableopacity#activeopacity【参考方案2】:

就这样做

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

【讨论】:

&lt;Text&gt;text&lt;/FontText&gt;?字体文本? onPress 不期望布尔值 第二次按下会出现此错误。 TypeError: onPress is not a function. (In 'onPress(event)', 'onPress' is false) 不推荐解决方案。【参考方案3】:

这似乎是可以使用高阶组件解决的问题。虽然我可能是错的,因为我自己 100% 都在努力理解它,但也许它会对你有所帮助(这里有几个链接)......

http://www.bennadel.com/blog/2888-experimenting-with-higher-order-components-in-reactjs.htm http://jamesknelson.com/structuring-react-applications-higher-order-components/

【讨论】:

【参考方案4】:

this native-base 有解决方案:

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

【讨论】:

【参考方案5】:

TouchableOpacity 接收activeOpacity。你可以这样做

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

所以如果启用,它看起来会正常,否则,它看起来就像 touchable withoutfeedback。

【讨论】:

但这仍然没有禁用它。只是不会改变触摸的不透明度。 您可以执行类似 onPress=@someMethod if enabled 的操作。这样,您就不必将视图包装在不同的视图或可触摸对象中。【参考方案6】:

因此在 react native 中禁用任何按钮非常容易

<TouchableOpacity disabled=true>
    <Text> 
          This is disabled button
   </Text>
</TouchableOpacity>

disabled 是 react native 中的一个道具,当您将其值设置为“true”时,它将禁用您的按钮

快乐编程

【讨论】:

【参考方案7】:

要禁用文本,您必须在文本样式中设置 opacity:0,如下所示:

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

【讨论】:

【参考方案8】:

您可以使用TouchableWithoutFeedback 构建一个CustButton,并使用onPressInonPressout 或其他道具设置您想要的效果和逻辑。

【讨论】:

【参考方案9】:

我认为最有效的方法是用视图包装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
  

【讨论】:

【参考方案10】:

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

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

)

【讨论】:

【参考方案11】:

这是我的解决方法,希望对您有所帮助:

<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 属性,如果按钮被禁用。

【讨论】:

【参考方案12】:

您可以启用和禁用按钮或使用条件或直接默认禁用: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>

【讨论】:

【参考方案13】:

使用禁用的真实属性

<TouchableOpacity disabled=true> </TouchableOpacity>

【讨论】:

【参考方案14】:

这是有史以来最简单的解决方案:

您可以将 onPressOut 事件添加到 TouchableOpcaity 并做任何你想做的事。 在 onPressOut 完成之前,它不会让用户再次按下

【讨论】:

欢迎来到 SO。尽管我们感谢您的回答,但如果它在其他答案之上提供额外的价值会更好。在这种情况下,您的答案不会提供额外的价值,因为 Fomahaut 已经提到了该解决方案。如果之前的答案对您有帮助,那么您应该在获得足够声誉后投票。【参考方案15】:

当您的输入与字符串不匹配时,您可以在 TouchableOpacity 中使用 disabled 属性

<TouchableOpacity disabled =  stringMatched ? false : true >
    <Text>Some Text</Text>
</TouchableOpacity>

其中 stringMatched 是一个状态。

【讨论】:

以上是关于禁用反应原生按钮的主要内容,如果未能解决你的问题,请参考以下文章

在反应导航中禁用后退按钮

反应原生viewPager如何禁用边缘到边缘

有没有办法在反应原生 iOS 中有条件地禁用滑动返回手势?

如何从反应原生包中禁用羽毛笔编辑器的自动缩放?

在绘图加载时禁用闪亮按钮

反应本机 NATIVE BASE 选择器如何禁用选择器项目