Hide/Show React Native 中的组件
Hide/Show components in react native
我是 React Native 的新手,我想知道如何 hide/show 一个组件。
这是我的测试用例:
<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
组件以便 hide/show 它在我的函数中 showCancel/hideCancel
。
另外,如何从一开始就隐藏按钮?
我会这样做:
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()}
);
}
});
非常简单。只需更改为 () => 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>
只需使用
style={ width:0, height:0 } // to hide
在 React 或 React Native 中,组件 hide/show 或 add/remove 的工作方式与 android 或 iOS 不同。我们大多数人认为会有类似的策略
View.hide = true or parentView.addSubView(childView)
但 React Native 工作的方式完全不同。实现这种功能的唯一方法是将您的组件包含在 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
,它实际上是一个函数,它将 return 根据传递给它的布尔值传递给它的组件。
renderIf(predicate)(element)
renderif.js
'use strict';
const isFunction = input => typeof input === 'function';
export default predicate => elemOrThunk =>
predicate ? (isFunction(elemOrThunk) ? elemOrThunk() : elemOrThunk) : null;
我需要在两张图片之间切换。在它们之间有条件地切换时,有 5 秒的延迟,没有显示图像。
我使用的方法来自被否决的 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,
},
});
在你的渲染函数中:
{ this.state.showTheThing &&
<TextInput/>
}
然后就这样做:
this.setState({showTheThing: true}) // to show it
this.setState({showTheThing: false}) // to hide it
在 render() 中,您可以有条件地显示 JSX 或 return null,如:
render(){
return({yourCondition ? <yourComponent /> : null});
}
我有同样的问题,我想显示/隐藏视图,但我真的不希望 UI 在事情 added/removed 时跳来跳去,或者必须处理重新渲染。
我写了一个简单的组件帮我处理。默认动画,但很容易切换。我用自述文件把它放在 GitHub and NPM 上,但所有代码都在下面。
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;
另一个选项是通过样式应用绝对定位,在屏幕外坐标中设置隐藏组件:
<TextInput
onFocus={this.showCancel()}
onChangeText={(text) => this.doSearch({input: text})}
style={this.state.hide ? {position: 'absolute', top: -200} : {}}
/>
与之前的一些建议不同,这会从视图中隐藏您的组件,但也会呈现它(将其保留在 DOM 中),从而使其真正 不可见.
您可以将我的模块 react-native-display 用于 show/hide 组件。
大部分时间我都在做这样的事情:
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() 部分)所以你必须使用这种表示法。
这个小技巧在很多情况下都非常有用,我建议您在开发中使用它,因为您可以快速检查条件。
此致,
编辑:要获得更直接的语法,您可以{this.state.isHidden && <ToHideAndShowComponent/>}
。在这里,左操作数先于右操作数求值,因此如果 isHidden
为假,则组件不会显示。
如果您需要组件保持加载但隐藏,您可以将不透明度设置为 0。(例如,我需要这个用于 expo 相机)
//in constructor
this.state = {opacity: 100}
/in component
style = {{opacity: this.state.opacity}}
//when you want to hide
this.setState({opacity: 0})
隐藏 和 显示 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 Button按下设置状态如下
onSignupPress() {
this.setState({isHidden: true})
}
当你需要隐藏时
this.setState({isHidden: false})
我只是使用下面的方法来隐藏或查看按钮。希望它能帮助你。只需更新状态并添加隐藏 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>)
}
React Native 的布局有 display
属性 支持,类似于 CSS。
可能的值:none
和 flex
(默认值)。
https://facebook.github.io/react-native/docs/layout-props#display
<View style={{display: 'none'}}> </View>
实际上,在 react-native
的 iOS 开发中,当我使用 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
}
});
在 React Native 中显示或隐藏组件的唯一方法是检查应用程序状态参数的值,例如 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;
constructor(props) {
super(props);
this.state = {
visible: true,
}
}
声明 visible false 所以默认模式/视图是隐藏的
示例 = () => {
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>
}
如果你想隐藏它但保持 space 被组件占据,比如 css 的 visibility: hidden
组件样式中的设置 opacity: 0
应该可以解决问题.
根据组件的不同,可能需要其他禁用功能的步骤,因为可以与不可见的项目进行交互。
以下示例是使用 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>
......
}
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>
}
);
}
就是这样。享受你的编码...
// 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)}}/>
您可以使用显示和隐藏组件的条件
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>
);
}
如果您不想从页面中删除组件,我会保证使用不透明度方法,例如隐藏 WebView。
<WebView
style={{opacity: 0}} // Hide component
source={{uri: 'https://www.google.com/'}}
/>
如果您需要向第 3 方网站提交表单,这将非常有用。
我是这样解决这个问题的:
<View style={{ display: stateLoad ? 'none' : undefined }} />
只是简单地使用它,因为我想使用“useRef”条件对我来说不是一个选项。当你想使用 useRef 钩子并按下按钮时,你可以使用这个假设。
<Button
ref={uploadbtn}
buttonStyle={{ width: 0, height: 0, opacity: 0, display: "none" }}
onPress={pickImage}
/>
show\hide组件的三种方式:
- Class分量:/-------------------------------- ---------------------------------------------- --------------------------
在我使用以下状态的所有示例中:
.
...
constructor(props) {
super(props);
this.state = {showComponent: true};
}
1.使用 display
prop
<View display={this.state.showComponent ? 'flex' : 'none'} />
2。使用 display
道具和 style
<View style={{display:this.state.showComponent ? 'flex' : 'none'}} />
3。限制渲染
{
this.state.showComponent &&
<View /> // Or <View> ... </View>
}
- 功能组件:/ ---------------------------------- ---------------------------------------------- ----------------------
在我使用以下状态的所有示例中:
const [showComponent, setShowComponent] = useState(true);
1.使用 display
prop
<View display={showComponent ? 'flex' : 'none'} />
2。使用 display
道具和 style
<View style={{showComponent ? 'flex' : 'none'}} />
3。限制渲染
{
showComponent &&
<View /> // Or <View> ... </View>
}
我们现在有了挂钩,所以我建议重新格式化。使用钩子转动组件on/off.
const [modalVisible, setModalVisible] = setState(false);
然后有一个按钮
<Button title="Press Me" onPress={() => {
setModalVisible(true);
}}
然后,在您的 return 语句中
return(
<View>
{modalVisible &&
Insert modal code in here.
}
</View>
)
我经常用这样的东西
const [setShowComponent, showComponent] = useState(false)
return(
<div>
{showComponent && (<Text>Hello</Text>)}
<Button onPress={() => {setShowComponent(true)}}>Click me</Button>
</div>
)
按下按钮后会显示'Hello'。这称为条件渲染。条件渲染可以参考w3schools
我是 React Native 的新手,我想知道如何 hide/show 一个组件。
这是我的测试用例:
<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
组件以便 hide/show 它在我的函数中 showCancel/hideCancel
。
另外,如何从一开始就隐藏按钮?
我会这样做:
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()}
);
}
});
非常简单。只需更改为 () => 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>
只需使用
style={ width:0, height:0 } // to hide
在 React 或 React Native 中,组件 hide/show 或 add/remove 的工作方式与 android 或 iOS 不同。我们大多数人认为会有类似的策略
View.hide = true or parentView.addSubView(childView)
但 React Native 工作的方式完全不同。实现这种功能的唯一方法是将您的组件包含在 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
,它实际上是一个函数,它将 return 根据传递给它的布尔值传递给它的组件。
renderIf(predicate)(element)
renderif.js
'use strict';
const isFunction = input => typeof input === 'function';
export default predicate => elemOrThunk =>
predicate ? (isFunction(elemOrThunk) ? elemOrThunk() : elemOrThunk) : null;
我需要在两张图片之间切换。在它们之间有条件地切换时,有 5 秒的延迟,没有显示图像。
我使用的方法来自被否决的 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,
},
});
在你的渲染函数中:
{ this.state.showTheThing &&
<TextInput/>
}
然后就这样做:
this.setState({showTheThing: true}) // to show it
this.setState({showTheThing: false}) // to hide it
在 render() 中,您可以有条件地显示 JSX 或 return null,如:
render(){
return({yourCondition ? <yourComponent /> : null});
}
我有同样的问题,我想显示/隐藏视图,但我真的不希望 UI 在事情 added/removed 时跳来跳去,或者必须处理重新渲染。
我写了一个简单的组件帮我处理。默认动画,但很容易切换。我用自述文件把它放在 GitHub and NPM 上,但所有代码都在下面。
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;
另一个选项是通过样式应用绝对定位,在屏幕外坐标中设置隐藏组件:
<TextInput
onFocus={this.showCancel()}
onChangeText={(text) => this.doSearch({input: text})}
style={this.state.hide ? {position: 'absolute', top: -200} : {}}
/>
与之前的一些建议不同,这会从视图中隐藏您的组件,但也会呈现它(将其保留在 DOM 中),从而使其真正 不可见.
您可以将我的模块 react-native-display 用于 show/hide 组件。
大部分时间我都在做这样的事情:
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() 部分)所以你必须使用这种表示法。
这个小技巧在很多情况下都非常有用,我建议您在开发中使用它,因为您可以快速检查条件。
此致,
编辑:要获得更直接的语法,您可以{this.state.isHidden && <ToHideAndShowComponent/>}
。在这里,左操作数先于右操作数求值,因此如果 isHidden
为假,则组件不会显示。
如果您需要组件保持加载但隐藏,您可以将不透明度设置为 0。(例如,我需要这个用于 expo 相机)
//in constructor
this.state = {opacity: 100}
/in component
style = {{opacity: this.state.opacity}}
//when you want to hide
this.setState({opacity: 0})
隐藏 和 显示 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 Button按下设置状态如下
onSignupPress() {
this.setState({isHidden: true})
}
当你需要隐藏时
this.setState({isHidden: false})
我只是使用下面的方法来隐藏或查看按钮。希望它能帮助你。只需更新状态并添加隐藏 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>)
}
React Native 的布局有 display
属性 支持,类似于 CSS。
可能的值:none
和 flex
(默认值)。
https://facebook.github.io/react-native/docs/layout-props#display
<View style={{display: 'none'}}> </View>
实际上,在 react-native
的 iOS 开发中,当我使用 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
}
});
在 React Native 中显示或隐藏组件的唯一方法是检查应用程序状态参数的值,例如 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;
constructor(props) {
super(props);
this.state = {
visible: true,
}
}
声明 visible false 所以默认模式/视图是隐藏的
示例 = () => {
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>
}
如果你想隐藏它但保持 space 被组件占据,比如 css 的 visibility: hidden
组件样式中的设置 opacity: 0
应该可以解决问题.
根据组件的不同,可能需要其他禁用功能的步骤,因为可以与不可见的项目进行交互。
以下示例是使用 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>
......
}
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>
}
);
}
就是这样。享受你的编码...
// 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)}}/>
您可以使用显示和隐藏组件的条件
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>
);
}
如果您不想从页面中删除组件,我会保证使用不透明度方法,例如隐藏 WebView。
<WebView
style={{opacity: 0}} // Hide component
source={{uri: 'https://www.google.com/'}}
/>
如果您需要向第 3 方网站提交表单,这将非常有用。
我是这样解决这个问题的:
<View style={{ display: stateLoad ? 'none' : undefined }} />
只是简单地使用它,因为我想使用“useRef”条件对我来说不是一个选项。当你想使用 useRef 钩子并按下按钮时,你可以使用这个假设。
<Button
ref={uploadbtn}
buttonStyle={{ width: 0, height: 0, opacity: 0, display: "none" }}
onPress={pickImage}
/>
show\hide组件的三种方式:
- Class分量:/-------------------------------- ---------------------------------------------- --------------------------
在我使用以下状态的所有示例中:
.
...
constructor(props) {
super(props);
this.state = {showComponent: true};
}
1.使用 display
prop
<View display={this.state.showComponent ? 'flex' : 'none'} />
2。使用 display
道具和 style
<View style={{display:this.state.showComponent ? 'flex' : 'none'}} />
3。限制渲染
{
this.state.showComponent &&
<View /> // Or <View> ... </View>
}
- 功能组件:/ ---------------------------------- ---------------------------------------------- ----------------------
在我使用以下状态的所有示例中:
const [showComponent, setShowComponent] = useState(true);
1.使用 display
prop
<View display={showComponent ? 'flex' : 'none'} />
2。使用 display
道具和 style
<View style={{showComponent ? 'flex' : 'none'}} />
3。限制渲染
{
showComponent &&
<View /> // Or <View> ... </View>
}
我们现在有了挂钩,所以我建议重新格式化。使用钩子转动组件on/off.
const [modalVisible, setModalVisible] = setState(false);
然后有一个按钮
<Button title="Press Me" onPress={() => {
setModalVisible(true);
}}
然后,在您的 return 语句中
return(
<View>
{modalVisible &&
Insert modal code in here.
}
</View>
)
我经常用这样的东西
const [setShowComponent, showComponent] = useState(false)
return(
<div>
{showComponent && (<Text>Hello</Text>)}
<Button onPress={() => {setShowComponent(true)}}>Click me</Button>
</div>
)
按下按钮后会显示'Hello'。这称为条件渲染。条件渲染可以参考w3schools