事件处理

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

例如,传统的 HTML:

<button onclick="activateLasers()">
Activate Lasers
</button>

React 中稍稍有点不同:

<button onClick={activateLasers}>
Activate Lasers
</button>

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

事件处理this

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

1. 自动绑定this

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

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

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

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

class LoggingButton extends React.Component {
handleClick() {
console.log('this is:', this);
} render() {
// This syntax ensures `this` is bound within handleClick
return (
<button onClick={(e) => this.handleClick(e)}>
Click me
</button>
);
}
}

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

条件渲染

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

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

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

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

与运算符 &&

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

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

在 CodePen 上试试。

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

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

阻止组件渲染

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

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

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

在 CodePen 上试试。

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

最新文章

  1. datatable刷新表头
  2. Ionic2学习笔记(2):自定义Component
  3. spring mvc 4数据校验 validator
  4. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭
  5. c# Invoke和BeginInvoke 区别
  6. sql优化-隐形转换危害
  7. 有关按位DP
  8. Uninstall Tool 3.3.2.5315 简体中文注册版(彻底卸载软件)
  9. MVC4 EF linq从客户端中检测到有潜在的危险的Request.Path值
  10. 设置checkbox为只读(readOnly)
  11. Spring第一个例子的补充
  12. ArcGIS API for JavaScript 4.2学习笔记[23] 没有地图如何进行查询?【FindTask类的使用】
  13. angular4.0路由传递参数、获取参数最nice的写法
  14. Java Spring boot 2.0 跨域问题
  15. 补习系列(11)-springboot 文件上传原理
  16. windows cannot find powershell.exe windows 7
  17. mock.js的使用
  18. 升级后重启造成fsck.ext3: Unable to resolve UUID
  19. 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
  20. 回去看linux的指令

热门文章

  1. 【codeforces 796B】Find The Bone
  2. noip模拟赛 希望
  3. 清北学堂模拟赛d3t2 b
  4. 实现selenium+Chrome爬取时不加载图片——配置
  5. node.js 如何完美的从命令行接收参数所传递进来的值
  6. AspNet MVC4 教学-27:Asp.Net MVC4 自己定义helper及function的高速Demo
  7. [ACM] POJ 3295 Tautology (构造)
  8. 小米红米1S 电信/联通版 专用TWRP2.8.1.1中文版 (全屏触摸/支持MTP挂载内外置存储)
  9. 通过buildpath 导入jar和在lib下导入的jar包区别
  10. java电影站点开发经验3