事件处理

  • React事件绑定属性的命名采用驼峰式写法,而不是小写。
  • 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法)

例如,传统的 HTML:

  1. <button onclick="activateLasers()">
  2. Activate Lasers
  3. </button>

React 中稍稍有点不同:

  1. <button onClick={activateLasers}>
  2. Activate Lasers
  3. </button>

在 React 中另一个不同是你不能使用返回 false 的方式阻止默认行为。你必须明确的使用 preventDefault

事件处理this

你必须谨慎对待 JSX 回调函数中的 this,类的方法默认是不会绑定 this 的。如果你忘记绑定 this.handleClick 并把它传入 onClick, 当你调用这个函数的时候 this 的值会是 undefined

1. 自动绑定this

  1. // This binding is necessary to make `this` work in the callback
  2. this.handleClick = this.handleClick.bind(this);

2. 如果使用 bind 让你很烦,这里有两种方式可以解决。如果你正在使用实验性的属性初始化器语法,你可以使用属性初始化器来正确的绑定回调函数(声明为匿名函数):

  1. handleClick = () => {
  2. console.log('this is:', this);
  3. }

3. 如果你没有使用属性初始化器语法,你可以在回调函数中使用 箭头函数

  1. class LoggingButton extends React.Component {
  2. handleClick() {
  3. console.log('this is:', this);
  4. }
  5.  
  6. render() {
  7. // This syntax ensures `this` is bound within handleClick
  8. return (
  9. <button onClick={(e) => this.handleClick(e)}>
  10. Click me
  11. </button>
  12. );
  13. }
  14. }

使用这个语法有个问题就是每次 LoggingButton 渲染的时候都会创建一个不同的回调函数。在大多数情况下,这没有问题。然而如果这个回调函数作为一个属性值传入低阶组件,这些组件可能会进行额外的重新渲染。我们通常建议在构造函数中绑定或使用属性初始化器语法来避免这类性能问题。

条件渲染

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

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

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

  1. function Greeting(props) {
  2. const isLoggedIn = props.isLoggedIn;
  3. if (isLoggedIn) {
  4. return <UserGreeting />;
  5. }
  6. return <GuestGreeting />;
  7. }
  8.  
  9. ReactDOM.render(
  10. // Try changing to isLoggedIn={true}:
  11. <Greeting isLoggedIn={false} />,
  12. document.getElementById('root')
  13. );

与运算符 &&

  1. 你可以通过用花括号包裹代码在 JSX 中嵌入任何表达式 ,也包括 JavaScript 的逻辑与 &&,它可以方便地条件渲染一个元素。
  2.  
  3. function Mailbox(props) {
  4. const unreadMessages = props.unreadMessages;
  5. return (
  6. <div>
  7. <h1>Hello!</h1>
  8. {unreadMessages.length > 0 &&
  9. <h2>
  10. You have {unreadMessages.length} unread messages.
  11. </h2>
  12. }
  13. </div>
  14. );
  15. }
  16.  
  17. const messages = ['React', 'Re: React', 'Re:Re: React'];
  18. ReactDOM.render(
  19. <Mailbox unreadMessages={messages} />,
  20. document.getElementById('root')
  21. );

在 CodePen 上试试。

之所以能这样做,是因为在 JavaScript 中,true && expression 总是返回 expression,而 false && expression 总是返回 false

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

阻止组件渲染

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

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

  1. function WarningBanner(props) {
  2. if (!props.warn) {
  3. return null;
  4. }
  5.  
  6. return (
  7. <div className="warning">
  8. Warning!
  9. </div>
  10. );
  11. }
  12.  
  13. class Page extends React.Component {
  14. constructor(props) {
  15. super(props);
  16. this.state = {showWarning: true}
  17. this.handleToggleClick = this.handleToggleClick.bind(this);
  18. }
  19.  
  20. handleToggleClick() {
  21. this.setState(prevState => ({
  22. showWarning: !prevState.showWarning
  23. }));
  24. }
  25.  
  26. render() {
  27. return (
  28. <div>
  29. <WarningBanner warn={this.state.showWarning} />
  30. <button onClick={this.handleToggleClick}>
  31. {this.state.showWarning ? 'Hide' : 'Show'}
  32. </button>
  33. </div>
  34. );
  35. }
  36. }
  37.  
  38. ReactDOM.render(
  39. <Page />,
  40. document.getElementById('root')
  41. );

在 CodePen 上试试。

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

react基础篇三的更多相关文章

  1. NIO相关基础篇三

    转载请注明原创出处,谢谢! 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相关话题内容,主要谈谈一些Linux 网络 I/O模型.零拷贝等一些内容, ...

  2. docker+k8s基础篇三

    Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...

  3. Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理

    本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...

  4. Python基础篇(三)_函数及代码复用

    Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...

  5. react 基础篇 #2 create-react-app

    1. 介绍 在开发react应用时,应该没有人用传统的方法引入react的源文件(js),然后在html编辑吧. 大家都是用webpack + es6来结合react开发前端应用. 这个时候,我们可以 ...

  6. [react 基础篇]——React.createClass()方法同时创建多个组件类

    react 组件 React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 一个组 ...

  7. react基础学习 三

    获取原生的DOM 注意:获取DOM是要在组件渲染之后才能被获取,所以在constructor里面获取不到原生的DOM 方法一:回调函数   推荐 方法二:createRef()   16版本,推荐 方 ...

  8. React基础篇 (3)-- 生命周期

    生命周期是react中的重要部分,理解它有助于我们更合理的书写逻辑. 组件的生命周期可分成三个状态: Mounting:已插入真实 DOM Updating:正在被重新渲染 Unmounting:已移 ...

  9. React基础篇 (1)-- render&components

    render 基础用法 //1.创建虚拟DOM元素对象 var vDom=<h1>hello wold!</h1> //2.渲染 ReactDOM.render(vDom,do ...

随机推荐

  1. Git学习总结(3)——代码托管平台简介

    可以说GitHub的出现完全颠覆了以往大家对代码托管网站的认识.GitHub不但是一个代码托管网站,更是一个程序员的SNS社区.GitHub真正迷人的是它的创新能力与Geek精神,这些都是无法模仿的. ...

  2. Linux轻松一下——cowsay命令,让动物说话

    Linux动物说话命令 使用方法 安装命令:sudo apt-get install cowsay 使用命令:cowsay hello 查看可选动物 cowsay -l 使用其他动物 cowsay - ...

  3. Mac OSX:安装zsh

    想在mac下安装oh my zsh,按照https://github.com/robbyrussell/oh-my-zsh上的文档,执行下面这条命令安装:curl -L http://install. ...

  4. Java修改文件夹名称

    Java修改文件夹名称 学习了:http://blog.csdn.net/yongh701/article/details/45063833 进行文件夹名字批量修改,注意,要写全路径: package ...

  5. Window下UDP(socket)接和收数据案例

     配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\ ...

  6. hadoop常见操作命令

    1.查看指定文件夹下内容 hadoop dfs –ls [文件文件夹] eg: hadoop dfs –ls /user/wangkai.pt 2.打开某个已存在文件 hadoop dfs –cat ...

  7. discuz新的单点论坛(不依赖UCenter)

    discuz 本身提供UCENTER用户中心能够实现单点登录. 可是其它应用要单点登录到discuz还是存在若干问题: 须要2次激活.可能造成server无响应,论坛显示的最新注冊用户无法同步更新,官 ...

  8. vue组件的一个总结

    用vue进行开发到目前为止也有将近一年的时间了,在项目技术选型的时候隔壁组选 react的时候我们坚持使用vue作为前端的开发框架.虽然两者思想上的差异不大,但是vue的语法在代码的可读性以及后期的维 ...

  9. 【iOS开发系列】NSObject方法介绍

    NSObject是OC中的基类,全部类都继承于此,这里面也给我们提供了非常多与"类"和"方法"相关的方法,本文将解说几个非常有用的方法. 正文: Person. ...

  10. Qt为啥从4.8直接就跳到5.3了呢?这不科学吧

    http://qt-project.org/downloads Qt 5.3 Select the file according to your operating system from the l ...