반응 기본에서 버튼 비활성화


155

반응 네이티브를 사용하여 안드로이드 앱을 만들고 TouchableOpacity 구성 요소를 사용하여 버튼을 만들었습니다.
텍스트 입력 구성 요소를 사용하여 사용자의 텍스트를 수락 하고 텍스트 입력이 특정 문자열과 일치 하면 버튼을 활성화 해야 합니다.
TouchableOpactiy 래퍼없이 버튼을 처음 렌더링하고 입력 문자열이 일치하면 래퍼로 다시 렌더링하여이를 수행하는 방법을 생각할 수 있습니다.
그러나이 작업을 수행하는 훨씬 더 좋은 방법이 있다고 생각합니다. 누구든지 도울 수 있습니까?

답변:


307

TouchableOpacityextents TouchableWithoutFeedback이므로 disabled속성을 사용할 수 있습니다 .

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

피드백 # 비활성화 된 문서없이 기본 터치 가능


잘 작동하지 않는 것에 대한 힌트를 줄 수있는 것이 있습니까? 어떤 버전의 RN을 사용하십니까? 코드 좀 보여 주시겠습니까? RN 문서 링크 : facebook.github.io/react-native/docs/…
Julien Deniau 2016

9
통지 disabled상태가 사용자에게 표시 비활성 상태 당신이에 스타일을 적용해야하기 위해 그렇게 아이의 렌더링 스타일을 변경하지 않는 Text등의 요소를 <Text style={{ opacity: 0.5 }}>I'm disabled</Text>단지 참고 -
피터 Theill

46

그냥하세요

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

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

11
onPress는 부울을 기대하지 않습니다
Fábio Paiva


3

TouchableOpacity가 수신 activeOpacity합니다. 이런 식으로 할 수 있습니다

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

활성화되어 있으면 정상으로 보이고 그렇지 않으면 피드백없이 터치 할 수있는 것처럼 보입니다.


1
그러나 여전히 비활성화하지는 않습니다. 터치시 불투명도를 변경하지 않습니다.
Jeff P Chacko

1
onPress = {@ someMethod if enabled}와 같은 작업을 수행 할 수 있습니다. 이런 식으로 뷰를 다른 뷰 또는 터치 가능한 뷰로 랩핑 할 필요가 없습니다.
eyal83

3

이 기본 기반에는 솔루션이 있습니다.

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

2

텍스트를 비활성화하려면 다음과 같이 텍스트 스타일에서 불투명도 : 0을 설정해야합니다.

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


0

스타일 속성에 조건부를 넣어서이 문제를 해결할 수있었습니다.

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>

in SignUpStyleSheet.inputStyle은 버튼의 비활성화 여부에 따라 스타일을 유지 한 다음 style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}버튼이 비활성화 된 경우 불투명도 속성을 추가합니다.


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를 뷰로 감싸고 prop 조건 이벤트를 스타일 조건으로 추가하는 것입니다.

<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
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.