반응 네이티브에서 컴포넌트 숨기기 / 보이기


143

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.
또한 처음부터 단추를 숨기려면 어떻게해야합니까?


답변:


135

나는 이런 식으로 할 것입니다 :

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()}          
        );
    }

});

1
onFocus = {() => this.showCancel ()}이 작업은 콜백 함수 여야합니다.
Crysfel

3
만 변경 후 나를 위해 일 return ''return null
k7k0

33
당신은 또한 할 수 있으며 {someBoolVal && <Component />}bool 값이 true 인 경우에만 표시됩니다.
Nathan Hyland

이것이 가장 좋은 답변입니다
Kirill Gusyatin

3
나는 이것이 원래 원하는 기능보기 / 숨기기를 구현하지 않고 대신 추가 / 제거를 수행하는 수용 된 대답인지 모른다.
Muhammad Aref

150

렌더 기능에서 :

{ this.state.showTheThing && 
  <TextInput/>
}

그런 다음 수행하십시오.

this.setState({showTheThing: true})  // to show it  
this.setState({showTheThing: false}) // to hide it

2
이것은 나를 위해 일했습니다. 그러나 왜 내가 { this.state.showTheThing && (<Text>foo</Text> && <Text>bar</Text>)}"막대" 와 같은 것을 UI에 표시 하는지 잘 모르겠습니다 . "foo"및 "bar"가 표시 될 것으로 예상합니다. 이 문제를 해결하기 위해해야했던 것은{ this.state.showTheThing && (<Text>foo</Text>} { this.state.showTheThing && (<Text>bar</Text>}
tonatiuhnb

2
어쩌면 이것이 효과가 있습니까? 논리 &&는 요소를 결합하지 않기 때문에{ this.state.showTheThing && (<View><Text>foo</Text><Text>bar</Text></View>)}
muescha

이것은 나를 위해 일했습니다. 사용자가 자신의 프로필을 업로드 할 때 "다음 단계"버튼을 표시하고 싶었습니다. 내 코드였다 있도록 :{this.state.hasPic && <Button title="Go to next step" onPress={this._nextStep} />}
Daggie Blanqx - 더글러스 Mwangi

둘 이상의 구성 요소를 표시하는 데 어려움을 겪고있는 사람은 구성 요소를 조각으로 감싸십시오. 예. <React.Fragment><Text>Foo</Text><Text>Bar></Text></React.Fragment>
Ben Cull

48

기본적으로 반응 또는 반응에서 구성 요소 숨기기 / 표시 또는 추가 / 제거가 Android 또는 iOS 에서처럼 작동하지 않습니다. 우리 대부분은 비슷한 전략이있을 것이라고 생각합니다

View.hide = true or parentView.addSubView(childView)

그러나 기본 작업에 반응하는 방식은 완전히 다릅니다. 이러한 종류의 기능을 달성하는 유일한 방법은 컴포넌트를 DOM에 포함 시키거나 DOM에서 제거하는 것입니다.

이 예제에서는 버튼 클릭을 기준으로 텍스트보기의 가시성을 설정합니다.

여기에 이미지 설명을 입력하십시오

이 작업의 기본 개념은 버튼 클릭 이벤트가 발생하면 값이 토글 될 때 초기 값이 false로 설정된 state라는 상태 변수를 작성하는 것입니다. 이제 컴포넌트 생성 중에이 상태 변수를 사용할 것입니다.

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;

영리한 :) 썽크의 사용 사례는 무엇입니까?
goldylucks

ㅋ. 훌륭한!
Jaseem Abbas

이 솔루션은 대화 상자가 필요할 때만 렌더링해야하는 사용 사례에 적합합니다. 타이!
SoundStage

2
상태를 유지 해야하는 경우 작동하지 않습니다. 요소를 재설정하여 상태를 재설정하십시오. 다시 렌더링 할 때마다 컴포넌트를 다시 생성하는 것과 같습니다.
Daniel Jose Padilla Peña


20

render ()에서 JSX를 조건부로 표시하거나 다음과 같이 null을 반환 할 수 있습니다.

render(){
    return({yourCondition ? <yourComponent /> : null});
}

3
괄호는 2 행에 필요합니다.
jiexishede

가장 간단한 솔루션에 감사드립니다
Sam

13

두 이미지 사이를 전환해야했습니다. 그들 사이의 조건부 전환으로 이미지가 표시되지 않은 상태에서 5 초 지연되었습니다.

downvoted amos answer의 접근법을 사용하고 있습니다. 올바른 형식으로 코드를 주석에 넣기가 어렵 기 때문에 새로운 답변으로 게시.

렌더 기능 :

<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,
  },
});

스크린 캐스트


이렇게하면 구성 요소가 메모리에 유지되므로 큰 구성 요소에 문제가 될 수 있습니다. 위의 위대한 예를 사용하지 않겠습니까? 그들은 올바른 그림을 삽입하고 다른 하나를 완전히 제거 할 것입니다 ...
AS

4
애니메이션 스피너를 만들 때 이러한 예제 중 하나가 제대로 작동하지 않습니다. 안드로이드에서 내 대답에서 이미 언급 한 것처럼 애니메이션 GIF로 img를 전환하려고하면 png 나 gif가 표시되지 않으면 5 초가 지연됩니다. 지연이 gif를 메모리에로드하여 발생하는데 시간이 걸릴 수 있다고 생각합니다. 그러나 iOS는 훨씬 나은 작업을 수행하는 것으로 보입니다. 당신이 나를 믿지 않으면 직접 시도하십시오.
mauron85

1
물론 모든 구성 요소에 대해 최적의 솔루션은 아닙니다. 그러나 스피너를로드하기위한 IMHO는 괜찮습니다. 사용자가 다른 페이지로 전환하면 결국 언로드됩니다.
mauron85

13

대부분의 경우 나는 이런 식으로 일하고 있습니다 :

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

그러나 JSX 컨텐츠에 if / else 조건 (예 : 렌더링 함수의 return () 부분)을 작성할 수 없으므로이 표기법을 사용해야합니다.

이 작은 트릭은 많은 경우에 매우 유용 할 수 있으며 조건을 빠르게 확인할 수 있기 때문에 개발에 사용하는 것이 좋습니다.

문안 인사,


<ToHideAndShowComponent />
Ritveak을

12

여기에 이미지 설명을 입력하십시오

부모보기 숨기기표시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>
   );
}

On 버튼은 다음과 같이 설정된 상태를 누름

onSignupPress() {
  this.setState({isHidden: true})
}

숨겨야 할 때

this.setState({isHidden: false})


10

그냥 사용

style={ width:0, height:0 } // to hide

4
답변에 컨텍스트 / 세부 사항을 추가하면 도움이 될 것입니다.
UditS

숨길 구성 요소를 결정하는 메커니즘이 있다고 가정하면이 대답은 매우 유용합니다. style = {{width : 0, height : 0}} 인 View로 숨기려는 구성 요소를 모두 래핑 할 수 있습니다.
Josh Baker

6
요소를 원래 너비와 높이로 어떻게 복원합니까?
일부 Juan

4
왜 이것이 다운 피트인지 이해하지 못하지만, 많은 경우에 좋은 조언입니다. 애니메이션 및 비 애니메이션 GIF 간을 전환해야합니다. 조건부 전환 img로 인해 화면에 img가없는 지연이 발생했습니다. 수정의 일부로 두 이미지를 모두 표시하지만 숨겨야하는 사람은 너비와 높이가 0입니다.
mauron85

이렇게하면 구성 요소가 메모리에 유지되므로 큰 구성 요소에 문제가 될 수 있습니다. 위의 위대한 예를 사용하지 않겠습니까? 그들은 구성 요소를 완전히 삽입하고 제거합니다 ...
AS

6

뷰를 표시 / 숨기기하려는 것과 동일한 문제가 있었지만 실제로 항목을 추가 / 제거하거나 다시 렌더링 할 때 UI가 점프하는 것을 원하지 않았습니다.

나는 그것을 처리하기 위해 간단한 구성 요소를 썼다. 기본적으로 애니메이션되지만 전환하기 쉽습니다. 추가 정보와 함께 GitHubNPM 에 넣었 지만 모든 코드는 다음과 같습니다.

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;

좋은 것, 내가 찾던 것 :)
Adamski

이 방법은보기에 수명주기가있는 다른 구성 요소를 배치 할 때 가장 잘 작동하며 적절한보기처럼 작동합니다 ( visible && (...).
dB.

6

추가 옵션은 스타일링을 통해 절대 위치를 적용 하여 숨겨진 구성 요소를 화면 외부 좌표로 설정하는 것입니다.

<TextInput
    onFocus={this.showCancel()}
    onChangeText={(text) => this.doSearch({input: text})}
    style={this.state.hide ? {position: 'absolute', top: -200} : {}}
/>

이전 제안 중 일부와 달리, 이것은 구성 요소를 뷰에서 숨기지 만 뷰를 렌더링하여 (DOM에 유지) 진정으로 보이지 않게 합니다.


2
이 아이디어는 나에게 적합합니다. 감사합니다. 누군가가 필요하다면, 그것도보세요 : gist.github.com/jaysoo/cbb81a07cc22015a72e9
Chaki_Black

5
constructor(props) {
    super(props);
    this.state = {
      visible: true,
}
}

보이는 모달을 선언하므로 기본적으로 모달 /보기는 숨기기

예 = () => {

 this.setState({ visible: !this.state.visible })

}

** 기능 호출 **

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

3

컴포넌트가로드되어 있어야하지만 숨겨져 있어야한다면 불투명도를 0으로 설정할 수 있습니다. (예를 들어 엑스포 카메라에 필요했습니다)

//in constructor    
this.state = {opacity: 100}

/in component
style = {{opacity: this.state.opacity}}

//when you want to hide
this.setState({opacity: 0})


2

다음 예제는 후크를 사용하여 타이프 스크립트로 코딩합니다.

import React, { useState, useEffect } from "react";

........

const App = () => {

   const [showScrollView, setShowScrollView] = useState(false);

   ......

   const onPress = () => {
    // toggle true or false
    setShowScrollView(!showScrollView);
  }

  ......

      </MapboxGL.ShapeSource>
        <View>{showScrollView ? (<DetailsScrollView />) : null}</View>
      </MapboxGL.MapView>
  ......

}

2
// You can use a state to control wether the component is showing or not
const [show, setShow] = useState(false); // By default won't show

// In return(
{
    show && <ComponentName />
}

/* Use this to toggle the state, this could be in a function in the 
main javascript or could be triggered by an onPress */

show == true ? setShow(false) : setShow(true)

// Example:
const triggerComponent = () => {
    show == true ? setShow(false) : setShow(true)
}

// Or
<SomeComponent onPress={() => {show == true ? setShow(false) : setShow(true)}}/>

3
이 코드는 OP 문제를 해결할 수 있지만 코드가 OP 문제를 해결하는 방법에 대한 설명을 포함하는 것이 가장 좋습니다. 이런 식으로, 미래 방문자는 귀하의 게시물에서 배우고 자신의 코드에 적용 할 수 있습니다. SO는 코딩 서비스가 아니라 지식을위한 리소스입니다. 또한 고품질의 완전한 답변이 상향 조정될 가능성이 높습니다. 이러한 기능은 모든 게시물이 자체적으로 포함되어야한다는 요구 사항과 함께 플랫폼으로서 SO의 강점 중 일부이며 포럼과 차별화됩니다. 추가 정보를 추가하거나 소스 문서로 설명을 보충하도록 편집 할 수 있습니다.
ysf

1
업데이트, 조금 더 설명했다. 그것이 도움이되기를 바랍니다!
오예 볼라


0

버튼을 숨기거나 보려면 아래 방법을 사용하고 있습니다. 그것이 당신을 도울 것입니다 바랍니다. 상태를 업데이트하고 숨기기 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>)
}

0

실제로, 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
  }
});

0

유일한 방법은 표시하거나 네이티브 같은 응용 프로그램 상태의 매개 변수의 값을 확인한다 반응의 구성 요소를 숨기 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;

결과는 다음과 같습니다


0

숨기고 싶지만 visibility: hidden구성 요소 스타일의 CSS 설정 과 같이 구성 요소가 차지하는 공간을 유지 opacity: 0하려면 트릭을 수행해야합니다.

구성 요소에 따라 보이지 않는 항목과 상호 작용할 수 있으므로 기능을 비활성화하는 다른 단계가 필요할 수 있습니다.


0

구성 요소 표시 및 숨기기 조건을 사용할 수 있습니다

constructor(){

    super();

    this.state ={

      isVisible:true

    }
  }

  ToggleFunction = () => {

    this.setState(state => ({

      isVisible: !state.isVisible

    }));

  };

  render() {
  
    return (

      <View style={styles.MainContainer}>

      {

        this.state.isVisible ? <Text style= {{ fontSize: 20, color: "red", textAlign: 'center' }}> Hello World! </Text> : null
      }

      <Button title="Toggle Visibility" onPress={this.ToggleFunction} />

      </View>
    );
  }

-2
checkincheckout = () => {
        this.setState({ visible: !this.state.visible })
}

render() {
        return (
{this.state.visible == false ?
        <View style={{ alignItems: 'center', flexDirection: 'row', marginTop: 50 }}>

        <View style={{ flex: 1, alignItems: 'center', flexDirection: 'column' }}>

            <TouchableOpacity onPress={() => this.checkincheckout()}>

                <Text style={{ color: 'white' }}>Click to Check in</Text>

            </TouchableOpacity>

        </View>

    </View>
:
<View style={{ alignItems: 'center', flexDirection: 'row', marginTop: 50 }}>

<View style={{ flex: 1, alignItems: 'center', flexDirection: 'column' }}>

   <TouchableOpacity onPress={() => this.checkincheckout()}>

        <Text style={{ color: 'white' }}>Click to Check out</Text>

    </TouchableOpacity>

</View>

</View>
 }

);
}

그게 다야. 코딩을 즐기십시오 ...

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