Alt 通量操作:即使调用 this.generateActions,_this.actions 也未定义

Posted

技术标签:

【中文标题】Alt 通量操作:即使调用 this.generateActions,_this.actions 也未定义【英文标题】:Alt flux action: _this.actions is undefined even when this.generateActions is called 【发布时间】:2016-08-08 08:30:35 【问题描述】:

我在我的 React/Flux 项目中使用 Alt 库来表示 Flux 部分,并且我得到了动作创建者。

我创建了以下操作:

// alt.js
import Alt from 'alt';

export default new Alt();

// UserActions.js
import alt from '../alt';

class UserActions 
    constructor() 
        this.generateActions(
            'getUsersSuccess',
            'getUsersFailed'
        );
    

    getUsers(userId) 
        $.ajax( url: '/api/users/'+userId )
        .done((data) => 
            this.actions.getUsersSuccess(data);
        )
        .fail((jqXhr) => 
            this.actions.getUsersFailed(jqXhr);
        );
    


export default alt.createActions(UserActions);

问题是动作,this.actions,是未定义的。我是否理解正确,this.generateActions 函数应该填充 UserActions 类的 actions 属性,还是我需要编写其他内容才能使操作可用?

我相信,使用 ES6,匿名函数中的 this 应该正确地绑定到 UserActions 类的 this

【问题讨论】:

【参考方案1】:

我不知道 Alt 的实现最近是否发生了变化,但我必须手动使用 dispatch 编写动作代码,以使其正常工作,并直接调用这些函数,而不是尝试使用 @987654321 访问它们@属性。

这是我得到的代码,它可以成功加载以存储和映射动作应该被映射的方式。

import alt from '../alt';

class UserActions
    getUsers(userId) 
        $.ajax(url: 'api/users/'+userId)
            .done((data) => 
                this.getUsersSuccess(data);
            )
            .fail((jqHxr) => 
                this.getUsersFail(jqHxr);
            );
        return false;
    

    getUsersSuccess(data) 
        return (dispatch) => 
            dispatch(data);
        
    

    getUsersFail(jqHxr) 
        return (dispatch) => 
            dispatch(jqHxr);
        
    


export default alt.createActions(UserActions);

使用这种方法,构造函数中的generateActions 调用不仅没有必要,而且需要避免,否则使用该动作创建器的商店将不知道您要使用哪个动作。

我还在 getUsers 函数的末尾添加了 return false 以抑制 alt 引发的控制台警告(函数未调度时必须返回 false)。

此处调度的操作,getUsersSuccessgetUsersFail,应该在存储中具有消耗参数并影响状态的对应物。

【讨论】:

感谢分享您的解决方案,我遇到了同样的问题【参考方案2】:

没有必要再使用action了,试试吧:

// alt.js
import Alt from 'alt';
export default new Alt();

// UserActions.js
import alt from '../alt';

class UserActions 
    constructor() 
        this.generateActions(
            'getUsersSuccess','getUsersFailed'
        );
    

    getUsers(userId) 
        $.ajax( url: '/api/users/'+userId )
        .done((data) => 
            this.getUsersSuccess(data);
        )
        .fail((jqXhr) => 
            this.getUsersFailed(jqXhr);
        );
    

export default alt.createActions(UserActions);

【讨论】:

以上是关于Alt 通量操作:即使调用 this.generateActions,_this.actions 也未定义的主要内容,如果未能解决你的问题,请参考以下文章

通量/反应:如何处理商店中过滤的 api 数据

处理 Reactor 中的平行通量

关于通量约定,为啥每个操作只有一个文件?

java - 如何在Java响应式中为通量/单声道调用多个服务?

通量操作可以访问存储吗?

同构 JS - 仅限 httpRequest 客户端