作者:水落斜阳
链接:https://www.jianshu.com/p/4fb47009c330
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.react component有几种写法?各有什么特点

① 函数式定义的无状态组件(Stateless Functional)

性能更高效、代码更简洁
没有 state,也就是无状态
不需要管理/维护 组件的生命周期
纯函数,相同的 props 会得到同样的UI渲染结果
组件不会被实例化,整体渲染性能得到提升
组件不能访问this对象

②.
ES5原生方式React.createClass定义的组件
是react刚开始推荐的创建组件的方式,这是ES5的原生的JavaScript来实现的React组件
是创建有状态的组件
些组件是要被实例化的,并且可以访问组件的生命周期方法
创建的组件,其每一个成员函数的this都有React自动绑定

③.ES6 方式定义的组件(Class Components)
ES6的形式来创建react的组件的,是React目前极为推荐的创建有状态组件的方式
创建的组件,其成员函数不会自动绑定this,需要开发者手动绑定,否则this不能获取当前组件实例对象
有三种手动绑定方法:可以在构造函数中完成绑定,也可以在调用时使用method.bind(this)来完成绑定,还可以使用arrow function来绑定

2.写个受控表单组件更新state的流程?

class App extends Component {
constructor(props) {
super(props)
this.state = { value: 'hi' }
} onInputChange = (e) => {
this.setState({ value: e.target.value })
} render() {
const { value } = this.state
return (
<input value={value} onChange={this.onInputChange} />
)
}
}

文本描述
1.初始化state设置表单的默认值,例如 this.state = { value: 'hi' }
2.每当表单值发生变化时,调用onChange事件
3.通过对象e拿到改变的状态,例如e.target.value
4.通过setState更新应用value 并 触发视图重新渲染,最终完成表单组件的更新

3下面两种写法的得到的this.state.text值是一样吗?为什么?
...
this.state = { text : '这是一个栗子' }
... // 使用传递对象的写法
handleClick = () => {
this.setState({ text: this.state.text + '111' })
this.setState({ text: this.state.text + '222' })
} // 使用传递函数的写法
handleClick = () => {
this.setState((prevState) => {
return { text: prevState.text + '111' }
})
this.setState((prevState) => {
return { text: prevState.text + '222' }
})
} render() {
return <div onClick={this.handleClick}>{this.state.text}</div>
}

两种传递方式,得到的结果是不一样的。

传递对象 => this.state.text => '这是一个栗子222'
传递函数 => this.state.text => '这是一个栗子111222'

setState为了提升性能,在批量执行 state 改变在做统一的DOM渲染。而在这个批量执行的过程中,如果你多次传递的是一堆对象,它就会做一些对象合并或者组合的操作,例如Object.assign({}, { a: '111' }, { a: '222' })。如果key值一样的话,后面的值会覆盖掉前面的值。
但多次传递函数方式,每次 React 从 setState 执行函数,并通过传递已更新的状态来更新你的状态。这使得功能 setState 可以基于先前状态设置状态。

4.为什么我们利用循环产生的组件中要用上key这个特殊的prop?

render() {
return (
<ul>
list.map((item, index) => {
return <li key={item.id}>{item.name} - {item.age}</li>
})
</ul>
)
}

5.keys 是 React 用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识
之所以需要key,因为react 是非常高效的,它会借助元素的 key 值来判断该元素是新创建的,或者移动(交换位置)而来的,从而减少不必要的元素重渲染

如果上面代码改成 key={index} 呢,有啥区别

这样做的效率是非常非常非常低的,只有list变化了, 每个元素对应的key都变了,react Virtual DOM就不论有没有相同的项,更新都会重新渲染了。所以我们要保证某个元素的 key 在其同级元素中具有唯一性, 这个key 的值可以直接后台数据返回的 id

6.react组件间的通信有哪些

  1. 父组件向子组件通信
    react 中数据是单向传递的,父组件可以向子组件通过传 props 的方式,
    子组件拿到 props 之后做相应的处理

2.子组件向父组件通信
子组件向父组件传递数据(通信) 也是要通过 props 传递一个函数,子组件调用这个函数,并将子组件需要传递的数据作为参数,传递给父组件

3.兄弟组件之间通信
可以通过他们的共同父组件来实现,

7.跨n级组件之间通信或者,非嵌套组件的通信有什么好的办法
  1. 利用 react 提供的 context , 它类似一个全局大容器,我们把想传递的信息放在里面,需要的往里面取便是
    2.自定义事件的方式。自定义事件是典型的发布/订阅模式,通过向事件对象上添加监听器和触发事件来实现组件间通信
    3.状态管理工具 mobx redux 等

8.简要说说React中虚拟DOM原理

在React中,也有一个render函数来将虚拟DOM树,并且,React中有state转移的过程,所以每次state有变化之后,就会触发render函数,重新构造一个虚拟DOM树。对比新旧虚拟DOM树的差别,记录下差异,然后只针对差异部分对应的真实DOM进行操作。
如何进行新旧虚拟DOM树的对比呢?
这里采用的是Diff算法。Diff算法比较复杂,主要的思路是这样的。
首先,每一次生成的虚拟DOM树上的各个节点都对应唯一的一个id,当第二次生成了新的DOM树时,对原来树上的每一个节点对比新树上对应节点,如果不同,就记录下来这个差异。同时,差异也分为很多种:

替换节点;
修改属性;
对文本内容修改
移动、删除、增加节点;
比如,替换节点就需要调原生JS的repaceChild()接口;
对于修改属性,则要调setAttribute()接口等等。

[web] react一些些的更多相关文章

  1. Java Web应用包括些啥?

    Tomcat服务器最重要的作用就是充当Java Web应用的容器.Java Servlet规范中对Java Web应用的定义如下: Java Web应用由一组Servlet.HTML页面.类以及其他可 ...

  2. 深入比较选择 Angular 还是 React

    我应该选择 Angular 还是 React?现在JS框架两强的格局让许多开发者选择起来很纠结.无论你是一个正在思考如何入门的新手,还是一个为下个项目挑选框架的设计者,或是一个架构师为公司做长远的规划 ...

  3. 工作流软件是未来web的支柱

    Web 3.0正在敲门,但是开门的人你永远都想不到:工作流软件. 传统上工作流软件是企业级的业务流程管理工具,但现在随着网络互联程度的加深,工作流软件开始呈现出其作为互联网技术的一面. 诚然,社会化媒 ...

  4. 工作流软件如何成为未来web的支柱

    此文作者是 Kevin Lindquist,工作流平台Decisions的营销负责人,原文发表于VB上. Web 3.0 正在敲门,但是开门的人你永远都想不到:工作流软件. 传统上工作流软件是企业级的 ...

  5. 关于clojurescript+phantomjs+react的一些探索

    这两天需要使用phantomjs+react生成些图片 React->Clojurescript: 最开始发现clojurescript中包裹react的还挺多: https://github. ...

  6. React Native简史

    诞生 React Native 诞生于 2013 年的 Facebook 内部黑客马拉松(hackathon): In the essence of Facebook’s hacker culture ...

  7. 初学c# -- 学习笔记(四)

    想想,数据库先用mysql了,这玩意小且安装方便.前面web学了些,现在学winform的.数据库先看看便捷的mysql. 下载了一个mysql5.7版的,装上居然找不到密码,重装3.4回,找不到,说 ...

  8. 博文推荐】Javascript中bind、call、apply函数用法

    [博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...

  9. [安卓开发]App Widget开发入门指导

    本节所要讲的主要内容包括Android桌面小部件.App Widget的开发入门指导,并通过一个简单实例的形式来直观的讲解App Widget. 一.Widget .App Widget .Web A ...

随机推荐

  1. React学习笔记①

    三种导出方式 export let num = 1://1 let num2 = 2://2 export {num2};//2 export default {default}//3 三种导入方式 ...

  2. 另类WebShell监测机制--基于auditd

    鸣  谢 VSRC感谢业界小伙伴——老陈投稿精品原创类文章.VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送,我们为您准备的丰富奖品包括但不仅限于:MacbookAir.VSRC定制 ...

  3. Android-----创建SQLite数据库

    简单介绍一下Android系统内置轻便又功能强大的嵌入式数据库--SQLite. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎,它是一款轻型的数据库,是遵守ACID的关 ...

  4. vue脚手架中动态引用图片的办法

    需要先导入: import logo_st_ga from '../assets/big_st_ga.png'; import logo_st_sp from '../assets/big_st_sp ...

  5. 关于Hive创建分区目录且能查到数据的三种方法

    关于Hive创建分区目录且能查到数据的三种方法 1. 使用dfs -mkdir 和 dfs -put 分别创建分区目录和上传数据,此时执行msck repair table 表名 命令就能查询到数据 ...

  6. cad 画图面板的尺寸大小定义

    输入limits 输入左下角点为 0,0 输入右上角点为大家需要的数  这里为100,50 输入zoom 输入a 就可以实现自定义编辑 注意事项 如果在你已经操作过的图纸上可能会失效 重新建一张图纸就 ...

  7. Odoo中的ORM API(模型数据增删改查)

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826214.html 一:增 1:create():返回新创建的记录对象 self.create({'na ...

  8. 将源码包制作成rpm包

    Linux系统中一般安装软件有两种方法,源码安装和yum安装或者rpm包安装,由于光盘中的rpm包都是几年前制作成的,所以软件版本都很低,同时yum安装对软件的可定制性很低,所以为了使用最新的软件,一 ...

  9. Beta冲刺第4次

    二.Scrum部分 1. 各成员情况 翟仕佶 学号:201731103226 今日进展 今天不再使用Excel绘制燃尽图,改学习使用highcharts绘制 存在问题 对前端不够了解,第一次在这博客园 ...

  10. 图论 - PAT甲级 1013 Battle Over Cities C++

    PAT甲级 1013 Battle Over Cities C++ It is vitally important to have all the cities connected by highwa ...