详解React 条件渲染


Posted in Javascript onJuly 08, 2020

在 React 中,你可以创建不同的组件来封装各种你需要的行为。然后还可以根据应用的状态变化只渲染其中的一部分。

React 中的条件渲染和 JavaScript 中的一致,使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素,然后让 React 根据它们来更新 UI。

先来看两个组件:

function UserGreeting(props) {
 return <h1>欢迎回来!</h1>;
}

function GuestGreeting(props) {
 return <h1>请先注册。</h1>;
}

我们将创建一个 Greeting 组件,它会根据用户是否登录来显示其中之一:

function Greeting(props) {
 const isLoggedIn = props.isLoggedIn;
 if (isLoggedIn) {
 return <UserGreeting />;
 }
 return <GuestGreeting />;
}
 
ReactDOM.render(
 // 尝试修改 isLoggedIn={true}:
 <Greeting isLoggedIn={false} />,
 document.getElementById('example')
);

元素变量

你可以使用变量来储存元素。它可以帮助你有条件的渲染组件的一部分,而输出的其他部分不会更改。

在下面的例子中,我们将要创建一个名为 LoginControl 的有状态的组件。

它会根据当前的状态来渲染 <LoginButton /><LogoutButton />,它也将渲染前面例子中的 <Greeting />

class LoginControl extends React.Component {
 constructor(props) {
 super(props);
 this.handleLoginClick = this.handleLoginClick.bind(this);
 this.handleLogoutClick = this.handleLogoutClick.bind(this);
 this.state = {isLoggedIn: false};
 }
 
 handleLoginClick() {
 this.setState({isLoggedIn: true});
 }
 
 handleLogoutClick() {
 this.setState({isLoggedIn: false});
 }
 
 render() {
 const isLoggedIn = this.state.isLoggedIn;
 
 let button = null;
 if (isLoggedIn) {
  button = <LogoutButton onClick={this.handleLogoutClick} />;
 } else {
  button = <LoginButton onClick={this.handleLoginClick} />;
 }
 
 return (
  <div>
  <Greeting isLoggedIn={isLoggedIn} />
  {button}
  </div>
 );
 }
}
 
ReactDOM.render(
 <LoginControl />,
 document.getElementById('example')
);

与运算符 &&

你可以通过用花括号包裹代码在 JSX 中嵌入任何表达式 ,也包括 JavaScript 的逻辑与 &&,它可以方便地条件渲染一个元素。

function Mailbox(props) {
 const unreadMessages = props.unreadMessages;
 return (
 <div>
  <h1>Hello!</h1>
  {unreadMessages.length > 0 &&
  <h2>
   您有 {unreadMessages.length} 条未读信息。
  </h2>
  }
 </div>
 );
}
 
const messages = ['React', 'Re: React', 'Re:Re: React'];
ReactDOM.render(
 <Mailbox unreadMessages={messages} />,
 document.getElementById('example')
);

在 JavaScript 中,true && expression 总是返回 expression,而 false && expression 总是返回 false。

因此,如果条件是 true,&& 右侧的元素就会被渲染,如果是 false,React 会忽略并跳过它。

三目运算符

条件渲染的另一种方法是使用 JavaScript 的条件运算符:

condition ? true : false。

在下面的例子中,我们用它来有条件的渲染一小段文本。

render() { const isLoggedIn = this.state.isLoggedIn; return (
The user is {isLoggedIn ? 'currently' : 'not'} logged in.
); }

同样它也可以用在较大的表达式中,虽然不太直观:

render() {
 const isLoggedIn = this.state.isLoggedIn;
 return (
 <div>
  {isLoggedIn ? (
  <LogoutButton onClick={this.handleLogoutClick} />
  ) : (
  <LoginButton onClick={this.handleLoginClick} />
  )}
 </div>
 );
}

阻止组件渲染

在极少数情况下,你可能希望隐藏组件,即使它被其他组件渲染。让 render 方法返回 null 而不是它的渲染结果即可实现。

在下面的例子中,<WarningBanner /> 根据属性 warn 的值条件渲染。如果 warn 的值是 false,则组件不会渲染:

function WarningBanner(props) {
 if (!props.warn) {
 return null;
 }
 
 return (
 <div className="warning">
  警告!
 </div>
 );
}
 
class Page extends React.Component {
 constructor(props) {
 super(props);
 this.state = {showWarning: true}
 this.handleToggleClick = this.handleToggleClick.bind(this);
 }
 
 handleToggleClick() {
 this.setState(prevState => ({
  showWarning: !prevState.showWarning
 }));
 }
 
 render() {
 return (
  <div>
  <WarningBanner warn={this.state.showWarning} />
  <button onClick={this.handleToggleClick}>
   {this.state.showWarning ? '隐藏' : '显示'}
  </button>
  </div>
 );
 }
}
 
ReactDOM.render(
 <Page />,
 document.getElementById('example')
);

组件的 render 方法返回 null 并不会影响该组件生命周期方法的回调。例如,componentWillUpdate 和 componentDidUpdate 依然可以被调用。

以上就是详解React 条件渲染的详细内容,更多关于React 条件渲染的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript运行机制之this详细介绍
Feb 07 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 Javascript
AngularJS之自定义服务详解(factory、service、provider)
Apr 14 Javascript
Jquery-data的三种用法
Apr 18 jQuery
详解用vue编写弹出框组件
Jul 04 Javascript
layui实现table加载的示例代码
Aug 14 Javascript
VUE实现可随意拖动的弹窗组件
Sep 25 Javascript
Vue slot用法(小结)
Oct 22 Javascript
在微信小程序中使用vant的方法
Jun 07 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
Jul 19 Javascript
ES6中Set和Map用法实例详解
Mar 02 Javascript
在Vuex中Mutations修改状态操作
Jul 24 Javascript
webpack5 联邦模块介绍详解
Jul 08 #Javascript
实例讲解React 组件
Jul 07 #Javascript
JavaScript eval()函数定义及使用方法详解
Jul 07 #Javascript
详解React 元素渲染
Jul 07 #Javascript
JS数据类型判断的几种常用方法
Jul 07 #Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 #Javascript
jQuery 实现扁平式小清新导航
Jul 07 #jQuery
You might like
php中日期加减法运算实现代码
2011/12/08 PHP
PHP的博客ping服务代码
2012/02/04 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
Python中的zip函数使用示例
2015/01/29 Python
Python 如何在字符串中插入变量
2020/08/01 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
英国Amara家居法国网站:家居装饰,现代装饰和豪华礼品
2016/12/15 全球购物
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
库房主管岗位职责
2013/12/31 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
网页美工求职信范文
2014/04/17 职场文书
梅花魂教学反思
2014/04/25 职场文书
投标服务承诺书
2014/05/28 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
成绩单家长意见
2015/06/03 职场文书
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis