首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确回忆录mapDispatchToProps?

问如何正确回忆录mapDispatchToProps?
EN

Stack Overflow用户
提问于 2017-08-03 23:19:20
回答 1查看 1.4K关注 0票数 2

首先,这里是我的专题:

代码语言:javascript
复制
export default function connectField({
         nameProp = 'name',
         valueProp = 'value',
         dispatchProp = 'dispatch'
     }: ConnectOptions) {

    return compose(
        getContext(contextTypes),
        connect((state, ownProps) => {
            const path = [namespace,...getPath(ownProps),...toPath(ownProps[nameProp])];
            const value = getOr('', path, state);
            return {
                [valueProp]: value
            };
        }, (dispatch,ownProps) => { // <----------- mapDispatchToProps
            const path = [...getPath(ownProps),...toPath(ownProps[nameProp])];

            return {
                [dispatchProp]: value => dispatch({type: ActionTypes.Change, payload: {path, value}})
            };

        }, (stateProps, dispatchProps, {[FIELD_PATH]: _, ...ownProps}) => {
            return {...stateProps, ...dispatchProps, ...ownProps}; 
        }, {
            areMergedPropsEqual: (a,b) => {
                let eq = shallowEqual(a,b);
                console.log('areMergedPropsEqual',a,b,eq);
                return eq;
            },
        }),
        withContext(contextTypes, props => {
            return {[FIELD_PATH]: [...getPath(props), props[nameProp]]};
        }),
    );
}

中间是我的mapDispatchToProps。这导致areMergedPropsEqual每次都返回false,因为它每次都会创建一个新的动作创建者。

我想不出如何回忆录这一点:

代码语言:javascript
复制
value => dispatch({type: ActionTypes.Change, payload: {path, value}})

这样我每次都会得到相同的函数实例。

有一些关于“每个实例回忆录”的笔记,这是我想要的,但我不能完全理解我在这里应该做的事情。

要说清楚,我知道如何回忆录一个函数。但是,我不希望使用具有无限历史的大缓存。这是不必要的内存消耗。我只需要1的缓存大小,就像如何重新选择?一样。问题是我不能直接在connectField内部创建“选择器”,因为它仍然创建一个共享实例--也就是说,所有“连接字段”都将共享相同的缓存,它们将覆盖彼此,从而抵消好处。它必须是每个组件实例。这是特定于React Redux的connect方法。它有一个语法,这样您就可以在正确的位置创建选择器,并且每个实例只能运行它一次。我只是很难破解API --他们期望一个函数返回一个返回对象的函数吗?还是以名字作为键和函数作为值的对象?这个函数会返回什么?也就是说,docs不清楚mapDispatchToProps选项所接受的所有不同变体。

EN

回答 1

Stack Overflow用户

发布于 2017-08-04 08:50:52

如果您已经拥有lodash,那么您有一个允许将任何函数转换为回忆录函数的memoize函数。这个回传函数将计算给定参数的返回值,然后总是返回相同的返回值,每次提供相同的参数。

例如,您可以这样使用它:

代码语言:javascript
复制
import { memoize } from 'lodash'

const makeChangeDispatcher = memoize( (dispatch, path) => 
     value => dispatch({type: ActionTypes.Change, payload: {path, value}})
)

...

    (dispatch,ownProps) => { // <----------- mapDispatchToProps
        const path = [...getPath(ownProps),...toPath(ownProps[nameProp])];

        return {
            [dispatchProp]: makeChangeDispatcher(dispatch, path)
        };

    }

...

您可以在回忆录文件上看到更多的信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45496003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档