简单, 试试 import()
vue 里面的懒加载应该就是这么实现的哦
可以去看一下前端模块那部分复习一下啦
简单, 试试 import()
vue 里面的懒加载应该就是这么实现的哦
可以去看一下前端模块那部分复习一下啦
redux 官方文档,实例的 todo 看的我脑壳疼,各种查找,搜索,发现这个真难理解,为什么呢?因为他们都把这三个拆开介绍,本人本来就对这个玩意陌生,结果还拆开。
瞬间懵逼。
事实上 redux 实际开发上手非常简单。我们走起~
首先介绍一下,只需三行就能完事~~。
state 这个就是跟 react 里面的 state 一样,跟 vue 的 data 一样,存储数据(不过跟 react 一个尿性只能手动更新)
store 因为 state 不能直接赋值,所有要调用 store 的函数去更新和获取值。
action 通过 action 去操作 state 从而达到改变 state 的一个具体实现 action 可以是 obj 也可以是 function。
我们需要做的很简单
1 | //创建一个对象用来初始 state |
那么现在你再去看官网的那些概念是不是就很好理解了呢~
官方使用思路
1 | MyPlugin.install = function (Vue, options) { |
如何像 Element ui 实现按需加载和全部加载?
我们只需 在每个组件中都加入 install 方法
并添加一个全局 install 即可。
类似下面这样:
1 | const install = function (Vue, opts = {}) { |
1 | //移动端版本兼容 |
Facebook 兼容原文
鼠标事件(以及双指手势的触摸板) 在前端的支持糟透了奥. 这是一件复杂的事情, 因此这篇文档会很长并且 (希望)我讲的足够细致,能解决你的困惑。
如果你希望能让这个事件变得可控和可预测, 这份代码是你最好的朋友.拥抱~~
至今, 已经有 4 种 DOM event 你能监听到:
‘wheel’ – Chrome(31+), FF(17+), IE(9+)
‘mousewheel’ – Chrome, IE(6+), Opera, Safari
‘MozMousePixelScroll’ – FF(3.5 only!) (2010-2013) – don’t bother!
‘DOMMouseScroll’ – FF(0.9.7+) since 2003
那我 tm 应该怎么做呢? 最好的方法是:
normalizeWheel.getEventType();
在你的回调中调用上面这段代码,用他去智能的屏蔽这些琐碎的细节. 这段代码将返回一个对象内含四个值:
spinX – normalized spin speed (use for zoom) - x plane
spinY – “ - y plane
pixelX – normalized distance (to pixels) - x plane
pixelY – “ - y plane
在你用鼠标滚动浏览器页面,或者触摸板,触摸屏挪动像素的时候,上述的所有的数值由浏览器提供。数值是会变化的
显而,在不同的浏览器和平台中, 你可能滑动的速度不同. 一些设备 (like trackpads) 会反馈出更小的增量在触摸板上, 还有一些这些数值会变化的更加平滑或者更强烈.
这份代码会做更通常的方式去让你使用:
===以下兼容不翻译====。
Why are there spinX, spinY (or pixels)?
Implementation info:
Examples of ‘wheel’ event if you scroll slowly (down) by one step with an
average mouse:
OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120)
OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12)
OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A)
Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120)
Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120)
On the trackpad:
OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6)
OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A)
On other/older browsers.. it’s more complicated as there can be multiple and
also missing delta values.
The ‘wheel’ event is more standard:
http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
The basics is that it includes a unit, deltaMode (pixels, lines, pages), and
deltaX, deltaY and deltaZ. Some browsers provide other values to maintain
backward compatibility with older events. Those other values help us
better normalize spin speed. Example of what the browsers provide:
| event.wheelDelta | event.detail
——————+——————+————–
Safari v5/OS X | -120 | 0
Safari v5/Win7 | -120 | 0
Chrome v17/OS X | -120 | 0
Chrome v17/Win7 | -120 | 0
IE9/Win7 | -120 | undefined
Firefox v4/OS X | undefined | 1
Firefox v4/Win7 | undefined | 3
之前我一直使用 wheel 事件,现在发现并不严谨在读了 Element 的兼容写法后,我找到了上面的这个文章。
Element ui 在此基础上的封装
1 | import normalizeWheel from "normalize-wheel"; |
我们发现,Element UI 没注意到其实 normaliz-wheel 做了这件事情。
由于没看源码,没注意到:
这个 normalizeWheel.getEventType(); 这个 api
只看见了 readme。。。
1 | import normalizeWheel from "normalize-wheel"; |
那我们应该如何改进呢?
1 | const mousewheel = function(element, callback) { |
为什么要这样做?
请阅读源码。
1 | const REGEXP_CONFIG = { |
(译者注:原标题是“Can’t live if livin’ is without you”,为英国乐队 Badfinger 歌曲 Without You 中歌词。)
我父亲以前跟我说过,有些事物在你得到之前是无足轻重的,得到之后就不可或缺了。微波炉是这样,智能手机是这样,互联网也是这样——老人们在没有互联网的时候过得也很充实。对我来说,函数的柯里化(curry)也是这样。
curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
你可以一次性地调用 curry 函数,也可以每次只传一个参数分多次调用。
emmm 这里举个例子奥
正常我们写的话:
1 | function a(val1,callback){ |
为了 curry 而 curry 的写法。。。
1 | function a(val1) { |
那么更好用的写法:
1 | const fn = (a) => (b) => fn2(a, b); |
done!
根据 mathisfun.com:
函数是不同数值之间的特殊关系:每一个输入值返回且只返回一个输出值。
换句话说,函数只是两种数值之间的关系:输入和输出。尽管每个输入都只会有一个输出,但不同的输入却可以有相同的输出。下图展示了一个合法的从 x
到 y
的函数关系;
)(http://www.mathsisfun.com/sets/function.html)
相反,下面这张图表展示的就不是一种函数关系,因为输入值 5
指向了多个输出:
)(http://www.mathsisfun.com/sets/function.html)
函数可以描述为一个集合,这个集合里的内容是 (输入, 输出) 对:[(1,2), (3,6), (5,10)]
(看起来这个函数是把输入值加倍)。
或者一张表:
输入 | 输出 |
---|---|
1 | 2 |
2 | 4 |
3 | 6 |
甚至一个以 x
为输入 y
为输出的函数曲线图:
如果输入直接指明了输出,那么就没有必要再实现具体的细节了。因为函数仅仅只是输入到输出的映射而已,所以简单地写一个对象就能“运行”它,使用 []
代替 ()
即可。
1 | var toLowerCase = { A: "a", B: "b", C: "c", D: "d", E: "e", D: "d" }; |
当然了,实际情况中你可能需要进行一些计算而不是手动指定各项值;不过上例倒是表明了另外一种思考函数的方式。(你可能会想“要是函数有多个参数呢?”。的确,这种情况表明了以数学方式思考问题的一点点不便。暂时我们可以把它们打包放到数组里,或者把 arguments
对象看成是输入。等学习 curry
的概念之后,你就知道如何直接为函数在数学上的定义建模了。)
戏剧性的是:纯函数就是数学上的函数,而且是函数式编程的全部。使用这些纯函数编程能够带来大量的好处,让我们来看一下为何要不遗余力地保留函数的纯粹性的原因。
首先,纯函数总能够根据输入来做缓存。实现缓存的一种典型方式是 memoize 技术:
1 | var squareNumber = memoize(function (x) { |
下面的代码是一个简单的实现,尽管它不太健壮。
1 | var memoize = function (f) { |
值得注意的一点是,可以通过延迟执行的方式把不纯的函数转换为纯函数:
1 | var pureHttpCall = memoize(function (url, params) { |