jsx 中的 if-else 语句:ReactJS

IT技术 javascript reactjs react-native
2021-01-29 20:46:07

我需要更改渲染函数并在给定特定状态时运行一些子渲染函数,

例如:

render() {
    return (   
        <View style={styles.container}>
            if (this.state == 'news'){
                return (
                    <Text>data</Text>
                )
            }
        </View>
    )
}

如何在不改变场景的情况下实现这一点,我将使用选项卡动态更改内容。

6个回答

根据DOC

if-else 语句在 JSX 中不起作用。这是因为 JSX 只是函数调用和对象构造的语法糖。

基本规则:

JSX 基本上是语法糖编译后,JSX 表达式成为常规 JavaScript 函数调用并评估为 JavaScript 对象。我们可以通过用花括号将任何JavaScript 表达式嵌入到 JSX 中。

但是只有表达式而不是语句,这意味着我们不能直接JSX 中放置任何语句(if-else/switch/for


如果要有条件地呈现元素,请使用ternary operator,如下所示:

render() {
    return (   
        <View style={styles.container}>
            {this.state.value == 'news'? <Text>data</Text>: null }
        </View>
    )
}

另一种选择是,调用一个函数jsx并将所有if-else逻辑放入其中,如下所示:

renderElement(){
   if(this.state.value == 'news')
      return <Text>data</Text>;
   return null;
}

render() {
    return (   
        <View style={styles.container}>
            { this.renderElement() }
        </View>
    )
}
` <Text style={styles.instructions}> { if (this.state.page == 'sohbet'){ } ` 不可能?} </文本>
2021-03-13 20:46:07
我可以这样做吗?render() { return ( <View style={styles.container}> if (this.state == 'news'){ return ( <Text>data</Text> ) }
2021-03-18 20:46:07
所以返回内部返回是可能的吗?或同一渲染函数场景中的两个不同返回我需要更改返回的子内容
2021-03-18 20:46:07
这在文档中有很好的解释,请检查原因:reactjs.cn/react/tips/if-else-in-JSX.html
2021-04-02 20:46:07
是的,这是可能的,但是,以不同的方式直接我们不能在 JSX 中使用 if/else,所以使用三元运算符作为条件,使用这个: render() { return ( <View style={styles.container}> {this.state == 'news' ? <Text>data</Text> : null } </View> ) }
2021-04-08 20:46:07

您可以通过使用立即调用函数表达式 (IIFE) 来实现您所说的

render() {
    return (   
        <View style={styles.container}>
            {(() => {
              if (this.state == 'news'){
                  return (
                      <Text>data</Text>
                  )
              }
              
              return null;
            })()}
        </View>
    )
}

这是工作示例:

编辑 awesome-yalow-eb2nu

但是,就您而言,您可以坚持使用三元运算符

@Yusufbek 你能帮我为什么在这部分" if (this.state == 'news'){ return (<div><Text> data1</Text> <Text>data2</Text></siv> ) } “不起作用
2021-03-11 20:46:07
您可以通过切换到 Vue 来获得更直观的解决方案。令人难以置信的是,必须对如此基本的东西进行这样的黑客攻击。
2021-03-13 20:46:07
意思是在上面的返回中我们使用 div 来表示多个元素 2 文本
2021-03-27 20:46:07
@AakashMathur 它应该可以工作。确保您只返回 1 个根元素,并且您有 else 语句返回 null
2021-04-08 20:46:07

我发现这种方式是最好的:

{this.state.yourVariable === 'news' && <Text>{data}<Text/>}
这在我的情况下对我有帮助,但是,我必须将元素包装在 <>...</> 中。
2021-03-17 20:46:07
我怎么能在我的情况下使用它?如果我像这样使用它,{localStorage.getItem('token') && <Typography>Invalid Login</Typography>}它甚至会在提交表单之前呈现。 stackoverflow.com/questions/60577971/...
2021-03-20 20:46:07
这应该添加到主要答案中。
2021-03-31 20:46:07
我同意,这是最好的一群。null用三元运算符返回是不必要的;)
2021-04-01 20:46:07

我喜欢这个并且它工作正常。

constructor() {
   super();

   this.state ={
     status:true
   }
}

render() {
   return( 

     { this.state.status === true ?
           <TouchableHighlight onPress={()=>this.hideView()}>
             <View style={styles.optionView}>
               <Text>Ok Fine :)</Text>
             </View>
          </TouchableHighlight>
           :
           <Text>Ok Fine.</Text>
     }
  );
}

hideView(){
  this.setState({
    home:!this.state.status
  });
}
@Pierre.Vriens 您可以在 render() 方法中使用三元运算符而不是 if-else。语法:-条件?expr1 : expr2 if (this.state.status === true) { } else { }
2021-03-12 20:46:07

你可以这样做。只是不要忘记在您的 JSX 组件之前放置“返回”。

例子:

render() {
    if(this.state.page === 'news') {
        return <Text>This is news page</Text>;
    } else {
        return <Text>This is another page</Text>;
    }
}

从互联网获取数据的示例:

import React, { Component } from 'react';
import {
    View,
    Text
} from 'react-native';

export default class Test extends Component {
    constructor(props) {
        super(props);

        this.state = {
            bodyText: ''
        }
    }

    fetchData() {
        fetch('https://example.com').then((resp) => {
            this.setState({
                bodyText: resp._bodyText
            });
        });
    }

    componentDidMount() {
        this.fetchData();
    }

    render() {
        return <View style={{ flex: 1 }}>
            <Text>{this.state.bodyText}</Text>
        </View>
    }
}
@user8026867 您可以创建一个函数并在那里返回 JSX 组件。试试看你能不能成功,否则我给你举个例子。
2021-03-11 20:46:07
你能告诉我一个完整的工作示例吗抱歉我是新手
2021-03-18 20:46:07
警报工作正常,但在 .then 之后不会发生渲染,我该怎么做 pulldata() { RNFetchBlob.fetch('GET', ' bigcom ', { }) .then ((res) => { alert(res.text() ); return <Text>{res.text()}</Text> }) .catch((errorMessage, statusCode) => { alert(errorMessage); }) }
2021-03-29 20:46:07
添加了@user8026867 示例
2021-04-05 20:46:07
我想从函数内部返回
2021-04-06 20:46:07