Скрыть/показать компоненты в реакции native
Я действительно новичок в React Native, и мне интересно, как я могу скрыть/показать компонент.
Вот мой тестовый пример:
<TextInput
onFocus={this.showCancel()}
onChangeText={(text) => this.doSearch({input: text})} />
<TouchableHighlight
onPress={this.hideCancel()}>
<View>
<Text style={styles.cancelButtonText}>Cancel</Text>
</View>
</TouchableHighlight>
У меня есть компонент TextInput
, я хочу показать TouchableHighlight
, когда вход получает фокус, затем скройте TouchableHighlight
, когда пользователь нажмет кнопку отмены.
Я не знаю, как "получить доступ" к компоненту TouchableHighlight
, чтобы скрыть/показать его внутри моих функций showCancel/hideCancel
.
Кроме того, как я могу скрыть кнопку с самого начала?
Ответы
Ответ 1
Я бы сделал что-то вроде этого:
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()}
);
}
});
Ответ 2
В вашей функции рендеринга:
{ this.state.showTheThing &&
<TextInput/>
}
Затем просто выполните:
this.setState({showTheThing: true}) // to show it
this.setState({showTheThing: false}) // to hide it
Ответ 3
В ответном или реагирующем нативном способе скрыть/показать или добавить/удалить компонент не работает, как в Android или iOS. Большинство из нас думает, что будет такая же стратегия, как
View.hide = true or parentView.addSubView(childView)
Но способ реагировать на родную работу совершенно другой. Единственный способ добиться такой функциональности - включить ваш компонент в DOM или удалить из DOM.
Здесь в этом примере я устанавливаю видимость текстового представления на основе нажатия кнопки.
![введите описание изображения здесь]()
Идея этой задачи заключается в создании переменной состояния, называемой state с начальным значением, установленным в false, когда происходит событие нажатия кнопки, тогда оно переключается на значение. Теперь мы будем использовать эту переменную состояния во время создания компонента.
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>
);
}
}
единственное, что нужно заметить в этом фрагменте, - это renderIf
, который на самом деле является функцией, которая возвращает компонент, переданный ему на основе логического значения, переданного ему.
renderIf(predicate)(element)
renderif.js
'use strict';
const isFunction = input => typeof input === 'function';
export default predicate => elemOrThunk =>
predicate ? (isFunction(elemOrThunk) ? elemOrThunk() : elemOrThunk) : null;
Ответ 4
в render() вы можете условно показать JSX или вернуть null, как в:
render(){
return({yourCondition ? <yourComponent /> : null});
}
Ответ 5
Мне нужно было переключаться между двумя изображениями. При условном переключении между ними была задержка в 5 секунд без отображения изображения.
Я использую подход из ответа downvoted amos. Публикация как новый ответ, потому что трудно помещать код в комментарий с правильным форматированием.
Функция рендеринга:
<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>
Стили:
var styles = StyleSheet.create({
logo: {
width: 200,
height: 200,
},
hidden: {
width: 0,
height: 0,
},
});
![screencast]()
Ответ 6
В большинстве случаев я делаю что-то вроде этого:
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>
);
}
}
Если вы новичок в программировании, эта строка должна быть вам странной:
{this.state.isHidden ? <ToHideAndShowComponent/> : null}
Эта строка эквивалентна
if (this.state.isHidden)
{
return ( <ToHideAndShowComponent/> );
}
else
{
return null;
}
Но вы не можете написать условие if/else в содержимом JSX (например, часть return() функции рендеринга), поэтому вам придется использовать это обозначение.
Этот небольшой трюк может быть очень полезным во многих случаях, и я предлагаю вам использовать его в своих разработках, потому что вы можете быстро проверить состояние.
Привет,
Ответ 7
![enter image description here]()
Скрыть и показать родительское представление Activity Indicator
constructor(props) {
super(props)
this.state = {
isHidden: false
}
}
Скрыть и показать как подписчиков
{
this.state.isHidden ? <View style={style.activityContainer} hide={false}><ActivityIndicator size="small" color="#00ff00" animating={true}/></View> : null
}
Полная ссылка
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>
);
}
При нажатии кнопки устанавливается состояние, как следует
onSignupPress() {
this.setState({isHidden: true})
}
Когда вам нужно спрятаться
this.setState({isHidden: false})
Ответ 8
просто используйте
style={ width:0, height:0 } // to hide
Ответ 9
Макет React Native имеет поддержку свойства display
, аналогично CSS.
Возможные значения: none
и flex
(по умолчанию).
https://facebook.github.io/react-native/docs/layout-props#display
<View style={{display: 'none'}}> </View>
Ответ 10
У меня была та же проблема, когда я хотел показать/скрыть представления, но я действительно не хотел, чтобы пользовательский интерфейс прыгал, когда что-то добавлялось/удалялось, или обязательно занимался повторным рендерингом.
Я написал простой Компонент, чтобы справиться с этим для меня. По умолчанию анимирован, но легко переключается. Я поместил его на GitHub и NPM с помощью readme, но весь код приведен ниже.
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;
Ответ 11
Дополнительным вариантом является применение абсолютного позиционирования с помощью стиля, установка скрытого компонента в координатах вне экрана:
<TextInput
onFocus={this.showCancel()}
onChangeText={(text) => this.doSearch({input: text})}
style={this.state.hide ? {position: 'absolute', top: -200} : {}}
/>
В отличие от предыдущих предложений, это скроет ваш компонент из представления, но также сделает его (сохранит его в DOM), сделав его действительно невидимым.
Ответ 12
Вы можете использовать мой модуль react-native-display для отображения/скрытия компонентов.
Ответ 13
Если вам нужно, чтобы компонент оставался загруженным, но скрытым, вы можете установить непрозрачность равной 0. (Мне это нужно, например, для экспо-камеры)
//in constructor
this.state = {opacity: 100}
/in component
style = {{opacity: this.state.opacity}}
//when you want to hide
this.setState({opacity: 0})
Ответ 14
Очень легко. Просто измените на() = > this.showCancel(), как показано ниже:
<TextInput
onFocus={() => this.showCancel() }
onChangeText={(text) => this.doSearch({input: text})} />
<TouchableHighlight
onPress={this.hideCancel()}>
<View>
<Text style={styles.cancelButtonText}>Cancel</Text>
</View>
</TouchableHighlight>
Ответ 15
Я просто использую метод ниже, чтобы скрыть или просмотреть кнопку. надеюсь, это поможет вам. мне достаточно просто обновить статус и добавить Hide CSS
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>)
}
Ответ 16
На самом деле, в разработке для iOS react-native
, когда я использую display: 'none'
или что-то вроде ниже:
const styles = StyleSheet.create({
disappearImage: {
width: 0,
height: 0
}
});
iOS не загружает ничего другого из компонента Image, такого как onLoad
или т.д., поэтому я решил использовать что-то вроде ниже:
const styles = StyleSheet.create({
disappearImage: {
width: 1,
height: 1,
position: 'absolute',
top: -9000,
opacity: 0
}
});
Ответ 17
Единственный способ показать или скрыть компонент в реагирующем нативе - это проверить значение параметра состояния приложения, такого как state
или props
. Я предоставил полный пример, как показано ниже:
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;
![Here is the result]()