详解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 相关文章推荐
JQuery实现自定义对话框的代码
Jun 15 Javascript
Function.prototype.bind用法示例
Sep 16 Javascript
jquery监听div内容的变化具体实现思路
Nov 04 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
Mar 05 Javascript
javascript 中that的含义示例介绍
May 14 Javascript
原生js实现日期联动
Jan 12 Javascript
JS模拟并美化的表单控件完整实例
Aug 19 Javascript
JS库之ParticlesJS使用简介
Sep 12 Javascript
Vue基于NUXT的SSR详解
Oct 24 Javascript
jQuery常见的遍历DOM操作详解
Sep 05 jQuery
Vue 组件参数校验与非props特性的方法
Feb 12 Javascript
js实现数字滚动特效
Dec 16 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结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
python 列表删除所有指定元素的方法
2018/04/19 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
Python 实现微信防撤回功能
2019/04/29 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
Django框架反向解析操作详解
2019/11/28 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
英语专业毕业生自荐信
2013/10/28 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
社区交通安全实施方案
2014/03/22 职场文书
师德师风个人反思
2014/04/28 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
MySQL的索引你了解吗
2022/03/13 MySQL