Javascript导出一个新的对象实例

Javascript导出一个新的对象实例,javascript,reactjs,Javascript,Reactjs,它似乎是正在导出的同一个实例,因此绑定不起作用。 如何每次导出一个新实例 问题可能是JS如何处理对象与ES6类中的上下文。一个简单的方法是创建一个HOC来包装组件,就像我认为您正在尝试的那样: export utilities = { assignOptions: function(newOption, callback) { //Incorrect 'this' context on second binding this.props.updateOpt

它似乎是正在导出的同一个实例,因此绑定不起作用。
如何每次导出一个新实例

问题可能是JS如何处理对象与ES6类中的上下文。一个简单的方法是创建一个HOC来包装组件,就像我认为您正在尝试的那样:

export utilities = {
    assignOptions: function(newOption, callback) {
        //Incorrect 'this' context on second binding
        this.props.updateOptions((prevOptions) => Object.assign({}, prevOptions, newOption), callback);
    }
};

export const FirstComponent = (WrappedComponent) => class extends React.Component {
    constructor(props) {
        super(props);   

        utilities.assignOptions = utilities.assignOptions.bind(this);
        utilities.assignOptions("test"); //'this' context is FirstComponent
    }
};

export const SecondComponent = (WrappedComponent) => class extends React.Component {
    constructor(props) {
        super(props);   

        utilities.assignOptions = utilities.assignOptions.bind(this);
        utilities.assignOptions("test2"); //'this' context is still FirstComponent instead of SecondComponent
    }
};
功能包装组件(组件包装){
返回类WrappedComponent扩展React.Component{
render(){
返回
}
}
}

这是一个过于简单的示例,但您可以使用尽可能多的逻辑,在每个
WrappedComponent

中插入您想要的任何道具,这是一种处理
实用程序
函数的奇怪方式。你能解释一下这个用例吗?这样传递组件的上下文可能会使调试复杂化。为什么不更“纯粹”,更具陈述性?看起来您几乎在尝试创建一个高阶组件(将某些道具附加到组件上,通常不被接受)。如果是这样的话,我建议看一个实现。@ZekeDroid这些实际上是HOC的,我编辑了代码。当通过
updateOptions()更新父状态时,这两个组件使用相同的语法
所以我真的不想写
对象。在我的代码中分配
100次,并且更愿意使用上面的实用函数来共享公共代码。是的,我试图关注你看到的bug,而不是你攻击这个用例的方式。我认为这与普通对象与ES6类中如何共享上下文有关。我不知道你能像在这里一样使用
这个
。为什么不制作合适的HOC呢?如中所示,组件包装在组件中?@ZekeDroid不知道这意味着我不必编写
this.props.updateOptions((prevOptions)=>Object.assign({},prevOptions,newOption)
,无处不在。你能提供一个例子吗?当然可以。让我添加它作为答案,因为我需要适当的标记。
function wrapComponent(ComponentToWrap) {
  return class WrappedComponent extends React.Component {
    render() {
      return <ComponentToWrap {...this.props}/>
    }
  }
}