t.state = {};会改变 state,但是不能触发render
t.setState({images:[]}); 是 array merge,并不是直接赋值state,并且是[异步](https://segmentfault.com/q/1010000003708852)的
render。然后计算虚拟DOM 再 决定是否改变DOM,或者说改变那些DOM,怎么操作DOM,这也是正确的改变state的方法,除此以外,任何对state进行改变的方式都是错误的,例如上面的方式。为了高效的操作DOM,所以必须采用一些手段,计算 react diff,虚拟DOM技术,这些都是为了提高DOM操作效率(越快,越少的操作),所以循环是的组件需要加一个key这也是为了更方便的计算DOM吧。
每次t.setState()都会执行 render() 相当于是服务端的$this->render()一样。
![](https://box.kancloud.cn/4f91136c63f8ef082086e624f4ae4865_673x369.jpg)
由于react的开发理念/方式和传统(jQuery)开发有很大的不同,所以有一些需要注意的问题。
还是以上面的例子为例,按照传统开发方式开发时,当有新的消息,我们需要操作DOM将新消息“插入”到消息列表,这个插入动作可以带点特效,让这个来了新消息的过程更加生动形象。其实在传统开发中这样的例子有很多,比如,发布,删除,这些操作,都可以带一些“动作”,以使操作表现得生动具体,也就是说很多时候我们不是简单的改变DOM,还会有一些为了描述当前操作的“动效(动作/效果)”的。这样能增强应用操作的体验。不然如果只是改变一下DOM,在浏览器上我们是看不到渲染过程的,只是看到页面内容生硬的改变了而已。
>[danger] 这种页面元素改变的方式显得很突兀,非常生硬,用户体验不友好。
当我们使用react时就会遇到这个问题,由于数据和DOM对应,我们并不需要关心DOM,有新消息时,react经过计算DOM different 找到最优的方式去操作DOM,所以新消息感觉是生硬的插入到文档中,我们只能感觉到突然多了一条消息,显然这种体验没有上面传统方式那样好了,感觉不到新消息“插入进来”的效果。并且如果当一个数据放生多次改变,但最终和最初数据相同,那么react就会得到数据没有变动,因而就不会有DOM操作了,比如让一个点移到右边后再移回来,由于setState是异步的,所以可能我们只会看到这个点待在原地并没有动,而是用传统方式就不会有这个问题,所以需要注意点,注意setState是怎么处罚渲染的。
所以当由传统开发转向react时需要注意可考虑这些问题。
但其实这些并不是问题,我们通过其他方式照样可以实现传统开发中的“动效”。
无论怎样,react还是极大的提高了我们的开发效率,这点是毋庸置疑的。
### 临时笔记
state在钉钉项目中,使用路由时好像有缓存,如果不重置还会有缓存。我在想state这个东西到底是以一种什么形式存在的,全局?刷新就没有了,是否可以使用HTML5的缓存将它缓存起来呢?????? 2017-1-25 10:36:01
### 扩展
[浅谈前端状态管理(上)](https://zhuanlan.zhihu.com/p/25800767)
[React中使用CSSTransitionGroup插件实现轮播图 - 勤劳的小叶酱 - 博客园](http://www.cnblogs.com/diligentYe/p/6637585.html)
[我的职业是前端工程师【九】:你应该知道的单页面应用的五要素](https://zhuanlan.zhihu.com/p/25858609)
[从零开始手把手教你实现一个Virtual DOM](https://mp.weixin.qq.com/s/viBtv7KSD70qrlAhUMsjDA)
[你真的理解setState吗?](https://mp.weixin.qq.com/s/_u_gqFe3t8lAAxiN724gpg)
----
update time: 2017-5-11 23:28:56
- 开始
- 微信小程序
- 获取用户信息
- 记录
- HTML
- HTML5
- 文档根节点
- 你真的了解script标签吗?
- 文档结构
- 已经落后的技术
- form表单
- html实体
- CSS
- css优先级 & 设计模式
- 如何编写高效的 CSS 选择符
- 笔记
- 小计
- flex布局
- 细节体验
- Flex
- Grid
- tailwindcss
- JavaScript
- javascript物语
- js函数定义
- js中的数组对象
- js的json解析
- js中数组的操作
- js事件冒泡
- js中的判断
- js语句声明会提前
- cookie操作
- 关于javascript你要知道的
- 关于innerHTML的试验
- js引擎与GUI引擎是互斥的
- 如何安全的修改对象
- 当渲染引擎遇上强迫症
- 不要使用连相等
- 修改数组-对象
- 算法-函数
- 事件探析
- 事件循环
- js事件循环中的上下文和作用域的经典问题
- Promise
- 最佳实践
- 页面遮罩加载效果
- 网站静态文件之思考
- 图片加载问题
- 路由及转场解决方案
- web app
- 写一个页面路由转场的管理工具
- 谈编程
- 技术/思想的斗争
- 前端技术选型分析
- 我想放点html模板代码
- 开发自适应网页
- 后台前端项目的开发
- 网站PC版和移动版的模板方案
- 前后端分离
- 淘宝前后端分离
- 前后端分离的思考与实践(一)
- 前后端分离的思考与实践(二)
- 前后端分离的思考与实践(三)
- 前后端分离的思考与实践(四)
- 前后端分离的思考与实践(五)
- 前后端分离的思考与实践(六)
- 动画
- 开发小技巧
- Axios
- 屏幕适配
- 理论基础
- 思考
- flexible.js原理
- 实验
- rem的坑,为什么要设置成百分比,为什么又是62.5%
- 为什么以一个标准适配的,其它宽度也能同等适配
- 自适应、响应式、弹性布局、屏幕适配
- 适配:都用百分比?
- 番外篇
- 给你看看0.5px长什么样?
- 用事实证明viewport scale缩放不会改变rem元素的大小
- 为什么PC端页面缩放不会影响rem元素
- 究竟以哪个为设备独立像素
- PC到移动端初试
- 深入理解px
- 响应式之栅格系统
- 深入理解px(二)
- 一篇搞定移动端适配
- flex版栅格布局
- 其他
- 浏览器加载初探
- 警惕你的开发工具
- JS模块化
- webpack
- 打包原理
- 异步加载
- gulp
- 命名规范
- 接口开发
- sea.js学习
- require.js学习
- react学习
- react笔记
- vue学习
- vue3
- 工具、技巧
- 临时笔记
- 怎么维护好开源项目
- 待办
- 对前端MVV*C框架的思考
- jquery问题
- 临时
- 好文
- 节流防抖