Javascript 定义函数在react redux中工作异常

Javascript 定义函数在react redux中工作异常,javascript,reactjs,redux,Javascript,Reactjs,Redux,我现在正在学习react redux。 有一种奇怪的情况,花了我一整天的时间。 这是许多教程中常用的方法。 但它在我的代码中不起作用。 详细地说,没有将事件传递给道具 const VisibleFilterList = connect(mapStateToProps, mapDispatchToProps)(FilterList); const mapDispatchToProps = (dispatch) => { return { updateFilter

我现在正在学习react redux。 有一种奇怪的情况,花了我一整天的时间。

这是许多教程中常用的方法。 但它在我的代码中不起作用。
详细地说,没有将事件传递给道具

const VisibleFilterList = connect(mapStateToProps, mapDispatchToProps)(FilterList);

const mapDispatchToProps = (dispatch) => {
    return {
        updateFilter : (ev) => dispatch(setFilter(ev.target.value))
    }
};

在深入研究这个问题之后,我将箭头函数改为普通函数。那就行了

const VisibleFilterList = connect(mapStateToProps, mapDispatchToProps2)(FilterList);

function mapDispatchToProps2(dispatch) {
    return {
        updateFilter : (ev) => dispatch(setFilter(ev.target.value))
    }
}


甚至函数也有相同的返回方法。我想知道为什么箭头函数不起作用。在许多教程中,使用箭头函数看起来更常见。帮助我。

将箭头功能更改为

mapDispatchToProps = (dispatch) => {
    return {
        updateFilter : (ev) => dispatch(setFilter(ev.target.value))
    }
};
此答案基于您共享的可见代码,如果您显示更多代码,我可能需要更新此答案


无论如何,要习惯使用箭头函数,因为它是未来。

因为
变量
声明不会提升,但
函数
声明会提升。下面的代码
mapDispatchToProps
未定义,因为在
connect()之前未声明变量
mapDispatchToProps
调用。除了
函数
提升外,
import
指令也进行提升声明。变量声明关键字很奇怪,如果您想知道,请参阅变量声明部分

更改申报顺序 试验 变量声明
你需要解释为什么OP有他们的问题,以及你改变了什么来解决它(假设它确实解决了问题,但很可能没有)。这是一个很好的观点,我一定会记住这一点,以备将来的答案,谢谢你让我注意到这一点!
const
声明被“挂起”,mapDispatchToProps被初始化为未定义,但箭头函数的赋值没有被定义,否则OP将得到一个引用错误;-)哦,顺便说一句,发现得很好。我会测试它,如果有,我会更新我的答案。thanks@RobG我已经更新了我的答案,如果我有什么问题,请告诉我。非常感谢你的友好回答。我现在完全明白了:)
const mapDispatchToProps = (dispatch) => {
   return {
    updateFilter : (ev) => dispatch(setFilter(ev.target.value))
   }
};
const VisibleFilterList = connect(mapStateToProps, mapDispatchToProps)(FilterList);
describe('decalration lifting up', () => {

    test('constants not lifting up', () => {
        const foo = bar;
        const bar = () => {};

        var fuzz = buzz;
        const buzz = 'buzz';

        expect(foo).toBeUndefined();
        expect(fuzz).toBeUndefined();//not 'buzz'
    });

    test('variable not lifting up', () => {
        let foo = bar;
        let bar = () => {};

        expect(foo).toBeUndefined();
    });

    test('function lifting up', () => {
        let foo = bar;

        function bar() {};

        expect(foo).toEqual(expect.any(Function));
    });
});
//I think these variable declarations,first allocate fuzz & buzz memory
//,then execute assignment.so const fuzz=buzz can works
//,because buzz be found in memory
const fuzz = buzz;//undefined
const buzz = 'buzz';

//in this case,buzz has not allocate memory,so it can't be found by assignment.
const fuzz = buzz;//throws an exception: fuzz is not defined