javascript - ocultos - Ocultar/Mostrar componentes en reaccionar nativo
mostrar y ocultar texto en html (18)
Soy realmente nuevo en React Native y me pregunto cómo puedo ocultar / mostrar un componente.
Aquí está mi caso de prueba:
<TextInput
onFocus={this.showCancel()}
onChangeText={(text) => this.doSearch({input: text})} />
<TouchableHighlight
onPress={this.hideCancel()}>
<View>
<Text style={styles.cancelButtonText}>Cancel</Text>
</View>
</TouchableHighlight>
Tengo un componente
TextInput
, lo que quiero es mostrar el
TouchableHighlight
cuando la entrada obtiene el foco, luego ocultar el
TouchableHighlight
cuando el usuario presiona el botón cancelar.
No sé cómo "acceder" al componente
TouchableHighlight
para ocultarlo / mostrarlo dentro de mis funciones
showCancel/hideCancel
.
Además, ¿cómo puedo ocultar el botón desde el principio?
El diseño de React Native tiene el soporte de propiedad de
display
, similar a CSS.
Valores posibles:
none
y
flex
(predeterminado).
https://facebook.github.io/react-native/docs/layout-props#display
<View style={{display: ''none''}}> </View>
En reaccionar o reaccionar de forma nativa, el componente ocultar / mostrar o agregar / eliminar no funciona como en Android o iOS. La mayoría de nosotros cree que habría una estrategia similar como
View.hide = true or parentView.addSubView(childView)
Pero la forma en que reacciona el trabajo nativo es completamente diferente. La única forma de lograr este tipo de funcionalidad es incluir su componente en su DOM o eliminarlo de DOM.
Aquí, en este ejemplo, voy a establecer la visibilidad de la vista de texto en función del clic del botón.
La idea detrás de esta tarea es crear una variable de estado llamada estado que tenga el valor inicial establecido en falso cuando se produce el evento de clic del botón y luego el valor cambia. Ahora usaremos esta variable de estado durante la creación del componente.
import renderIf from ''./renderIf''
class FetchSample extends Component {
constructor(){
super();
this.state ={
status:false
}
}
toggleStatus(){
this.setState({
status:!this.state.status
});
console.log(''toggle button handler: ''+ this.state.status);
}
render() {
return (
<View style={styles.container}>
{renderIf(this.state.status)(
<Text style={styles.welcome}>
I am dynamic text View
</Text>
)}
<TouchableHighlight onPress={()=>this.toggleStatus()}>
<Text>
touchme
</Text>
</TouchableHighlight>
</View>
);
}
}
lo único que se debe notar en este fragmento es
renderIf
que en realidad es una función que devolverá el componente que se le pasó en función del valor booleano que se le pasó.
renderIf(predicate)(element)
renderif.js
''use strict'';
const isFunction = input => typeof input === ''function'';
export default predicate => elemOrThunk =>
predicate ? (isFunction(elemOrThunk) ? elemOrThunk() : elemOrThunk) : null;
En realidad, en el desarrollo de iOS por
react-native
cuando uso
display: ''none''
o algo como a continuación:
const styles = StyleSheet.create({
disappearImage: {
width: 0,
height: 0
}
});
El iOS no carga nada más del componente de imagen como
onLoad
o etc., así que decidí usar algo como a continuación:
const styles = StyleSheet.create({
disappearImage: {
width: 1,
height: 1,
position: ''absolute'',
top: -9000,
opacity: 0
}
});
En su función de renderizado:
{ this.state.showTheThing &&
<TextInput/>
}
Entonces solo haz:
this.setState({showTheThing: true}) // to show it
this.setState({showTheThing: false}) // to hide it
Haría algo como esto:
var myComponent = React.createComponent({
getInitialState: function () {
return {
showCancel: false,
};
},
toggleCancel: function () {
this.setState({
showCancel: !this.state.showCancel
});
}
_renderCancel: function () {
if (this.state.showCancel) {
return (
<TouchableHighlight
onPress={this.toggleCancel()}>
<View>
<Text style={styles.cancelButtonText}>Cancel</Text>
</View>
</TouchableHighlight>
);
} else {
return null;
}
},
render: function () {
return (
<TextInput
onFocus={this.toggleCancel()}
onChangeText={(text) => this.doSearch({input: text})} />
{this._renderCancel()}
);
}
});
La única forma de mostrar u ocultar un componente en react native es comprobando el valor de un parámetro del estado de la aplicación como
state
o
props
.
Proporcioné un ejemplo completo como a continuación:
import React, {Component} from ''react''; import {View,Text,TextInput,TouchableHighlight} from ''react-native'' class App extends Component { constructor(props){ super(props); this.state={ show:false } } showCancel=()=>{ this.setState({show:true}) }; hideCancel=()=>{ this.setState({show:false}) }; renderTouchableHighlight(){ if(this.state.show){ return( <TouchableHighlight style={{borderColor:''black'',borderWidth:1,marginTop:20}} onPress={this.hideCancel}> <View> <Text>Cancel</Text> </View> </TouchableHighlight> ) } return null; } render() { return ( <View style={{justifyContent:''center'',alignItems:''center'',flex:1}}> <TextInput style={{borderColor:''black'',borderBottomWidth:1}} onFocus={this.showCancel} /> {this.renderTouchableHighlight()} </View> ); } } export default App;
La mayoría de las veces estoy haciendo algo como esto:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {isHidden: false};
this.onPress = this.onPress.bind(this);
}
onPress() {
this.setState({isHidden: !this.state.isHidden})
}
render() {
return (
<View style={styles.myStyle}>
{this.state.isHidden ? <ToHideAndShowComponent/> : null}
<Button title={this.state.isHidden ? "SHOW" : "HIDE"} onPress={this.onPress} />
</View>
);
}
}
Si eres nuevo en la programación, esta línea debe ser extraña para ti:
{this.state.isHidden ? <ToHideAndShowComponent/> : null}
Esta línea es equivalente a
if (this.state.isHidden)
{
return ( <ToHideAndShowComponent/> );
}
else
{
return null;
}
Pero no puede escribir una condición if / else en el contenido JSX (por ejemplo, la parte return () de una función de representación), por lo que tendrá que usar esta notación.
Este pequeño truco puede ser muy útil en muchos casos y le sugiero que lo use en sus desarrollos porque puede verificar rápidamente una condición.
Saludos,
Muy fácil. Simplemente cambie a () => this.showCancel () como a continuación:
<TextInput
onFocus={() => this.showCancel() }
onChangeText={(text) => this.doSearch({input: text})} />
<TouchableHighlight
onPress={this.hideCancel()}>
<View>
<Text style={styles.cancelButtonText}>Cancel</Text>
</View>
</TouchableHighlight>
Necesitaba cambiar entre dos imágenes. Con el cambio condicional entre ellos hubo un retraso de 5 segundos sin mostrar ninguna imagen.
Estoy usando el enfoque de la respuesta amos con voto negativo. Publicar como nueva respuesta porque es difícil poner código en el comentario con el formato adecuado.
Función de procesamiento:
<View style={styles.logoWrapper}>
<Image
style={[styles.logo, loading ? styles.hidden : {}]}
source={require(''./logo.png'')} />
<Image
style={[styles.logo, loading ? {} : styles.hidden]}
source={require(''./logo_spin.gif'')} />
</View>
Estilos:
var styles = StyleSheet.create({
logo: {
width: 200,
height: 200,
},
hidden: {
width: 0,
height: 0,
},
});
Puede usar mi módulo react-native-display para mostrar / ocultar componentes.
Si necesita que el componente permanezca cargado pero oculto, puede establecer la opacidad en 0. (necesitaba esto para la cámara de exposición, por ejemplo)
//in constructor
this.state = {opacity: 100}
/in component
style = {{opacity: this.state.opacity}}
//when you want to hide
this.setState({opacity: 0})
Solo estoy usando el siguiente método para ocultar o ver un botón. Espero que te ayude. solo actualizar el estado y agregar hide css es suficiente para mí
constructor(props) {
super(props);
this.state = {
visibleStatus: false
};
}
updateStatusOfVisibility () {
this.setStatus({
visibleStatus: true
});
}
hideCancel() {
this.setStatus({visibleStatus: false});
}
render(){
return(
<View>
<TextInput
onFocus={this.showCancel()}
onChangeText={(text) => {this.doSearch({input: text}); this.updateStatusOfVisibility()}} />
<TouchableHighlight style={this.state.visibleStatus ? null : { display: "none" }}
onPress={this.hideCancel()}>
<View>
<Text style={styles.cancelButtonText}>Cancel</Text>
</View>
</TouchableHighlight>
</View>)
}
Solo usa
style={ width:0, height:0 } // to hide
Tuve el mismo problema en el que me gustaría mostrar / ocultar vistas, pero realmente no quería que la interfaz de usuario saltara cuando se agregaran / eliminaran cosas o que necesariamente se ocupara de volver a renderizar.
Escribí un componente simple para tratarlo por mí. Animado por defecto, pero fácil de alternar. Lo puse en GitHub y NPM con un archivo Léame, pero todo el código está debajo.
npm install --save react-native-hideable-view
import React, { Component, PropTypes } from ''react'';
import { Animated } from ''react-native'';
class HideableView extends Component {
constructor(props) {
super(props);
this.state = {
opacity: new Animated.Value(this.props.visible ? 1 : 0)
}
}
animate(show) {
const duration = this.props.duration ? parseInt(this.props.duration) : 500;
Animated.timing(
this.state.opacity, {
toValue: show ? 1 : 0,
duration: !this.props.noAnimation ? duration : 0
}
).start();
}
shouldComponentUpdate(nextProps) {
return this.props.visible !== nextProps.visible;
}
componentWillUpdate(nextProps, nextState) {
if (this.props.visible !== nextProps.visible) {
this.animate(nextProps.visible);
}
}
render() {
if (this.props.removeWhenHidden) {
return (this.visible && this.props.children);
}
return (
<Animated.View style={{opacity: this.state.opacity}}>
{this.props.children}
</Animated.View>
)
}
}
HideableView.propTypes = {
visible: PropTypes.bool.isRequired,
duration: PropTypes.number,
removeWhenHidden: PropTypes.bool,
noAnimation: PropTypes.bool
}
export default HideableView;
Una opción adicional es aplicar el posicionamiento absoluto a través del estilo , configurando el componente oculto en coordenadas fuera de la pantalla:
<TextInput
onFocus={this.showCancel()}
onChangeText={(text) => this.doSearch({input: text})}
style={this.state.hide ? {position: ''absolute'', top: -200} : {}}
/>
A diferencia de algunas de las sugerencias anteriores, esto ocultaría su componente de la vista, PERO también lo representará (lo mantendrá en el DOM), lo que lo hará realmente invisible .
en render () puede mostrar condicionalmente el JSX o devolver nulo como en:
render(){
return({yourCondition ? <yourComponent /> : null});
}
Ocultar
y
mostrar
vista principal del
Activity Indicator
de
Activity Indicator
constructor(props) {
super(props)
this.state = {
isHidden: false
}
}
Ocultar y mostrar como sigue
{
this.state.isHidden ? <View style={style.activityContainer} hide={false}><ActivityIndicator size="small" color="#00ff00" animating={true}/></View> : null
}
Referencia completa
render() {
return (
<View style={style.mainViewStyle}>
<View style={style.signinStyle}>
<TextField placeholder=''First Name'' keyboardType=''default'' onChangeFirstName={(text) => this.setState({firstName: text.text})}/>
<TextField placeholder=''Last Name'' keyboardType=''default'' onChangeFirstName={(text) => this.setState({lastName: text.text})}/>
<TextField placeholder=''Email'' keyboardType=''email-address'' onChangeFirstName={(text) => this.setState({email: text.text})}/>
<TextField placeholder=''Phone Number'' keyboardType=''phone-pad'' onChangeFirstName={(text) => this.setState({phone: text.text})}/>
<TextField placeholder=''Password'' secureTextEntry={true} keyboardType=''default'' onChangeFirstName={(text) => this.setState({password: text.text})}/>
<Button style={AppStyleSheet.buttonStyle} title=''Sign up'' onPress={() => this.onSignupPress()} color=''red'' backgroundColor=''black''/>
</View>
{
this.state.isHidden ? <View style={style.activityContainer}><ActivityIndicator size="small" color="#00ff00" animating={true}/></View> : null
}
</View>
);
}
El botón On presiona establecer estado de la siguiente manera
onSignupPress() {
this.setState({isHidden: true})
}
Cuando necesitas esconderte
this.setState({isHidden: false})
constructor(props) { super(props); this.state = { visible: true, } }
declarar visible falso, por lo que, por defecto, modal / view se ocultan
ejemplo = () => {
this.setState({ visible: !this.state.visible })
}
**Llamada de función **
{this.state.visible == false ? <View> <TouchableOpacity onPress= {() => this.example()}> // call function <Text> show view </Text> </TouchableOpacity> </View>] : <View> <TouchableOpacity onPress= {() => this.example()}> <Text> hide view </Text> </TouchableOpacity> </View> }