我正在使用React,对于具有React经验的人来说,以下代码将更易于理解,但这是一个JavaScript问题。使用新的es2015类语法创建组件(对象)。

在下面的代码中,一旦呈现对象(在DOM内),我就绑定onmousemove处理程序(具体的信息:方法componentDidMount中)。

classSVGParent extends Component{
     ...

     componentDidMount(){
        ....
        this.mainSVGEle.onmousemove = this.throttledMouseMoveHandler();
        // one specific detail for non-react devs : the method above
        // 'componentDidMount' is called only once the component renders.
     }

     // the purpose of below func is to localise & create closure for the
     // actual handler function (which is returned by this method to the
     // 'onmousemove' event listener we appended above).
     throttledMouseMoveHandler(){
        let { svgState,
              ... } = this.props;
        return( function( e ){
          // when this func actually runs, it always returns `false`
          // even when the actual svgState.mousemoveState is `true`
          console.log( svgState.mousemoveState );
        });
        ...
     }


根据上面的代码,在我的代码中,我立即在组件渲染时调用函数throttledMouseMoveHandler。此函数的目的是创建一个闭包,该闭包具有每次后续mousemove调用所需的信息。

我的期望:我期望svgState(我正在'throttledMouseMoveHandler'中进行本地化)将reference保留在道具'svgState'中,并且当调用mousemove时,将从原始obj藏品中检索svgState.mousemoveState的道具值。价值。

我正在经历的是:svgState.mousemoveState永远不会改变。即使当我看到原始对象svgState.mousemoveState是true时,我仍然会得到false作为返回值。这让我感到非常惊讶。

我的问题很抱歉,这是什么原因。当然,状态对象的副本未存储在闭包中,并且连接为live,对吗?

我在下面做了一个简单的例子来说明我的理解。

var aobj = { a : 1 }

var bobj = function(){
 var aref = aobj;
 return( function(){
  console.log( "aref is...", aref.a);
 });
}

var bfunc = bobj();
bfunc(); // returns `aref is... 1`, which is expected

aobj.a = 2

bfunc() // returns `aref is... 2`, which is also expected
        // so clearly the reference to external obj is live

最佳答案

我希望svgState可以引用道具'svgState'


否。svgState保留this.props.svgState在调用throttledMouseMoveHandler时具有的值。 (当然,该值是引用其.mousemoveState属性的对象)


  …,当调用onmousemove时,将从包含该值的原始obj中检索svgState.mousemoveState的prop值。


它是。它将获取对象的.mousemoveState属性的当前值。

但是,如果您说在闭包生成this.props.svgState.mousemoveState时记录true会产生false,则似乎有人确实将.props.svgState属性更改为与闭包不同的对象。

08-19 06:13