我正在使用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
属性更改为与闭包不同的对象。