我遇到一个与绑定有关的奇怪问题
我读过: Bind MDN
无数个SO问题,每个人似乎都忘记了bind 返回绑定函数
这里不是这种情况。
我导出以下对象
const ErrorStore = {
clearError : () => {
this.setState({
// removed for demo purpose
});
}
};
export default ErrorStore;
然后我像这样导入该对象:
import error from 'ErrorStore';
class AppStoreProvider extends Component {
componentDidMount() {
console.log(this); // AppStoreProvider
const test = error.clearError.bind(this);
test(); // error , cannot read property 'setState' of undefined
}
}
在调用test
时,此代码引发错误,似乎bind
没有将AppStoreProvider
绑定到clearError
函数。
我展示的这个例子是实际实现的一个非常愚蠢的版本。 但是,它仍然会引发错误
该实现使用以下功能从导入的商店对象创建新对象,但其功能绑定到AppStoreProvider
:
bindStore(store) {
return Object.assign({}, ...Object.keys(store)
.map(key => (typeof store[key] === 'function' ?
{ [key] : store[key].bind(this) } :
{ [key] : store[key] })));
}
bind
是否可以跨这样的文件工作?
为什么this
未定义
发布此问题后,我意识到该函数在定义为命名函数时已正确绑定。
export function clearError(){
this.setState({
error : undefined,
isError : false
});
}
答案 0 :(得分:2)
您不能绑定箭头函数,因为它们的上下文始终是按词法确定的(它们在其中声明的上下文不能更改)。而是使用动态确定其上下文的常规函数:
const ErrorStore = {
clearError() { // <<<
this.setState({
// removed for demo purpose
});
}
};