ซ่อน / แสดงองค์ประกอบในการตอบสนองพื้นเมือง


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 />}และจะแสดงก็ต่อเมื่อค่าบูลเป็นจริง
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 - Douglas 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

ในตัวอย่างนี้ฉันจะตั้งค่าการแสดงผลของมุมมองข้อความตามการคลิกปุ่ม

ป้อนคำอธิบายรูปภาพที่นี่

แนวคิดเบื้องหลังภารกิจนี้คือการสร้างตัวแปรสถานะที่เรียกว่าสถานะที่มีค่าเริ่มต้นตั้งค่าเป็นเท็จเมื่อเหตุการณ์การคลิกปุ่มเกิดขึ้นจากนั้นค่าจะสลับ ตอนนี้เราจะใช้ตัวแปรสถานะนี้ในระหว่างการสร้างองค์ประกอบ

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;

Clever :) กรณีการใช้งานของ thunk คืออะไร
goldylucks

ฮ่าฮ่า ยอดเยี่ยม!
Jaseem Abbas

โซลูชันนี้เหมาะสมสำหรับกรณีการใช้งานที่กล่องโต้ตอบต้องการให้แสดงผลเมื่อจำเป็นเท่านั้น ไท!
SoundStage

2
สิ่งนี้จะไม่ทำงานหากคุณต้องการรักษาสถานะเอาองค์ประกอบการรีเซ็ตสถานะของเขา ดังนั้นทุกครั้งที่คุณแสดงอีกครั้งก็เหมือนว่าคุณสร้างองค์ประกอบอีกครั้ง
Daniel Jose Padilla Peña


20

ในการแสดงผล () คุณสามารถแสดง JSX ตามเงื่อนไขหรือส่งคืน null ได้ใน:

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

3
ควรใส่วงเล็บในบรรทัดที่ 2
jiexishede

ขอบคุณสำหรับวิธีแก้ปัญหาที่ง่ายที่สุด
Sam

13

ฉันต้องการสลับไปมาระหว่างสองภาพ ด้วยการสลับเงื่อนไขระหว่างพวกเขามีความล่าช้า 5 วินาทีโดยไม่มีภาพปรากฏขึ้น

ฉันใช้วิธีการจากคำตอบ amv downvoted การโพสต์เป็นคำตอบใหม่เพราะเป็นการยากที่จะใส่รหัสลงในความคิดเห็นด้วยการจัดรูปแบบที่เหมาะสม

ฟังก์ชั่นการแสดงผล:

<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


สิ่งนี้ทำให้ส่วนประกอบในหน่วยความจำซึ่งอาจมีปัญหากับส่วนประกอบขนาดใหญ่ ทำไมไม่ใช้ตัวอย่างที่ดีข้างต้น พวกเขาจะแทรกรูปภาพที่ถูกต้องและลบอีกอันอย่างสมบูรณ์ ...
AS

4
ตัวอย่างเหล่านี้ทำงานไม่ถูกต้องเมื่อคุณพยายามสร้างสปินเนอร์เคลื่อนไหว เช่นเดียวกับที่ฉันพูดถึงแล้วในคำตอบของฉันเกี่ยวกับ Android ที่พยายามเปลี่ยน img สำหรับแอนนิม gif จะทำให้ 5s ล่าช้าหากไม่มีการแสดง png หรือ gif ฉันเชื่อว่าความล่าช้าเกิดจากการโหลด 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;
}

แต่คุณไม่สามารถเขียนเงื่อนไข if / else ในเนื้อหา JSX (เช่น 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>
   );
}

บนปุ่มกดตั้งค่าสถานะดังนี้

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

เมื่อคุณต้องซ่อน

this.setState({isHidden: false})

11

รูปแบบของ Native React ได้รับdisplayการสนับสนุนคุณสมบัติคล้ายกับ CSS ค่าที่เป็นไปได้: noneและflex(ค่าเริ่มต้น) https://facebook.github.io/react-native/docs/layout-props#display

<View style={{display: 'none'}}> </View>

2
ระวังอย่าใช้กับposition: absoluteมันมันไม่ได้ซ่อนมันจริงๆ! ข้อบกพร่องที่รู้จักจาก 0.54 - 0.59 (อย่างน้อย): github.com/facebook/react-native/issues/18415
Joshua Pinter

10

เพียงแค่ใช้

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

4
มันจะมีประโยชน์ถ้าคุณเพิ่มบริบท / รายละเอียดลงในคำตอบ
UditS

สมมติว่าคุณมีกลไกในการตัดสินใจว่าจะซ่อนองค์ประกอบใดคำตอบนี้ค่อนข้างมีประโยชน์ คุณสามารถปิดส่วนประกอบใด ๆ ที่คุณพยายามซ่อนด้วย View with style = {{width: 0, height: 0}}
Josh Baker

6
คุณจะคืนองค์ประกอบให้เป็นความกว้างและความสูงเดิมได้อย่างไร
บาง Juan

4
ไม่เข้าใจว่าทำไม downvote นี้ แต่ในหลาย ๆ กรณีมันเป็นคำแนะนำที่ดี ฉันต้องการสลับไปมาระหว่างภาพเคลื่อนไหวและภาพเคลื่อนไหวที่ไม่เคลื่อนไหว การสลับแบบมีเงื่อนไข img ทำให้เกิดความล่าช้าโดยไม่มี img ที่หน้าจอ ในฐานะที่เป็นส่วนหนึ่งของการแก้ไขฉันกำลังแสดงทั้ง img แต่ผู้ที่ควรถูกซ่อนมีความกว้างและความสูงเป็นศูนย์
mauron85

สิ่งนี้จะช่วยรักษาองค์ประกอบในหน่วยความจำซึ่งอาจเป็นปัญหากับส่วนประกอบขนาดใหญ่ ทำไมไม่ใช้ตัวอย่างที่ดีข้างต้น พวกเขาแทรกและลบองค์ประกอบอย่างสมบูรณ์ ...
AS

6

ฉันมีปัญหาเดียวกันกับที่ฉันต้องการแสดง / ซ่อน Views แต่ฉันไม่ต้องการให้ UI กระโดดไปมาเมื่อมีการเพิ่ม / ลบหรือจำเป็นต้องจัดการกับการแสดงผลซ้ำ

ฉันเขียนชิ้นส่วนง่าย ๆ เพื่อจัดการกับมันให้ฉัน เคลื่อนไหวตามค่าเริ่มต้น แต่สลับได้ง่าย ฉันวางไว้บน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;

เป็นคนที่ดีสิ่งที่ฉันกำลังมองหา :)
Adamski

นี้ทำงานได้ดีและพฤติกรรมเช่นมุมมองที่เหมาะสมเมื่อคุณใส่ส่วนประกอบอื่น ๆ ที่มีวงจรชีวิตที่อยู่ภายในมุมมอง (ซึ่งไม่ได้ทำงานกับvisible && (...).
เดซิเบล.

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

ประกาศเท็จที่มองเห็นได้ดังนั้นโดย modal / view เริ่มต้นจะซ่อน

ตัวอย่าง = () => {

 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

ตัวอย่างต่อไปนี้คือการเข้ารหัสใน typescript ด้วย hooks

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 ในฐานะแพลตฟอร์มที่แตกต่างจากฟอรัม คุณสามารถแก้ไขเพื่อเพิ่มข้อมูลเพิ่มเติม & / หรือเสริมคำอธิบายของคุณด้วยเอกสารต้นฉบับ
ysf

1
อัปเดตอธิบายอีกเล็กน้อย หวังว่ามันจะช่วย!
Oyebola

0

ง่ายมาก. เพียงเปลี่ยนเป็น () => 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>


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 ไม่โหลดสิ่งอื่นใดขององค์ประกอบภาพเช่น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.