react中的一些细节知识点:

1、组件中get的使用(作为类的getter)

ES6知识:class类也有自己的getter和setter,写法如下:

Class Component {
constructor() {
super()
this.name = ''
} // name的getter
get name() {
...
} // name的setter
set name(value) {
...
}
}

react组件中的get的使用如下:

/*
* renderFullName的getter
* 可以直接在render中使用this.renderFullName
*/ get renderFullName () {
return `${this.props.firstName} ${this.props.lastName}`;
} render() {
return (
<div>{this.renderFullName}</div>
)
}

那getter在react组件中有什么用处呢??

constructor (props) {
super()
this.state = {};
} render () {
// 常规写法,在render中直接计算
var fullName = `${this.props.firstName} ${this.props.lastName}`; return (
<div>
<h2>{fullName}</h2>
</div>
);
}
// 较为优雅的写法:,减少render函数的臃肿
renderFullName () {
return `${this.props.firstName} ${this.props.lastName}`;
} render () {
var fullName = this.renderFullName()
  <div>{ fullName }</div>
}
// 推荐的做法:通过getter而不是函数形式,减少变量
get renderFullName () {
return `${this.props.firstName} ${this.props.lastName}`;
} render () {
<div>{ this.renderFullName }</div>
}

如果你了解Vue的话,那么你知道其中的 computed: {}  计算属性,它的底层也是使用了getter,只不过是对象的getter不是类的getter

// 计算属性,计算renderFullName
computed: {
renderFullName: () => {
return `${this.firstName} ${this.lastName}`;
}
}

Vue的computed有一个优势就是:

计算属性对比函数执行:会有缓存,减少计算 --->   计算属性只有在它的相关依赖发生改变时才会重新求值。

这就意味着只要 firstName和lastName还没有发生改变,多次访问renderFullName计算属性会立即返回之前的计算结果,而不必再次执行函数。

那么是否react的getter也有缓存这个优势吗???   答案是:没有,react中的getter并没有做缓存优化

2、组件的attr及事件执行顺序:

  A、父子组件:以props形式,父传递给子

  B、同一组件:后面覆盖前面。

依靠上述规则,那么要使得 attr 的权重最高,应该放到最底层的组件中,而且位置尽量的靠后。

<-- 父组件Parent | 调用子组件并传递onChange属性 -->
<div>
<Child onChange={this.handleParentChange} />
</div> <-- 子组件Child | 接收父组件onChange, 自己也有onChange属性 -->
<input {...this.props} onChange={this.handleChildChange} />

此时,Child组件执行的onChange只是执行handleChildChange事件,handleParentChange事件并不会执行.

  • 1.如果只需要执行handleParentChange怎么办??   input中  {...this.props} 与 onChange={this.handleChildChange} 换个位置。
  • 2.如果两个事件都需要执行怎么办??                      在Child组件中  handleChildChange 中执行 this.props.handleParentChange

3、类中的方法用ES6形式简写的不同之处:  fn = () => {}   与   fn() {}   的区别:

export default Class Child extends Component {
constructor (props) {
super()
this.state = {};
} // 写法1,这是ES6的类的方法写法
fn1() {
console.log(this)
// 输出 undefined
} // 写法2,这是react的方法写法
fn2 = () => {
console.log(this)
// 输出:Child {props: {…}, context: {…}, refs: {…}, …}
} render () {
return (
<div>
<button onClick={this.fn1}>fn1方法执行</button >
<button onClick={this.fn2}>fn2方法执行</button >
</div>
);
}
}

可见两种写法,函数内的this指向时不同的。

那它们就没有相同之处吗??,  以下三种情况是相同的:

情况1:函数内部用不到this的时候,两者相等。

    // 写法1,这是ES6的类的方法写法
fn1() {
return 1 + 1
} // 写法2,这是react的方法写法
fn2 = () => {
return 1 + 1
}

情况2:两者在render中直接执行的时候。

    // 写法1,这是ES6的类的方法写法
fn1() {
console.log(this)
// Child {props: {…}, context: {…}, refs: {…}, …}
} // 写法2,这是react的方法写法
fn2 = () => {
console.log(this)
// 输出:Child {props: {…}, context: {…}, refs: {…}, …}
} render () {
return (
<div>
<button onClick={() => {
this.fn1();
}}>fn1方法执行</button > <button onClick={() => {
this.fn2();
}}>fn2方法执行</button >
</div>
);
}

情况3:给this.fn2.bind(this),绑定this作用上下文。

// 写法1,这是ES6的类的方法写法
fn1() {
console.log(this)
// Child {props: {…}, context: {…}, refs: {…}, …}
} // 写法2,这是react的方法写法
fn2 = () => {
console.log(this)
// 输出:Child {props: {…}, context: {…}, refs: {…}, …}
} render () {
return (
<div>
<button onClick={this.fn1}>fn1方法执行</button > <button onClick={this.fn2.bind(this)}>fn2方法执行</button >
</div>
);
}

注意,不要和ES6中对象的方法简写弄混了,以下是对象Obeject的方法简写:

阮一峰ES6: http://es6.ruanyifeng.com/#docs/object

4、列表渲染中的数组。

参考:https://doc.react-china.org/docs/lists-and-keys.html

正常的jsx写法是在render中写类似于HTML的语法,标签嵌套标签<div><input /></div>,有js,用 { 花括号 }。

但是不知道你注意过没有,数组可以嵌套在标签内部,正常渲染。

function NumberList(props) {
const numbers = [1,2,3,4,5]; // listItems是数组numbers通过map返回的,本质也是个数组。
const listItems = numbers.map((number) =>
<li>{number}</li>
); return (
<ul>
// 可以替换成 [ <li>1</li>, <li>2</li>, .....]
{listItems}
</ul>
);
}

如上所示,标签内部的数组是可以正确渲染的,那么就有以下的写法:

renderItem(name) {
const A = <li key={'a'}>A</li>,
B = <li key={'b'}>B</li>,
C = <li key={'c'}>C</li>,
D = <li key={'d'}>D</li>;
let operationList; switch (name) {
case 1:
operationList = [A , B, C]
break;
case 2:
operationList = [B, C, D]
break;
case 0:
operationList = [A]
break;
}
return operationList;
} render() {
   // this.renderItem() 执行结果是数组
return (
<ul>{ this.renderItem() }</ul>
)
}

react中这些细节你注意过没有?的更多相关文章

  1. React中如何优雅的捕捉事件错误

    React中如何优雅的捕捉事件错误 前话 人无完人,所以代码总会出错,出错并不可怕,关键是怎么处理. 我就想问问大家react的错误怎么捕捉呢? 这个时候: 小白:怎么处理? 小白+: ErrorBo ...

  2. 深入浅出React的一些细节——State

    (来源于: https://facebook.github.io/react/docs/state-and-lifecycle.html 翻译by:@TimRChen) Using State Cor ...

  3. 深入理解react中的虚拟DOM、diff算法

    文章结构: React中的虚拟DOM是什么? 虚拟DOM的简单实现(diff算法) 虚拟DOM的内部工作原理 React中的虚拟DOM与Vue中的虚拟DOM比较 React中的虚拟DOM是什么?   ...

  4. 转 : CSS Modules详解及React中实践

    https://zhuanlan.zhihu.com/p/20495964 CSS 是前端领域中进化最慢的一块.由于 ES2015/2016 的快速普及和 Babel/Webpack 等工具的迅猛发展 ...

  5. 哪种方式更适合在React中获取数据?

    作者:Dmitri Pavlutin 译者:小维FE 原文:dmitripavlutin.com 国外文章,笔者采用意译的方式,以保证文章的可读性. 当执行像数据获取这样的I/O操作时,你必须发起获取 ...

  6. 理解React中es6方法创建组件的this

    首发于:https://mingjiezhang.github.io/(转载请说明此出处). 在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的. 从react中的 ...

  7. 【原】React中,map出来的元素添加事件无法使用

    在使用react中,经常用到react的map函数,用法和jquery里中的map一样,但是,如果你在每个map出来的元素中添加,你会发觉添加的事件无法关联, 比如,我们很多的评论,我需要在每个评论下 ...

  8. React中props.children和React.Children的区别

    在React中,当涉及组件嵌套,在父组件中使用props.children把所有子组件显示出来.如下: function ParentComponent(props){ return ( <di ...

  9. Immutable 详解及 React 中实践

    本文转自:https://github.com/camsong/blog/issues/3 Shared mutable state is the root of all evil(共享的可变状态是万 ...

随机推荐

  1. Codeforces Round #553 (Div. 2) C. Problem for Nazar 数学

    题意:从奇数列 1 3 5 7 9 ....  偶数列2 4 6 8 10...分别轮流取 1 2 4 ....2^n 个数构成新数列 求新数列的区间和 (就一次询问) 思路:首先单次区间和就是一个简 ...

  2. 突然 不能f**q

    ss 突然访问不了,于是去查看ip是否被f,发现国outer 国inner 都通,不知道什么情况,后来把 系统代理模式 改为全局,发觉可以,又把他改为 pac模式,正常了.           记录一 ...

  3. MSTP-多生成树协议

    多生成树协议MSTP(Multiple Spanning Tree Protocol)是IEEE 802.1s中定义的一种新型生成树协议.简单说来,STP/RSTP是基于端口的,PVST+是基于VLA ...

  4. linux系统学习方法分享

    初学者可以自己安装虚拟机,然后把 linux 常用命令例如 cd.ls.chmod.useradd.vi 等等多练习几十遍,把自己敲打命令的熟练程度提升上来.然后根据文档搭建 Linux 下常见的各种 ...

  5. jvm-垃圾回收gc简介+jvm内存模型简介

    gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm内存模型简介 jvm是在计算机系统上又虚拟出来的一个伪计算机系统 ...

  6. Ubuntu 16.04下安装谷歌浏览器(转)

    1.进入 Ubuntu 16.04 桌面,按下 Ctrl + Alt + t 键盘组合键,启动终端. 2.在终端中,输入以下命令,将下载源加入到系统的源列表. sudo wget http://www ...

  7. Eclipse建立Java工程中的三个JRE选项的区别(Use an execution environment JRE,Use a project specific JRE,Use default JRE)

    本博客部分转载自: http://blog.csdn.net/wdjhzw/article/details/42086615  这篇博客写的非常好,很用心. 一.首先看新建Java Project时候 ...

  8. .net core内部分享ppt

    Microsoft .NET 自 2002 年发行 v1.0 以来,已经过了近 14 个年头,在这 14 年里面,.NET 日渐成熟并成为 Microsoft 的重要开发平台之一,只要是在 Windo ...

  9. mysql 开发进阶篇系列 28 数据库二进制包安装(centos系统准备)

    1. centos 7安装工作 对于mysql二进制安装,我这里在使用一台新的centos系统.准备好VMware,Xftp-6.0, Xshell-6.0.在VMware中网络使用桥接模式,分配20 ...

  10. 从零开始学 Web 之 JavaScript(三)函数

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...