reselect提供的createSel本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。ector API具有记忆功能,但是它的【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】用法奇怪,让入门者比较难理解,我也废了不【转载请注明来源】本文版权归作者所有,未经授权不得转载。少力才理解到这块。现在通过模拟脚本,来协本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。助理解。先来看下我们怎么创建一个sele【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。ctor函数:
【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】let selector = createSelector([fun1, fun2], fun3)
在使用selector的时候,把它当作一【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net个函数,传入state和props作为参转载请注明出处:www.tangshuang.net【本文受版权保护】数。接下来我们通过selector的反推著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】来理解:
【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。let someState = selector(state, props)
<- 在mapStateToProps中这样用推导出 =>
let someState = (function(state, props) {
let state1 = fun1(state, props)
let state2 = fun2(state, props)
return fun3(state1, state2)
})(state, props)
这样就可以非常容易的理解,createS【作者:唐霜】【原创不易,请尊重版权】elector传入的参数中的函数,各自在【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】什么时候执行,执行的结果拿来干什么。
转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【本文受版权保护】createSelector的第一个参数转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net是个数组,数组的个数和第二个参数函数(f【未经授权禁止转载】【原创不易,请尊重版权】un3)的参数个数相同,这个怎么做到呢?【未经授权禁止转载】【原创内容,转载请注明出处】其实很简单,用扩展运算符…或本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】者用.apply都可以做到。
【版权所有,侵权必究】【本文受版权保护】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】最后的问题是,如何做到记忆功能呢?【未经授权禁止转载】
【作者:唐霜】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。原创内容,盗版必究。【未经授权禁止转载】reselect的记忆功能的规则是,fu【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】n3的实参如果不变,那么说明它的运算结果【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。也不变,可以直接返回缓存起来的结果。
【未经授权禁止转载】【转载请注明来源】【转载请注明来源】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】所以,要使记忆功能生效,你必须保证fun转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。3的实参不变,说白了,就是fun1, f【未经授权禁止转载】【本文首发于唐霜的博客】un2的计算结果不变,因此fun1, f【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netun2必须是返回固定值的函数。这种函数比【未经授权禁止转载】原创内容,盗版必究。pure function还要硬性,即使【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。参数不同,也要永远返回一个值。当然,我们【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。是不可能做到这样的,如果fun1依赖的s本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】tate发生来变化,那么它的结果自然就会著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】变,这个时候,fun3就不再返回缓存,而原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】是重新计算结果,同时缓存新的结果,下次就未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。可以用这个缓存了。这样,就做到selec【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】tor的响应式。
本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【转载请注明来源】【作者:唐霜】转载请注明出处:www.tangshuang.net最后的问题是,如果fun1, fun2的本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。结果会随着props的不同而返回不同的结【原创不易,请尊重版权】【原创内容,转载请注明出处】果呢?这种情况普遍存在,一个react组本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。件可能在一个页面里面被多次使用,每次使用【本文受版权保护】【本文受版权保护】的时候props可能不同。这就会导致re【原创内容,转载请注明出处】【原创内容,转载请注明出处】select的记忆功能失效。
【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net解决的办法还是要从记忆功能的原理中去寻找著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】。
未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。每一个计算结果的缓存,与传入fun3的参【本文受版权保护】【关注微信公众号:wwwtangshuangnet】数是一一对应的,fun3可以说是一个pu本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】re function,参数相同的情况下【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。,得到的结果永远相同。有两种解决的想法:
著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【转载请注明来源】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】- 为每一个组件设置单独的映射,这个可以通过未经授权,禁止复制转载。【原创内容,转载请注明出处】react-redux的connect来【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net实现,当mapStateToProps返【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。回的是一个函数时,那么这个函数的运算结果原创内容,盗版必究。【作者:唐霜】仅对组件的当前实例生效,也就是说,在我们【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net写mapStateToProps函数时,【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。不能直接返回映射关系,而是返回一个函数,【作者:唐霜】【未经授权禁止转载】这个函数里面去做一些处理后再返回映射关系转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】。下面有例子。 著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net
- 既然fun3的计算结果是根据参数来缓存的【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】,那么我们可以尝试对参数做hash,固定【原创内容,转载请注明出处】【版权所有,侵权必究】的参数对应固定的fun3函数体,不同的参本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】数对应不同的fun3函数体,当在不同的参原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net数之间切换时,如果发现这个hash有存在【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。的fun3函数体,那么就立即用它的缓存。【版权所有,侵权必究】未经授权,禁止复制转载。下面也有例子。 【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】
想法1的例子:本文版权归作者所有,未经授权不得转载。
本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】const makeMapStateToProps = () => {
const getSelector = makeSelector() // 下一段代码看makeSelector是怎么写的
const mapStateToProps = (state, props) => {
return {
todos: getSelector(state, props)
}
}
return mapStateToProps
}
export default connect(makeMapStateToProps)(MyComponent)
import { createSelector } from 'reselect'
function getSelector(state, props) {
return state[props.id]
}
export function makeSelector() {
return createSelector(
[ getSelector ],
(user) => {
user.total_books = user.books.length
return user
},
)
}
通过结合文章开头的推导代码,你会发现,每著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】个组件的实例的props.id是一定的,未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。因此对应的user也是一定的,那么每次都【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net可以使用缓存起来的user。当然,如果p【转载请注明来源】著作权归作者所有,禁止商业用途转载。rops.id改变来,那么缓存就失效了。
转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net想法2,对makeSelector做深度本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net改造:
著作权归作者所有,禁止商业用途转载。【作者:唐霜】原创内容,盗版必究。【原创内容,转载请注明出处】let selectors = {}
function makeSelector(uid) {
if (selectors[uid]) return selectors[uid]
let selector = createSelector(...)
}
function deleteSelector(uid) {
delete selectors[uid]
}
在connect的时候,直接在makeS著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。elector的时候传入props.id【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。作为标记,mapStateToProps【原创不易,请尊重版权】原创内容,盗版必究。不再返回函数作为结果。当不再对uid对应【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。的用户进行操作之后,要即时删除这个sel【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。ector。
未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。
