Vô hiệu hóa các nút trên phản ứng tự nhiên


155

Tôi đang tạo một ứng dụng Android bằng phản ứng gốc và tôi đã sử dụng thành phần TouchableOpacity để tạo các nút.
Tôi sử dụng một thành phần nhập văn bản để chấp nhận văn bản từ người dùng và nút chỉ nên được bật khi đầu vào văn bản khớp với một chuỗi nhất định.
Tôi có thể nghĩ ra một cách để làm điều này bằng cách ban đầu hiển thị nút mà không có trình bao bọc TouchableOpactiy và kết xuất lại với trình bao bọc sau khi chuỗi đầu vào khớp.
Nhưng tôi đoán có một cách tốt hơn để làm điều này. Có ai giúp được không?

Câu trả lời:


305

TouchableOpacityphạm vi TouchableWithoutFeedback, vì vậy bạn chỉ có thể sử dụng disabledtài sản:

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

React Native TouchableWithoutFeedback #disables


Chà, bạn có bất cứ điều gì có thể đưa ra gợi ý về những gì nó không làm việc cho bạn không? Bạn sử dụng phiên bản RN nào? Bạn có thể cho chúng tôi xem một số mã? Chỉ cần một liên kết đến tài liệu RN để giúp bạn: facebook.github.io/react-native/docs/iêu
Julien Deniau

9
Lưu ý disabledtrạng thái không thay đổi kiểu kết xuất con, vì vậy để hiển thị trạng thái bị vô hiệu hóa cho người dùng, bạn cần áp dụng một kiểu cho Textphần tử, chẳng hạn như <Text style={{ opacity: 0.5 }}>I'm disabled</Text>- chỉ là FYI
Peter Theill

46

Chỉ cần làm điều này

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

<Text>{text}</FontText>? Phông chữ?
jcollum

11
onPress không mong đợi một boolean
Fábio Paiva


3

TouchableOpacity nhận được activeOpacity. Bạn có thể làm một cái gì đó như thế này

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

Vì vậy, nếu nó được kích hoạt, nó sẽ trông bình thường, nếu không, nó sẽ trông giống như touchablewithoutfeedback.


1
Nhưng điều đó vẫn không vô hiệu hóa nó. Chỉ không thay đổi độ mờ khi chạm.
Jeff P Chacko

1
Bạn có thể làm một cái gì đó như onPress = {@ someMethod nếu được bật}. Theo cách này, bạn sẽ không phải đưa tầm nhìn của mình vào các chế độ xem hoặc cảm ứng khác nhau.
eyal83

3

cơ sở bản địa này có giải pháp:

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

2

Để tắt Văn bản, bạn phải đặt độ mờ: 0 theo kiểu Văn bản như sau:

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

0

Bạn có thể xây dựng một CustButton với TouchableWithoutFeedback, và thiết lập các hiệu ứng và logic bạn muốn với onPressIn, onPressouthoặc đạo cụ khác.


0

Tôi đã có thể khắc phục điều này bằng cách đặt một điều kiện trong thuộc tính kiểu.

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

Đây là công việc của tôi cho việc này, tôi hy vọng nó sẽ giúp:

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

trong SignUpStyleSheet.inputStylegiữ kiểu cho nút khi nó bị vô hiệu hóa hay không, sau đó trong style={this.state.validity ? SignUpStyleSheet.inputStyle : [SignUpStyleSheet.inputAndButton, {opacity: 0.5}]}tôi thêm thuộc tính độ mờ nếu nút bị tắt.


0

Bạn có thể bật và tắt nút hoặc bằng cách sử dụng điều kiện hoặc trực tiếp theo mặc định, nó sẽ bị vô hiệu hóa: 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

Tôi nghĩ rằng cách hiệu quả nhất là bọc một touchableOpacity bằng một khung nhìn và thêm con trỏ propEvents với một điều kiện kiểu.

<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
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.