《移动WEB前端高级开发实践@www.java1234.com》——3

React Flux:


Flux将一个应用分成四个部分。

  • View: 视图层
  • Action(动作):视图层发出的消息(比如mouseClick)
  • Dispatcher(派发器):用来接收Actions、执行回调函数
  • Store(数据层):用来存放应用的状态,一旦发生变动,就提醒Views要更新页面

Flux 的最大特点,就是数据的"单向流动"。

  1. 用户访问 View
  2. View 发出用户的 Action
  3. Dispatcher 收到 Action,要求 Store 进行相应的更新
  4. Store 更新后,发出一个"change"事件
  5. View 收到"change"事件后,更新页面

上面过程中,数据总是"单向流动",任何相邻的部分都不会发生数据的"双向流动"。这保证了流程的清晰。

 
   

React 动画库:react-motion

http://cexoso.github.io/cexoso/2017/10/08/read-react-motion/

spring 弹簧:

Fspring由劲度系数产生的力,Fdamper由阻尼产生的力。a为加速度,此处直接定义为两个力的和(假定质量为1了呗)。接着用积分的方法(假定了时间无穷小,其实一个时间片为1/60秒),算出新的速度和新的位置。并且如果速度和位置差在精度内就将速度置为0来结束运动。最后返回带有新位置和速度的tuple。


缓动函数

 

https://zhuanlan.zhihu.com/p/20458251

用这种方法有着显而易见的问题:

  1. 写 n 张页面页面渲染效率十分低下。
  2. 每次重新设置 body.innerHTML,性能太低了。

我们来逐个解决上述问题。

  1. 每一帧的界面都遵循一定的规律,相似性很高,中间必然有很多重复劳动。既然是重复劳动,我们可以放心的交给计算机去完成。写一个渲染函数,只需要向这个函数描述一下当前页面的信息,这个函数就能把页面给渲染出来。
  2. 可以用局部更新的方式来取代块更新,其中 React 的 Virtual DOM 更新方便地解决了这个问题。

我们再以一个左右切换的 toggle 动画为例,写一个渲染函数:

const render = x => `
  <div class="toggle-slider">
    <div class="toggle-box" style="transform: translate3d(${x}, 0, 0)">
  </div>
`

有了这个函数之后,只需要告诉它 x 的当前值,新的页面就开始自动绘制了。由于 toggle 的运动规律,x 的值也不用手动依次给出,我们仍然可以写一个自动计算 x 的函数。这个自动计算 x 的函数,或者说计算页面状态的函数,就是缓动函数。

上述章节使用 setTimeout 来模拟时间的逝去,然而浏览器为动画过程提供了一个更为专注的 API -requestAnimationFrame。

raf 使用起来就像 setTimeout 一样,但有以下优点:

  1. 所有注册到 raf 中的回调,浏览器会统一管理, 在适当的时候一同执行所有回调。
  2. 当页面不可见,例如当前标签页被切换,隐藏在后面的时候,为了减少终端的损耗,raf 就会暂停。(如果像 jQuery 那样, 使用 setTimeout 实现动画,此时页面就会进行没有意义的重绘)。

raf 的这个特性,还可以利用在实时模块中,让标签页隐藏时停止发请求。

在开始使用 raf 前,我们需要一个 raf 的 polyfill ,比如 chrisdickinson/raf

然后,我们尝试用 React 和 raf 来重构一次 Toggle 动画。在数据上,用中介者模式实现一个简单的单向数据流:

动画是源自现实世界的,人类早已习惯了一个变速运动的物理环境,这样的一个匀速动画会让人相对感觉不适。

而从动画体验的角度来说,不同的缓动函数会带给用户不同的缓动体验。缓动体验一般为: 匀速缓动 < 变速缓动 < 物理缓动。

其中,spring 是最经典也是最常用的物理缓动。React Motion 就使用了这种物理缓动 —— 弹簧( spring )。

React Motion 缓动原理剖析

React Motion 使动画看起来像一个弹簧那样(一个有空气阻力的弹簧,如果没有空气阻力,弹簧就会不停地做简谐运动了)。大家可以尝试使用 React Motion 的spring-parameters-chooser,配置一个合适的劲度系数和空气阻力。弹簧动画可以使网站增添一些俏皮的元素,让用户体验起来更加舒畅!

下面就让我们进入主题,开始解读 React Motion 的缓动过程。

先模拟弹簧的物理规律,实现弹簧动画。

CSS 动画与 JS 动画

总的来说,使用 CSS 动画,能够得到更好的性能和更快的开发效率,然而 CSS 虽然更方便,但也必然有其做为 DSL 的局限性。例如:

1. 缓动函数单一(只有 cubic-bezier )

2. CSS 动画并不支持所有属性。例如 svg path 的 d 属性。

3. translate,rotate,skew 等都属于一个属性 —— transform。所以这些属性只能共用同一个缓动函数。(假如,我们想要动画的轨迹是一条贝塞尔曲线,可以通过给 translateX 和 translateY 这两个属性加两个不同的 cubic-bezier 缓动函数来实现,因此这就只能使用 JS 动画了)

(值得一提的是,CSS3 transition 的实现也使用了 raf 的机制,当标签页被切换时, transition 动画也会暂停,大家不妨试一试)

而 JS 动画刚好弥补了 CSS 动画的这些不足。

React 通过设置 state 让界面迅速发生变化,但动画的哲学告诉我们,变化要慢,得用一个逐渐变化的过程来过渡,从而帮助用户理解页面。

而界面的变化无非是 DOM 节点(或组件)的增与减和 DOM 节点(或组件)属性的变化。React 的 TransitionGroup 帮助我们便捷地识别 React 中的那些增加或删除的组件,从而让我们可以专注于更加简单的属性变化的动画。

 

https://threejs.org/examples/#webgl_animation_cloth

超多示例:

 

就三个公式:
F=ma
F拉=kl-F阻
a=(v1-v2)/(t1-t2)

哈哈哈~是不是笑了……高中的吗牛一定律,拉力公式,还有加速度~

React motion 库核心就是处理一个数值,目标元素做弹性运动!

佩服的是92的chenglou代码写的条理相当清楚,这个库值得读源码

 

原文地址:https://www.cnblogs.com/cx2016/p/12069836.html

时间: 2024-10-01 01:02:20

《移动WEB前端高级开发实践@www.java1234.com》——3的相关文章

《算法图解》代码实现和改进

<算法图解>代码实现和改进 请随意观看表演 二分查找 数组和链表 递归 递归条件和基线条件 快速排序 散列表 广度优先搜索 狄克斯特拉算法 贪婪算法 二分查找 def bin_search(list,item): low = 0 high = len(list) - 1 while low<=high: mid = (low+high)//2 #得到中间值 guess = list[mid] if guess==item: return mid elif guess>item: h

《算法图解》示例代码的实现

这几天看了<算法图解>,把里面的示例代码都实现了一边,在 github 上找到了一位朋友的仓库,fork 了他的. 里面有我们添加的 Python,Java,C++的实现,欢迎大家 fork!!! 附上网址:https://github.com/lynxux/AlgorithmDiagram 原文地址:https://www.cnblogs.com/linkcode/p/8185994.html

Bellman-Ford算法图解

一.Bellman-Ford算法用到的"材料": 1.一个结果数组dis,这个结果数组记录从源点到其他点的最短距离,如dis[10] 表示(加入开始节点标号为1)开始节点1到10号节点的最短距离. 2.C/C++中定义结构体Edge,表示边,内设变量from.to.cost,分别表示这条边的开始标号.终点标号.边长度 3.为了方便测验设置一个边的数组,C++定义:Edge edges[100]: 二.Bellman-Ford算法图解 如图所示,针对一般情况分析,对一条边来说,我们想更新

《算法图解》经典高清中文PDF+英文PDF+源代码

下载:https://pan.baidu.com/s/1U0uJEtx1YHqw28lYkTZxEA 更多资料分享:https://pan.baidu.com/s/1g4hv05UZ_w92uh9NNNkCaA <算法图解>高清中文PDF,199页,带书签目录,文字可以复制粘贴. <算法图解>高清英文PDF,258页,带书签目录,文字可以复制粘贴. 配套源代码. 图文并茂,以让人容易理解的方式阐释了算法,帮助在日常项目中更好地发挥算法的能量. 如图: 原文地址:https://ww

《算法图解》+ 《我的第一本算法书》+资料PDF学习

<我的第一本算法书>没有枯燥的理论和复杂的公式,而是通过大量的步骤图帮助读者加深对数据结构 原理和算法执行过程的理解,便于学习和记忆. 下载:https://pan.baidu.com/s/1poq0e2siuvR1Re5pEIkBnQ <我的第一本算法书>高清PDF,210页,彩色配图,带书签目录,文字可以复制. <我的第一本算法书>采用大量图片,通过详细的分步讲解,以直观.易懂的方式展现了7个数据结构和 26个基础算法的基本原理.第1章介绍了链表.数组.栈等7个数据

《算法图解》读书感悟

写在前面:我感觉阅读算法书比没有系统地学习算法就开始盲目刷题要好很多 学习了数组.链表.栈.哈希表(散列函数).选择排序.快速排序(分而治之).二分查找.简单查找.递归.递推,觉得能够学到很多东西. 算法书并没有像知乎上说的没有用处,直接刷题就好??(本人为学校acm团队队员,一直为不能ak,有时周赛爆零而伤心) 应该是要先对算法有一个完全的自我认识后才开始刷题叭,这样之后刷的题才有意义,而不是一股脑地水题猛刷. 读到<算法图解>的这里时,是我最有共鸣的: 仅当URL不在缓存中时,你才让服务器

算法入门《数据结构与算法图解》+《我的第一本算法书》+《学习JavaScript数据结构与算法第3版》

最近几年学前端的人会越来越多,再加上前端的范围越来越广,从前端发展为全栈,数据结构和算法的功底要求势必将越来越高. <数据结构与算法图解>电子书及代码是数据结构与算法的入门指南,不局限于某种特定语言,略过复杂的数学公式,用通俗易懂的方式针对编程初学者介绍数据结构与算法的基本概念,培养编程逻辑.主要内容包括:为什么要了解数据结构与算法,大O表示法及其代码优化利用,栈.队列等的合理使用,等等. <算法图解>电子书非常的体贴,看起来也很快,用图来解释算法是非常好的想法,可作为学习数据结构

基于四元数的姿态解算算法图解

下面的两个地址是我存放在百度云网盘的附件,分别是基于四元数的互补滤波法的图解和梯度下降法的图解.笔者采用MindManager思维导图软件对上述两种算法进行详细的解释,非常形象. 希望这种方式能够让大家快速.准确的理解这两种算法的流程. 互补滤波法: http://pan.baidu.com/s/1c0b8qJ2 梯度下降法: http://pan.baidu.com/s/1sjI1l5F

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,很自然的,需要一个函数来存储匹

常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)

冒泡排序算法: 总的来说就是两两交换,反复直到有序,第一个记录和第二个记录,若逆序则交换,然后比较第二个和第三个记录,以此类推,直到第 n 个记录和第 n-1个记录比较完毕为止,第一趟排序,结果关键字最大的记录被安排在最后一个位置.对前 n-1个记录继续冒泡排序,使得关键字次大的记录安排在第 n-1个位置.如此重复,直到没有需要交换的记录为止(仅仅是第一个和第二个交换过为止).整个一趟趟的选出最值的过程,仿佛是那水里的气泡,咕嘟咕嘟的往上翻的过程. 递增冒泡排序过程图解: 一般先比较第一个元素和