React学习笔记之条件渲染(一)


Posted in Javascript onJuly 02, 2017

前言

在React中,你可以创建不同的组件各自封装你需要的东西。之后你可以只渲染其中的一部分,这取决于应用的state(状态)。下面就来看看详细的介绍:

条件渲染

可以根据state的值进行组件的条件渲染。例如:

function Greeting(props) { 
 const isLoggedIn = props.isLoggedIn;
 if (isLoggedIn) {
 return <UserGreeting />;
 }
 return <GuestGreeting />;
}

ReactDOM.render( 
 // Try changing to isLoggedIn={true}:
 <Greeting isLoggedIn={false} />,
 document.getElementById('root')
);

你还可以用变量去存储组件,以便进行条件筛选,使得渲染函数的返回值更加清爽,例如:

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('root')
);

还可以使用短操作符来实现条件筛选,可以用更短的代码写出渲染结果。例如&&来替代if,?:来替代if else, 例如:

function Mailbox(props) { 
 const unreadMessages = props.unreadMessages;
 return (
 <div>
 <h1>Hello!</h1>
 {unreadMessages.length > 0 &&
 <h2>
  You have {unreadMessages.length} unread messages.
 </h2>
 }
 </div>
 );
}

const messages = ['React', 'Re: React', 'Re:Re: React']; 
ReactDOM.render( 
 <Mailbox unreadMessages={messages} />,
 document.getElementById('root')
);
render() { 
 const isLoggedIn = this.state.isLoggedIn;
 return (
 <div>
 The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
 </div>
 );
}

这种跟更大的表达式的写法也可以,但是不推荐,因为代码就不是很直观了。

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

如果组件有时候需要渲染出来,而有时候不需要渲染出来,在不需要渲染的时候返回null即可。例如:

function WarningBanner(props) { 
 if (!props.warn) {
 return null;
 }

 return (
 <div className="warning">
 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 ? 'Hide' : 'Show'}
 </button>
 </div>
 );
 }
}

ReactDOM.render( 
 <Page />,
 document.getElementById('root')
);

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
自动生成文章摘要的代码[JavaScript 版本]
Mar 20 Javascript
直接生成打开窗口代码,不必下载
May 14 Javascript
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
Nov 06 Javascript
javascript 当前日期转化为中文的实现代码
May 13 Javascript
用js来解决ajax读取页面乱码
Nov 28 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
深入理解JavaScript函数参数(推荐)
Jul 26 Javascript
详解vue.js的devtools安装
May 26 Javascript
AnglarJs中的上拉加载实现代码
Feb 08 Javascript
解决Mac node版本升级失败的问题
May 16 Javascript
layer.confirm()右边按钮实现href的例子
Sep 27 Javascript
原生js实现轮播图特效
May 04 Javascript
vue.js学习之vue-cli定制脚手架详解
Jul 02 #Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
Jul 02 #Javascript
关于使用axios的一些心得技巧分享
Jul 02 #Javascript
React服务端渲染(总结)
Jul 01 #Javascript
Express + Node.js实现登录拦截器的实例代码
Jul 01 #Javascript
详解node-ccap模块生成captcha验证码
Jul 01 #Javascript
vue元素实现动画过渡效果
Jul 01 #Javascript
You might like
Ajax PHP分页演示
2007/01/02 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
详解json在php中的应用
2018/09/30 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Python输出9*9乘法表的方法
2015/05/25 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
python匿名函数用法实例分析
2019/08/03 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
德国机车企业:FC-Moto
2017/10/27 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
opencv实现图像平移效果
2021/03/24 Python
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
科技活动周标语
2014/10/08 职场文书
小学四年级学生评语
2014/12/26 职场文书